Управление файлами конфигурации. Домашний каталог. Chezmoi
Использование chezmoi
для управления файлами конфигурации домашнего каталога пользователя.
Содержание
1 Общая информация
- Сайт: https://www.chezmoi.io/
- Репозиторий: https://github.com/twpayne/chezmoi
2 Установка
- Установка бинарного файла. Скрипт определяет архитектуру процессора и операционную систему и скачивает необходимый файл:
- Linux
- Gentoo
- overlay ace (https://github.com/ananace/overlay):
1emerge chezmoi-bin
- overlay ace (https://github.com/ananace/overlay):
- Fedora
- Установка через Snap:
- Gentoo
- Windows
- установка посредством Chocolatey (см. Пакетный менеджер для Windows. Chocolatey):
1choco install chezmoi
- установка посредством Chocolatey (см. Пакетный менеджер для Windows. Chocolatey):
3 Конфигурация chezmoi
3.1 Рабочие файлы
- Состояние файлов конфигурации сохраняется в каталоге
1~/.local/share/chezmoi
- Он является клоном вашего репозитория
dotfiles
. - Файл конфигурации
~/.config/chezmoi/chezmoi.toml
(можно использовать также JSON или YAML) специфичен для локальной машины. - Файлы, содержимое которых одинаково на всех ваших машинах, дословно копируются из исходного каталога.
- Файлы, которые варьируются от машины к машине, выполняются как шаблоны, обычно с использованием данных из файла конфигурации локальной машины для настройки конечного содержимого, специфичного для локальной машины.
- При запускевычисляется желаемое содержимое и разрешения для каждого файла, а затем вносит необходимые изменения, чтобы ваши файлы соответствовали этому состоянию.
1chezmoi apply
- По умолчанию chezmoi изменяет файлы только в рабочей копии.
3.2 Автоматически создавать файл конфигурации на новой машине
При выполнении
chezmoi init
также может автоматически создать файл конфигурации, если он еще не существует.Если ваш репозиторий содержит файл с именем
.chezmoi.$FORMAT.tmpl
, где$FORMAT
есть один из поддерживаемых форматов файла конфигурации (json
,toml
, илиyaml
), тоchezmoi init
выполнит этот шаблон для создания исходного файла конфигурации.Например, пусть
~/.local/share/chezmoi/.chezmoi.toml.tmpl
выглядит так:1{{- $email := promptStringOnce . "email" "Email address" -}} 2 3[data] 4 email = {{ $email | quote }}
- При выполнении
chezmoi init
будет создан конфигурационный файл~/.config/chezmoi/chezmoi.toml
. promptStringOnce
— это специальная функция, которая запрашивает у пользователя значение, если оно еще не установлено в разделеdata
конфигурационного файла.
- При выполнении
Чтобы протестировать этот шаблон, используйте
chezmoi execute-template
с флагами--init
и--promptString
, например:1chezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl
3.3 Пересоздание файл конфигурации
- Если вы измените шаблон файла конфигурации,
chezmoi
предупредит вас, если ваш текущий файл конфигурации не был сгенерирован из этого шаблона. - Вы можете повторно сгенерировать файл конфигурации, запустив:
1chezmoi init
4 Шаблоны
4.1 Общая информация
- Шаблоны используются для изменения содержимого файла в зависимости от среды.
- Используется синтаксис шаблонов Go.
- Файл интерпретируется как шаблон, если выполняется одно из следующих условий:
- имя файла имеет суффикс
.tmpl
; - файл находится в каталоге
.chezmoitemplates
.
- имя файла имеет суффикс
4.2 Данные шаблона
- Полный список переменных шаблона:
1chezmoi data
- Источники переменных:
- файлы
.chezmoi
, например,.chezmoi.os
; - файлы конфигурации
.chezmoidata.$FORMAT
. Форматы (json
,jsonc
,toml
,yaml
) читаются в алфавитном порядке; - раздел
data
конфигурационного файла.
- файлы
4.3 Способы создания файла шаблона
- При первом добавлении файла передайте аргумент
--template
:1chezmoi add --template ~/.zshrc
- Если файл уже контролируется chezmoi, но не является шаблоном, можно сделать его шаблоном:
1chezmoi chattr +template ~/.zshrc
- Можно создать шаблон вручную в исходном каталоге, присвоив ему расширение
.tmpl
: - Шаблоны в каталоге
.chezmoitemplates
должны создаваться вручную:
4.4 Редактирование файла шаблона
- Используйте
chezmoi edit
:1chezmoi edit ~/.zshrc
- Чтобы сделанные вами изменения сразу же применялись после выхода из редактора, используйте опцию
--apply
:1chezmoi edit --apply ~/.zshrc
4.5 Тестирование шаблонов
- Тестирование с помощью команды
chezmoi execute-template
. - Тестирование небольших фрагментов шаблонов:
1chezmoi execute-template '{{ .chezmoi.hostname }}'
- Тестирование целых файлов:
4.6 Синтаксис шаблона
- Действия шаблона записываются внутри двойных фигурных скобок,
{{ }}
. - Действия могут быть переменными, конвейерами или операторами управления.
- Текст вне действий копируется буквально.
- Переменные записываются буквально:
1{{ .chezmoi.hostname }}
- Условные выражения могут быть записаны с использованием
if
,else if
,else
,end
:
1{{ if eq .chezmoi.os "darwin" }}
2# darwin
3{{ else if eq .chezmoi.os "linux" }}
4# linux
5{{ else }}
6# other operating system
7{{ end }}
4.6.1 Удаление пробелов
- Для удаления проблем в шаблоне разместите знак минус и пробела рядом со скобками:
1HOSTNAME={{- .chezmoi.hostname }}
- В результате получим:
1HOSTNAME=myhostname
4.6.2 Отладка шаблона
- Используется подкоманда
execute-template
:1chezmoi execute-template '{{ .chezmoi.os }}/{{ .chezmoi.arch }}'
- Интерпретируются любые данные, поступающие со стандартного ввода или в конце команды.
- Можно передать содержимое файла этой команде:
1cat foo.txt | chezmoi execute-template
4.6.3 Логические операции
- Возможно выполнение логических операций.
- Если имя хоста машины равно
work-laptop
, текст междуif
иend
будет включён в результат:
Логические функции
eq
: возвращаетtrue
, если первый аргумент равен любому из остальных аргументов, может принимать несколько аргументов;not
: возвращает логическое отрицание своего единственного аргумента;and
: возвращает логическое И своих аргументов, может принимать несколько аргументов;or
: возвращает логическое ИЛИ своих аргументов, может принимать несколько аргументов.
Целочисленные функции
len
: возвращает целочисленную длину своего аргумента;eq
: возвращает логическую истинуarg1 == arg2
;ne
: возвращает логическое значениеarg1 != arg2
;lt
: возвращает логическую истинуarg1 < arg2
;le
: возвращает логическую истинуarg1 <= arg2
;gt
: возвращает логическую истинуarg1 > arg2
;ge
: возвращает логическую истинуarg1 >= arg2
.
4.7 Переменные шаблона
- Чтобы просмотреть переменные, доступные в вашей системе, выполните:
1chezmoi data
- Чтобы получить доступ к переменной
chezmoi.kernel.osrelease
в шаблоне, используйте:1{{ .chezmoi.kernel.osrelease }}
5 Использование chezmoi
5.1 Первоначальная настройка на первичном хосте
- Инициализируйте
chezmoi
командой:1chezmoi init
- Это создаст новый локальный репозиторий git в
~/.local/share/chezmoi
. - Добавьте в репозиторий первый файл с помощью
chezmoi
:1chezmoi add ~/.bashrc
- Команда скопирует
~/.bashrc
в~/.local/share/chezmoi/dot_bashrc
. - Можно отредактировать файл:
1chezmoi edit ~/.bashrc
- Откроется
~/.local/share/chezmoi/dot_bashrc
в редакторе, заданном переменной$EDITOR
. - Внесите некоторые изменения и сохраните файл.
- Посмотрите, какие изменения внес бы
chezmoi
:1chezmoi diff
- Примените изменения:
1chezmoi -v apply
- Все команды
chezmoi
принимают флаг-v
(подробная информация) и флаг-n
(пробный запуск, демонстрирующий, но не вносящий изменения).
5.2 Репозиторий на github
- Создайте репозиторий
dotfiles
для хранения конфигурационных файлов. - Для определённости будем использовать https://github.com.
- Поддерживается хранение ваших конфигурационных файлов как в общедоступных, так и в частных репозиториях.
- Создать репозиторий можно вручную или из командной строки (см. github: утилиты командной строки):
1gh repo create dotfiles --private
- Откройте оболочку в исходном каталоге, чтобы зафиксировать изменения:
- Подключите репозиторий и выгрузите файлы:
- Выйдите из оболочки
chezmoi
:1exit
5.3 Использование chezmoi на нескольких машинах
- На второй машине инициализируйте
chezmoi
с вашим репозиториемdotfiles
:1chezmoi init https://github.com/<username>/dotfiles.git
- Или через ssh:
1chezmoi init git@github.com:<username>/dotfiles.git
- Проверьте, какие изменения внесёт
chezmoi
в домашний каталог, запустив:1chezmoi diff
- Если вас устраивают изменения, внесённые
chezmoi
, запустите:1chezmoi apply -v
- Если вас не устраивают изменения в файле, отредактируйте его с помощью:
1chezmoi edit file_name
- Также можно вызвать инструмент слияния, чтобы объединить изменения между текущим содержимым файла, файлом в вашей рабочей копии и измененным содержимым файла:
1chezmoi merge file_name
- При существующем каталоге
chezmoi
можно получить и применить последние изменения из вашего репозитория:1chezmoi update -v
5.4 Настройка новой машины с помощью одной команды
- Можно установить свои
dotfiles
на новый компьютер с помощью одной команды:1chezmoi init --apply https://github.com/<username>/dotfiles.git
- Через ssh:
1chezmoi init --apply git@github.com:<username>/dotfiles.git
5.5 Ежедневные операции c chezmoi
5.5.1 Извлеките последние изменения из репозитория и примените их
- Можно извлечь изменения из репозитория и применить их одной командой:
1chezmoi update
- Это запускается
git pull --autostash --rebase
в вашем исходном каталоге, а затемchezmoi apply
.
5.5.2 Извлеките последние изменения из своего репозитория и посмотрите, что изменится, фактически не применяя изменения
- Выполните:
1chezmoi git pull -- --autostash --rebase && chezmoi diff
- Это запускается
git pull --autostash --rebase
в вашем исходном каталоге, аchezmoi diff
затем показывает разницу между целевым состоянием, вычисленным из вашего исходного каталога, и фактическим состоянием. - Если вы довольны изменениями, вы можете применить их:
1chezmoi apply
5.5.3 Автоматически фиксируйте и отправляйте изменения в репозиторий
- Можно автоматически фиксировать и отправлять изменения в исходный каталог в репозиторий.
- Эта функция отключена по умолчанию.
- Чтобы включить её, добавьте в файл конфигурации
~/.config/chezmoi/chezmoi.toml
следующее: - Всякий раз, когда в исходный каталог вносятся изменения,
chezmoi
фиксирует изменения с помощью автоматически сгенерированного сообщения фиксации и отправляет их в ваш репозиторий. - Будьте осторожны при использовании
autoPush
. Если ваш репозиторийdotfiles
является общедоступным, и вы случайно добавили секрет в виде обычного текста, этот секрет будет отправлен в ваш общедоступный репозиторий.