Я строю приложение командной строки, и мне нужно сохранить некоторые временные данные в файлы. Я не знаю, где соглашение о том, чтобы приложения хранили свой кеш на Unix-системах (в данном случае Ubuntu 12.0.4)?
1 ответ
"Системы на основе Unix" - это слишком общая категория, чтобы делать какие-либо общеприменимые определения, применимые ко всем системам на основе Unix. Проблема в том, что структура файловой системы (и "правильное" / "обычное" место для размещения вещей) настолько сильно различается между разными разновидностями "Unix" (если вы можете даже назвать это так), что вам в значительной степени придется справиться с этим на индивидуальной основе.
Несколько примеров:
- В Ubuntu 64-битные библиотеки находятся в /usr /lib или /usr /lib /x86_64-linux /, а 32-битные библиотеки - в /usr /lib32
- В Fedora 64-битные библиотеки находятся в /usr /lib64, а 32-битные библиотеки - в /usr /lib
- В Fedora больше нет понятия /lib или /bin (это просто символические ссылки в эквивалентные каталоги /usr)
- Большинство дистрибутивов Linux предпочитают устанавливать установленное пользователем программное обеспечение (то есть программное обеспечение, не предоставляемое менеджером пакетов) в /usr /local / (с lib, bin, etc, var и т.д. В /usr /local /)
- Многие дистрибутивы Linux используют / var / cache для кеша, хотя, если он "временный" (не имеет значения, теряется ли он), его можно сохранить в / tmp
- Некоторые приложения типа "приложение в папке" хранят все в подкаталоге / opt (особенно установщики clickwrap)
- Некоторые приложения просто устанавливаются в подкаталог каталога пользователя ~ (обычно это / home / username)
- В Solaris я видел, что / srv используется аналогично / opt, а иногда / srv - это www-root
Ответ заключается в том, что каноническое, социально приемлемое, хорошо интегрированное соглашение о том, где хранить что-либо в любой операционной системе, будь то дистрибутив Linux, BSD, Solaris, HP-UX и т.д., Зависит от конкретных обстоятельств. В частности:
- Как распределяется пакет?
- Требуется ли пользователю root-доступ для его установки?
- Зависит ли пакет или напрямую интегрируется с другими пакетами, уже имеющимися в системе, например, с плагином или надстройкой?
- Будет ли пакет интегрирован в исходные репозитории дистрибутива, чтобы пользователи могли использовать такую команду, как
apt-get
илиyum
чтобы установить его напрямую, не загружая установщик с веб-сайта? - Будет ли программное обеспечение иметь отдельную конфигурацию для каждого отдельного пользователя, который управляет компьютером?
- Будут ли в программном обеспечении глобальные параметры конфигурации, которые должен изменять только администратор (root)?
- Должно ли программное обеспечение интегрироваться с системой init (например, для запуска при загрузке)?
На это нет однозначного ответа без учета всех факторов. Однако, в частности, для Ubuntu 12.04, если вы собираете свой пакет в файл .deb
для распространения в PPA или для отправки в собственные репозитории пакетов Ubuntu (main
или universe
), я бы порекомендовал хранить кеш в /var/cache
. Но это только для Ubuntu, и вы, конечно, не должны применять предположение, что все дистрибутивы или ОС на базе Unix сочтут это приемлемым.
Кроме того, если нет никаких преимуществ в сохранении данных кэша при загрузке системы, я думаю, что они также могут быть в /tmp.
Обратите внимание, что вы столкнетесь с этими проблемами соглашения о путях для каждого типа файлов, которые использует ваша программа: общие данные, исполняемые файлы, библиотеки, файлы справки, изображения, звук, веб-страницы и так далее. Поэтому мне интересно, если вы спрашиваете о файлах кэша, как вы планируете обрабатывать файлы других типов. Вы просто делаете наивные предположения и надеетесь, что никто с вами не согласится? Если вы не читали никаких документов или стандартов по Ubuntu, в которых предлагалось бы их разместить, плохая идея просто предполагать одно или другое. Например, всегда вставлять библиотеки в /usr /lib может быть ошибкой, так как в зависимости от ситуации они могут находиться в другом месте.
Кроме того, как разработчик программного обеспечения, я думаю, что самое ответственное, что нужно сделать, это позволить конечному пользователю решить, куда поместить свои файлы. Вы можете установить значения по умолчанию, но пользователи (и распространители) могут и будут настраивать сборку в соответствии со своим дистрибутивом.
Самый простой способ сделать это - собрать свою программу с помощью GNU Autoconf. Autoconf - это система сборки, где пользователь может передавать аргументы командной строки в скрипт сборки, чтобы изменить пути различных "типов каталогов" по умолчанию. Почти в каждом дистрибутиве есть скрипт сборки для каждого пакета Autoconf, который устанавливает дистрибутивные обычные каталоги для каждого типа. Они даже специально имеют тип каталога для кеша: sharedstatedir.