Мы больше не контролируем свои домашние каталоги.
В моём собственном 25 обычных файлов и 144 скрытых. В дотфайлах хранятся данные, которые не принадлежат мне: они принадлежат программистам, чьи программы решили захватить моё пространство, предназначенное для хранения моих личных файлов.
Я не могу убрать эти файлы в другое место. Если я попытаюсь их удалить, они появятся снова. Всё, что я могу сделать — это сидеть и знать, что в темноте, за кулисами, они есть. Ожидание в тишине. Некоторые из этих программистов решили дополнительно разместить здесь несколько обычных файлов и каталогов. Они хорошо видны каждый раз, когда я выполняю ls
. Понятия не имею, как в мою личную папку попали каталог node_modules
, файлы package-lock.json
, yarn.lock
(я никогда сознательно даже не ставил yarn
!), какие-то два странных лог-файла от какой-то Java-программы, явно использующей СУБД H2, и папка Desktop
. Последнюю создал Steam, что довольно неудачно, поскольку на моей машине просто нет рабочего стола или какого-то десктопа. Боюсь того дня, когда услышу громкий стук в дверь — и один из этих программистов ворвётся и сообщит, что собирается хранить часть своей мебели посреди моей гостиной, если я не возражаю.
Для тех из вас, кто это читает: умоляю вас. Не создавайте файлы или папки любого типа в пользовательском каталоге $HOME
, чтобы хранить свои конфиги или данные. Такая практика по меньшей мере странная, и пришло время её прекратить. Мне жаль говорить, что многие, если не большинство программ виновны в этом, в то время как есть значительно лучшие места для хранения данных каждого пользователя.
Даже если мы никогда не сможем решить эту проблему — из-за исторического наследия, обратной совместимости, старых версий софта или программистов-злодеев, хранящих файлы, где хотят, просто из вредности — мы можем хоть попытаться следовать вменяемым практикам. Хотя концептуальную ошибку внедрения «скрытых» файлов уже не отменить, можем хотя бы смягчить её последствия.
Эта конкретная проблема замечена и давно решена с созданием Спецификации на расположение базовых каталогов (XDG). Она определяет набор переменных среды, указывающих программам на каталог, в котором должны храниться данные или конфигурация. Эти переменные устанавливает пользователь, так что если они не заданы, программа должна по умолчанию использовать каталог, определённый стандартом, а не домашний каталог пользователя.
Переменные среды пользователя
$XDG_DATA_HOME
$XDG_DATA_HOME
определяет базовый каталог, в котором должны храниться файлы данных пользователя. Если$XDG_DATA_HOME
не определена или содержит пустое значение, то по умолчанию должно использоваться значение равное$HOME/.local/share
.
Пример использования: хранение плагинов, загруженных пользователем, баз данных, созданных программой, истории ввода, закладок, электронных писем и так далее.
$XDG_CONFIG_HOME
$XDG_CONFIG_HOME
определяет базовый каталог, в котором должны храниться конфигурационные файлы пользователя. Если$XDG_CONFIG_HOME
не определена или содержит пустое значение, то по умолчанию должно использоваться значение равное$HOME/.config
.
Этот каталог следует использовать для хранения пользовательских файлов конфигурации программы. При первом выполнении программы, вероятно, разумно создать файл с разумными значениями по умолчанию.
$XDG_CACHE_HOME
$XDG_CACHE_HOME
определяет базовый каталог, в котором должны храниться несущественные (кэшированные) данные пользователя. Если$XDG_CACHE_HOME
не определена или содержит пустое значение, то по умолчанию должно использоваться значение равное$HOME/.cache
.
Пример: кэширование картинок предпросмотра из файл-менеджера, песен, которые пользователь часто слушает через стриминговый сервис, и так далее. Программа должна продолжать функционировать без каких-то проблем, если этот каталог будет удалён пользователем. Убедитесь, что ненужные файлы правильно удалены. Помните, что превышение вашими файлами разумного объёма дискового пространства, скорее всего, расстроит пользователя, который быстро вычислит виновника в лице вашей программы.
$XDG_RUNTIME_DIR
$XDG_RUNTIME_DIR
определяет каталог, в котором должны храниться несущественные файлы среды выполнения и другие объекты (например, сокеты, именованные каналы...).
Спецификация перечисляет ряд требований для этого каталога. Указано, что его следует использовать для хранения сокетов и других файлов, которые используются в коммуникациях.
Системные переменные
$XDG_CONFIG_DIRS
$XDG_CONFIG_DIRS
определяет порядок предпочтений для базовых каталогов, в которых будет произведён поиск конфигурационных файлов, в дополнение к$XDG_CONFIG_HOME
. Каталоги в переменной$XDG_CONFIG_DIRS
должны быть разделены двоеточием.Если
$XDG_CONFIG_DIRS
не определена или содержит пустое значение, то по умолчанию должно использоваться значение равное/etc/xdg
.
Этот каталог следует использовать для файлов конфигурации системного уровня. Эту конфигурацию могут переопределить пользовательские файлы конфигурации. Скорее всего, этот каталог используется в процессе установки.
$XDG_DATA_DIRS
$XDG_DATA_DIRS
определяет порядок предпочтений для базовых каталогов, в которых будет произведен поиск файлов с данными, в дополнение к$XDG_DATA_HOME
. Каталоги в переменной$XDG_DATA_DIRS
должны быть разделены двоеточием.Если
$XDG_DATA_DIRS
не определена или содержит пустое значение, то по умолчанию должно использоваться значение равное/usr/local/share/:/usr/share/
.
Пример: сохранение плагинов или тем, которые используются всеми пользователями. Скорее всего, этот каталог используется в процессе установки.
Как это работает на практике?
Использовать стандарт очень просто. Прочитайте соответствующую переменную, а если она отсутствует, то используйте дефолтные пути, определённые стандартом. Там создайте каталог для программы и храните свои данные.
Например, файлы конфигурации храните в каталоге $XDG_CONFIG_HOME/your-program
, а не просто в $XDG_CONFIG_HOME
. И никогда не прописывайте в программе путь по умолчанию из стандарта, а сначала прочитайте переменную среды, чтобы дать возможность пользователю определить эти каталоги, если ему необходимо.
Вы можете легко перенести существующие программы на использование этого стандарта. Для этого при создании новых файлов начните использовать стандарт, но продолжайте проверять старое расположение файлов при их чтении. Это позволит выполнить миграцию, не нарушая работу программы для пользователей с файлами конфигурации или данными, созданными предыдущей версией программы.
Прочитайте стандарт, чтобы узнать больше и взглянуть на иерархию каталогов, которая почти наверняка уже присутствует в вашем домашнем каталоге. В реальности для вашего языка программирования доступна кросс-платформенная библиотека, позволяющая определить каталог для хранения ваших данных. В Linux и подобных системах эта библиотека наверняка будет использовать Спецификацию на расположение базовых каталогов.
Автор: m1rko