Управление конфигурационными файлами 2016

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

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

git clone https://github.com/glushchenko/dotfiles.git ~/.dotfiles  
cd ~/.dotfiles && ./bootstrap.sh

После чего все конфиги из репозитория, сохранялись в ~/.dotfiles и линковались в домашний каталог (~/).

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

За время использования данного подхода было выявлено несколько недостатков:

  • На linux машинах разворачивался мусор (например ненужные конфиги для macOS, хранящиеся в этом же репозитории). Они не мешают конечно, но глаз постоянно за них цепляется.

  • Загрузку и установку зависимостей, например zsh, нужно делать отдельно, после чего руками переключаться на zsh.

Решение

Поведение скрипта bootstrap.sh полностью сохранено, добавлены две важные для меня фичи:

1) Линковка определенных сетов конфигурационных файлов (мои конфиги .dotfiles/bundle), в зависимости от необходимого окружения.

Теперь у меня на mac запуск bootstrap.sh происходит так:

./bootstrap.sh macOS

# или путь к бандлу

./bootstrap.sh bundle/macOS

А так выглядит конфиг бандла ~/.dotfiles/bundle/macOS:

.gitconfig  
.microrc  
.vim  
.vimrc  
.tmux.conf  
.tmux.macOS.conf  
.zsh  
.zshrc  

В данном примере будут прилинкованы только перечисленные файлы.

2) Написание собственных скриптов, которые бы запускались перед линковкой. Мне это нужно для предустановки самих программ, перед линковкой конфигов к ним. Например запускаем линковку бандла macOS:

./bootstrap.sh bundle/macOS

Далее происходит проверка, на существование исполняемого скрипта bundle/macOS.sh, и если он существует, то bootstrap.sh его исполняет.

Например я написал себе bundle/macOS.sh для сета macOS, который проверяет установлен ли brew, и если нет, то устанавливает его и зависимости:

#!/usr/bin/env bash

# install brew if not exist
if [ ! -f $(which brew) ]
then
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    # update packages
    brew update

    # install packages
    brew install tmux
    brew install reattach-to-user-namespace
    brew install minidlna
    brew install vim
    brew install dnsmasq
fi 

Или базовая настройка linux (debian based) машины — bundle/linux.sh:

#!/bin/bash

sudo apt-get update
sudo apt-get install -y tmux vim zsh

chsh -s $(which zsh)

Устанавливает tmux, vim и zsh, переключает терминал по умолчанию на zsh.

⭐️ Примеры в репозитории на GitHub


CLI
comments powered by Disqus