Как управлять dotfiles

.
Время чтения — 4 мин.
#linux #dotfiles

Большинство приложений для Linux хранят свою конфигурацию в текстовых файлах. Часть из них хранят файлы в домашнем каталоге пользователя. Такого рода файлы обычно называют "dotfiles".

Многие пользователи хранят их в git, потому что это очень удобно. Можно найти более 150 тысяч примеров на Github.

Проблемы с dotfiles

Несмотря на простоту текстовых файлов, их использование требует определённого подхода в организации. Примеры таких проблем:

Организационные подходы

Если вы разработчик, то работа с dotfiles, хранение и усовершенствование, для вас самый долгий проект из всех над которыми вы работали. В связи с этим имеет смысл организовать свой проект дисциплинированно, для удобства сопровождения и расширяемости.

Далее — один из подходов.

Система контроля версий

Имеет смысл хранить ваши конфигурационные файлы в системе контроля версий (Version Control System — VCS) и вот почему:

Для dotfiles лучше выделить отдельный каталог — .dotfiles в корне домашней директории. Хранить в системе контроля версий домашний каталог не рекомендуется, т. к. усложнит поддержку dotfiles, а также команда типа git clean может удалить все файлы, и даже те, которые не входят в состав репозитория.

В качестве системы контроля версий подойдёт любая: git, mercurial, svn и т. д. Я использую git.

Несмотря на удобство систем контроля версий, не рекомендуется копировать один в один чужие dotfiles, без понимания того, для чего сделаны те или иные настройки. Dotfiles должны быть написаны под вас, чужие — могут служить источником знаний или вдохновения.

С чего начать

Создадим каталог и репозитарий:

mkdir ~/.dotfiles && cd ~/.dotfiles
git init

Создадим на Github отдельный репозиторий dotfiles. Копируем ссылку и добавляем к локальному:

git remote add origin git@github.com:your-user/dotfiles.git

Для примера добавим конфигурацию vim в наши dotfiles.

mkdir -p ~/.dotfiles/vim/plugins
cp ~/.vimrc ~/.dotfiles/vim

Добавим в git и запушим изменения на GitHub:

git checkout main
git add *
git commit -a -m "[+] add .vimrc"
git push

Здесь стоит отметить, что я использую ветку main вместо master, т. к. так заведено на GitHub.

Установка dotfiles

Продолжаем пример с .vimrc-файлом. Удалим текущий и создадим ссылку на тот что хранится в dotfiles:

rm -f ~/.vimrc
ln -s ~/.dotfiles/vim/.vimrc ~/.vimrc

Когда ваш репозиторий будет наполнен файлами, имеет смысл написать скрипт, который будет создавать правильные ссылки в домашнем каталоге.

Зависимости и плагины

Помимо файлов конфигурации для приложений в dotfiles можно хранить удобные скрипты и плагины. Нет смысла добавлять плагины в виде файлов в наш репозиторий, но имеет смысл добавить их в виде суб-модулей.

Я использую плагин NERDTree для vim. Добавим репозиторий проекта в виде суб-модуля:

git submodule add https://github.com/preservim/nerdtree vim/plugins/nerdtree

Установка зависимостей и плагинов

Установка и обновление до последних версий:

git submodule update --init --recursive
git submodule update --init --remote

Создаём ссылку (symlink) на каталог с плагинами:

ln -s ~/.dotfiles/vim/plugins ~/.vim/plugged

Каталог ~/vim/plugged может отличаться от вашего, я использую рекомендованный от vim-plug.

Специфичные локальные настройки

При использовании dotfiles на множестве машин большая часть конфигурации будет одна и та же. Но возможны небольшие различия.

Например, на одной машине вам нужна поддержка Rust для Vim, а на всех остальных — нет. Также могут отличаться набор закладок для nnn.

Для хранения различий можно использовать разные ветви в git, но это очень быстро превратится в хаос.

Один из подходов — иметь главный репозиторий для dotfiles, с файлами, которые подходят для всех машин, а также отдельный репозиторий dotfiles_local для персональных настроек под каждую машину.

В репозитории dotfiles_local каждая ветвь именуется именем машины. Например, home-pc, work-pc.

Как подгружать специфичные настройки

Для bash добавляем в ~/.bashrc:

if [ -f ~/.bashrc_local ]; then
    source ~/.bashrc_local
fi

Для git добавляем в ~/.gitconfig:

[include]
	path = ~/.gitconfig_local

Для Vim, добавляем в файл .vimrc:

let $LOCALFILE=expand("~/.vimrc_local")
if filereadable($LOCALFILE)
    source $LOCALFILE
endif

Специальные скрипты

Если у вас есть какие-то скрипты, которые вы используете в своей работе, их тоже можно добавить в dotfiles. Например, в каталог .dotfiles/bin.

Затем в .bashrc добавляем их в переменную PATH:

export PATH=~/.dotfiles/bin:${PATH}