Предположим, вы получаете свой новый компьютер. У вас есть куча Softwares для установки (ваш любимый браузер, редактор кода, инструмент управления Windows и т. Д.) И некоторые конфигурации и ярлыки. Сколько времени вам нужно, чтобы быть полностью продуктивным после распаковки? Один час, однажды, одна неделя?
Если вы сделаете это вручную, вы сделаете ошибки. Потому что мы все люди.
Вы можете в конечном итоге сделать это успешно с хорошо написанным списком TODO, но, подождите, делаете ли вы все загрузки, клики, конфигурацию вручную? Вы работаете в информатике, используете компьютеры для выполнения повторяющихся и скучных задач.
Теперь мы предполагаем, что ваш ноутбук готов к работе. Вы довольны этим и хотите одну и ту же рабочую среду на своем рабочем столе, которая имеет другую операционную систему, должны ли вы снова начать с пустой страницы?
Вот почему вам нужна автоматизация установки. Их часто называют «dotfiles». Давайте глубоко погрузимся в это.
Мы хотим поместить всю нашу конфигурацию для различных сред в месте, где легко поделиться или повторно использовать, и в идеале.
Контекст
Следующие руководящие принципы и объяснения работают над Unix-подобные операционные системы Анкет Извините, пользователи Microsoft, так как я некоторое время не использовал эту систему, я не могу об этом говорить. Это будет работать с Подсистема Windows для Linux Потому что это система UNIX под капотом.
Содержание
У нас есть две вещи, о которых нужно позаботиться: установка программного обеспечения и их конфигурации.
К счастью, для установки, в большинстве операционных систем есть встроенный или основной менеджер пакетов. Aptitude, Brew, Pacman, вы называете это. Это хорошая отправная точка, но не каждый инструмент или программное обеспечение доступны на нем или на каждой архитектуре. Возможно, вам придется скачать бинарный или архив и поставить его в нужное место.
Для части конфигурации это более сложно ~ разнообразно. Некоторые инструменты полагаются на файлы, другие на переменные среды, а другие просто не настраиваются легко, например, скрытые или двоичные файлы.
Обратите внимание, что Пиво , менеджер пакетов для MacOS, не встроен и должен быть установлен вручную первым.
Хранилище
Похоже, мы начинаем говорить о коде, особенно инфраструктуре как кода. Код в настоящее время находится в программном обеспечении управления версиями (VCS). Наиболее широкое использование — Git Анкет Чтобы сделать его совместным для всех, вы должны хранить свой репозиторий GIT на GitHub, Gitlab, Bitbucket и т. Д. Они просты в использовании, хорошо приняты сообществом и легко найти.
У GIT есть много функций, на которых мы сосредоточимся, — это разветвляется. С помощью филиалов вы можете справиться с Архитектура X операционная система Матрица с легкостью. Филиал для «личных макосов», филиала для «Work-ubuntu», филиала для «домашней рапбийцы» и т. Д. Вы также можете добавить условия в свой код для ведения дел на основе имен хоста, переменных среды и т. Д.
Мои Dotfiles на месте для личных и профессиональных контекстов, на AMD64 и ARM64 Архитектуры, на операционных системах macOS и Linux. Все они находятся в одном хранилище только с двумя ветвями ( main и Я нормализую много различий каждой операционной системы.
Избиение
Вы можете найти Многие инструменты на GitHub (или в другом месте), чтобы загрузить ваши Dotfiles. Некоторые люди предпочитают полагаться на Ansible, другие на некоторых инструментах, которые вы должны установить. Но как установить инструмент, который устанавливает инструменты? Ручная установка не является вариантом. Это как проблема с курицей-яйцом.
Очевидно, вам нужна отправная точка и убедитесь, что она доступна везде. На Unix-подобных системах, Bash это общий знаменатель. Эта ответственность, будучи общим знаменателем, сложно, когда вы являетесь программным обеспечением тридцати лет.
Например, в последней версии MacOS отправленная версия Bash это 3.2.57 , версия 2007 года, Из -за изменения лицензирования . Я не объясню все различия между V3 и V5 (ток в 2021 году), но вы можете увидеть ниже разницу.
MY_VARIABLE="macOS"
# Lower case, works only with bash 4+
echo "${MY_VARIABLE,,}"
# Lower case, the old way, bash 3 compliant
echo "${MY_VARIABLE}" | tr "[:upper:]" "[:lower:]"
Итак, Bash Является ли более широкое совместимое программное обеспечение, уже установлено в большинстве систем. Мы знаем, как запустить наш код, но как мы можем его получить?
Zip & Curl
До этого мы видели, что лучший способ хранения наших Dotfiles — это git, но git Должен быть установлен для клонирования репозитория, который установит git . Куриная яйца снова. К счастью, такие решения, как Github или Gitlab, предоставляют способ загрузить репозиторий в Zip архив. распад , как Bash , присутствует изначально на большинстве распределений.
Для получения данных нам также нужен инструмент. Curl Это общий способ сделать запрос в Интернете из терминала и, угадайте, что также встроено по большинству распределений.
Золотой треугольник
Спасибо Бэш трубопровод , мы можем Curl Скрипт начальной загрузки, подчиняйте его Bash и начать установку по Unzip -ing Архив репозитория. Все инструменты присутствуют после установки (протестировано на MacOS, Manjaro, Debian 10).
curl "https://my.bootstrap.script" | bash
⚠ При выполнении такого рода команды, в любом случае, всегда проверяйте, что вы собираетесь запустить, особенно когда некоторые «сценарии установки с одной линией» требуют Sudo Анкет Интернет это крутая вещь, но не все действуют как крутой человек.
В сценарии начальной загрузки вы можете выбрать, где будут находиться DotFiles (в моем случае я размещаю его в $ {Home}/code/dotfiles ). Я бы обратил ваше внимание на то, как Curl Варианты написаны в их длинном формате. При написании сценария вы не в терминале, пытаясь быть быстрым и ограничивая свой ввод клавиатуры. Вы пишете код, который будет обмен и должен быть всеобъемлющим у других людей. Быть многословным.
#!/usr/bin/env bash
set -o nounset -o pipefail -o errexit
main() {
local INSTALL_PATH="${HOME}/code"
local GITHUB_USER="ViBiOh"
local DOTFILES_NAME="dotfiles"
local DOTFILES_BRANCH="main"
local ARCHIVE_FILENAME="${INSTALL_PATH}/dotfiles.zip"
mkdir -p "${INSTALL_PATH}"
curl \
--disable \
--silent \
--show-error \
--location \
--max-time 60 \
--output "${ARCHIVE_FILENAME}" "https://github.com/${GITHUB_USER}/${DOTFILES_NAME}/archive/${DOTFILES_BRANCH}.zip"
unzip "${ARCHIVE_FILENAME}" -d "${INSTALL_PATH}"
rm -f "${ARCHIVE_FILENAME}"
rm -rf "${INSTALL_PATH:?}/${DOTFILES_NAME}"
mv "${INSTALL_PATH}/${DOTFILES_NAME}-${DOTFILES_BRANCH}" "${INSTALL_PATH}/${DOTFILES_NAME}"
(
cd "${INSTALL_PATH}/${DOTFILES_NAME}"
"./init" -a
git init
git remote add origin "http://github.com/${GITHUB_USER}/${DOTFILES_NAME}.git"
git fetch origin
git checkout --force "${DOTFILES_BRANCH}"
)
}
main
Сценарий начальной загрузки выполняет «первую загрузку» из всех необходимых файлов. После того, как это сделано, init Скрипт вступает во владение. init это скрипт, который устанавливает и настраивает все вещи, вы запускаете его несколько раз в будущем.
В конце сценария вы можете видеть, что есть git команды После успешной установки будет установлен git, и я согласен с загруженным архивом (без .git Папка) с GIT вверх по течению.
Первое, что нам нужно в нашем репозитории DotFiles, — это два сценария, описанные ранее: начальная загрузка и в этом . Вам также понадобится не менее 3 папок больше: установить , символики и источники Анкет Мы собираемся погрузиться в них.
> tree -L 1 . ├── bootstrap ├── init ├── install/ ├── sources/ └── symlinks/
Установить
Softwares в большинстве случаев доступны как бинарный и, возможно, ваш любимый менеджер пакетов. Но есть также задачи, которые не являются «установкой программного обеспечения», в правильных словах, но их нужно хотя бы один раз запустить на вашем компьютере (например, отключение нежелательных функций вашей ОС, генерируя файл конфигурации, который не может быть символом и т. Д.). С моей точки зрения, это часть сценариев установки.
Среди программных программ, которые я использую, все недоступны для менеджера пакетов. Менеджеры пакетов часто устанавливают дополнительные программы, которые я не хочу, и устанавливают их по всему миру, что может мешать другим пользователям. Я склонен загружать двоичные файлы прямо из GitHub и помещать их в свой $ {Path} Вместо того, чтобы полагаться на менеджер пакетов. Также легче придерживаться определенной версии, и двоичные файлы имеют тенденцию обновляться быстрее, чем упаковка вверх по течению.
В идеальном мире DotFiles не должен запускать какую -либо команду в Sudo Анкет Вы устанавливаете Ваш Конфигурация на машине, держите все в своем $ {Home} если вы можете. Например, я создаю $ {Home}/opt/ Папка для размещения моих вещей (Gopath, Python Packages и т. Д.). Я добавляю $ {Home}/opt/bin в моем $ {Path} Анкет Если я удалю свой Опт/ Папка, я единственный человек, которого повлиял.
В установить/ Папка, вы можете разделить опасения своей установки, разделяя вещи в разных файлах. Таким образом, вы можете отключить сценарий на основе переменной среды. например На моем сервере мне не нужно устанавливать редактор кода. Я устанавливаю переменную среды Dotfiles_no_editor и сценарий установки не будет пытаться запустить Установка/редактор файл.
Я вижу фазу установки на 3 шага:
чистыйАнкет Установка должна быть Idempotent , он может потребовать очистки перед установкой или просто «сброшенной» установки DotFiles.установитьАнкет Установка, как вы можете подумать: запуск сценария, который загружается из менеджера пакетов, помещают двоичные файлы в соответствующие папки и т. Д.Учетные данныеАнкет Получите секреты от вашего менеджера пароля и поместите их в файл конфигурации. Смотрите Секреты раздел висточники/Больше подробностей. Этот этап должен быть выполнен после всех установок (сначала вы должны установить диспетчер паролей).
Для запуска каждой фазы отдельно мы можем полагаться на наличие функции в файле. Поиск файла прост в Bash и проверяет, что функция также доступна.
Если мы конденсируемся всем, что мы говорили раньше в одной функции, это будет похоже на следующий код, поместите в init сценарий
browse_install() {
while IFS= read -r -d '' file; do
local BASENAME_FILE
BASENAME_FILE="$(basename "${file}")"
local UPPERCASE_FILENAME
UPPERCASE_FILENAME="$(printf "%s" "${BASENAME_FILE}" | tr "[:lower:]" "[:upper:]")"
local DISABLE_VARIABLE_NAME="DOTFILES_NO_${UPPERCASE_FILENAME}"
if [[ ${!DISABLE_VARIABLE_NAME:-} == "true" ]]; then
continue
fi
if [[ -r ${file} ]]; then
for action in "${@}"; do
unset -f "${action}"
done
source "${file}"
for action in "${@}"; do
if [[ $(type -t "${action}") == "function" ]]; then
printf "%s - %s" "${action}" "${BASENAME_FILE}"
"${action}"
fi
done
fi
done < <(find "${CURRENT_DIR}/install" -type f -print0 | LC_ALL=C sort --zero-terminated)
# ${CURRENT_DIR} is the root of the Dotfiles repository
}
browse_install clean install
browse_install credentials
Символики
Самые простые инструменты для настройки — это те, которые полагаются на один файл в вашем домашнем каталоге, который начинается с точки. Вот где хранилище принимает свое название: знаменитые «Dotfiles». Вы их знаете: .bashrc , .vimrc или .gitConfig . Чтобы сохранить файл в системе управления версиями (GIT), но не совершать все ваше $ {Home} , простой трюк — использовать символически . Файл существует в $ {Home} Папка, поэтому ваш инструмент может прочитать его, но содержание остается в папке под управлением версией. Лучший из двух миров.
~/ > ls -la .bashrc -> /Users/macbook/code/dotfiles/symlinks/bashrc .curlrc -> /Users/macbook/code/dotfiles/symlinks/curlrc .gitconfig -> /Users/macbook/code/dotfiles/symlinks/gitconfig .ignore -> /Users/macbook/code/dotfiles/symlinks/ignore .inputrc -> /Users/macbook/code/dotfiles/symlinks/inputrc .tmux.conf -> /Users/macbook/code/dotfiles/symlinks/tmux.conf .vimrc -> /Users/macbook/code/dotfiles/symlinks/vimrc
Они просты в установке: поместите все свое .файл В каталоге (например, символизирует) и свяжите каждый файл в этой папке с вашей $ {Home} папка. Обратите внимание, что мои файлы названы без точки (например, bashrc ) И я добавляю «точку» во время фазы символики. DotFile по умолчанию — скрытый файл в большинстве операционных систем. Я не хочу, чтобы это было скрыто в коде, только при использовании.
Создание символов может быть сделано со следующим фрагментом, поместите в init сценарий
create_symlinks() {
while IFS= read -r -d '' file; do
local BASENAME_FILE
BASENAME_FILE="$(basename "${file}")"
if [[ -n ${FILE_LIMIT} ]] && [[ ${BASENAME_FILE} != "${FILE_LIMIT}" ]]; then
continue
fi
rm -f "${HOME}/.${BASENAME_FILE}"
ln -s "${file}" "${HOME}/.${BASENAME_FILE}"
done < <(find "${CURRENT_DIR}/symlinks" -type f -print0)
# ${CURRENT_DIR} is the root of the Dotfiles repository
}
Нежное напоминание о символических ссылках: они живут «содержание». Когда вы тянете новую версию вашего репозитория DotFiles, конфигурация изменяется мгновенно.
👍 У него есть хорошая сторона: вы тянете свой код и не имеете ничего общего.
👎 Он имеет вниз: если у вас есть конфликт с GIT на вашем Symlinks/GitConfig Файл, ваш git может быть сломан, потому что ваш ~/.gitConfig является недействительным 😅.
Проблема с курицей-яйцом, всегда.
Источники
Для настройки вашей среды оболочки музыка немного отличается, другими словами, сложна! Общим способом настройки вашей оболочки является ~/.bashrc (или ~/.zshrc , . You-name-it-rc ). Это то, что мы только что настроили раньше со символиками. Но размещение конфигурации всех инструментов, используемых в одном и том же файле, делает файл нечитаемым, с большим количеством комментариев для разделения цели кода. Не чистый способ сделать это.
К счастью, вы должны правильно его разделить. Мой ~/.bashrc Источники каждый файл, содержащийся в dotfiles/источники/ папка.
Я не хочу жесткого кодирования пути моей папки Dotfiles. Благодаря Symlinks, уже связанным с папкой в моем репозитории, я могу найти, где на самом деле мои файлы с $ {Bash_source [0]} обманывать.
Поиск источники Папка можно сделать со следующим фрагментом, положите в Symlinks/.bashrc файл.
source_all() {
local SCRIPT_DIR
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for file in "${SCRIPT_DIR}/../sources/"*; do
[[ -r ${file} ]] && [[ -f ${file} ]] && source "${file}"
done
}
В источники/ Папка, вы размещаете каждую конфигурацию терминала, которая вам нужна, например, переменная среды, функция, псевдонимы и т. Д. Пришло время для хорошего напоминания.
Правило № 1 The Dotfiles Club
Вы не вкладываете секреты в свои Dotfiles.
Правило № 2 The Dotfiles Club
Вы не вкладываете секреты в свои Dotfiles.
Если вы хотите иметь секреты в переменных вашей среды (например, токен, пароль), поместите их в ~/.localrc Анкет Нигде не сочувствует! Поскольку его имя стоит, оно остается «местным».
if [[ -e "${HOME}/.localrc" ]]; then
source "${HOME}/.localrc"
fi
Секреты
Если вы прочитали два правила Dotfiles Club Вы можете задаться вопросом, как автоматически настроить компьютер, не помещая секреты в репозиторий. Секрет управления секретами: менеджер паролей.
Поскольку мы находимся в средах UNIX, я лично использую проходить Это легко сценарий, опирается на твердый PGP шифрование И хранит все в GIT. Мне нужно импортировать ключ GPG, и все в порядке. Безопасность — серьезная тема, импорт ключа GPG — Единственное ручное действие в моем процессе. Вы можете использовать любой другой диспетчер паролей, установить CLI с установить/ Сценарии и вы сможете получить свои учетные данные и выдвигать их в файлах конфигурации во время реквизиты для входа фаза
Советы и приемы
Имейте в виду, что ваши dotfiles должны будут работать в различных средах на различных этапах установки. Всегда будьте обратно совместимы и снисходительны по ошибкам.
При поиске источника не следует использовать флаги Bash -О существительное -o pipefail -o errexit , потому что, если произойдет ошибка, она будет сбоем запуск Bash, и вы можете быть заблокированы за пределами вашего терминала.
Кроме того, если вы используете инструмент, который не встроен, всегда проверяйте его присутствие со следующим фрагментом. Возможно, вы отключили его установку, она может быть недоступна в вашей архитектуре и т. Д.
if command -v git >/dev/null 2>&1; then # do `git` related stuff fi
Bashrc
Используя .bashrc Для автоматической загрузки вашей среды — это хорошая вещь, но вам это не нужно при выполнении операции без головы (например, rsync ). В этом случае это может замедлить вас. К счастью, есть этот трюк для отключения загрузки .bashrc .
[[ -z ${PS1:-} ]] && return
У MacOS здесь есть конкретный случай. По умолчанию он не ищет ~/.bashrc Файл, но ~/.bash_profile Анкет Вы можете исправить его, создав этот файл и указав его на свой .bashrc .
#!/usr/bin/env bash
if [[ -f "${HOME}/.bashrc" ]]; then
source "${HOME}/.bashrc"
fi
Заказ
Файлы просмотра должны быть сделаны в определенном порядке, поскольку у вас могут быть зависимости между файлами (например, изменение пути $ {path} переменная перед проверкой, если будет установлено программное обеспечение, установка Python перед использованием Pip ) У вас нет таких проблем в одном файле, потому что вы просто ставите линию в нужном месте.
Когда итерация в папке с для или Найти , Баш полагается на Алфавитный порядок , определяется Lc_all/lc_collate переменные среды. Вы можете контролировать порядок поиска, гарантируя, что ваши файлы находятся в алфавитном порядке. Pro-Tips: подчеркивается перед любым персонажем из более низкого регистра.
Чтобы правильно настроить локаль, вы можете добавить следующий фрагмент перед Source_all , это изящно устанавливает локаль, если он присутствует.
set_locale() {
local LOCALES=("en_US.UTF-8" "en_US.utf8" "C.UTF-8" "C")
local ALL_LOCALES
ALL_LOCALES="$(locale -a)"
for locale in "${LOCALES[@]}"; do
if [[ $(echo "${ALL_LOCALES}" | grep --count "${locale}") -eq 1 ]]; then
export LC_ALL="${locale}"
export LANG="${locale}"
export LANGUAGE="${locale}"
return
fi
done
return 1
}
Все вместе
Я сделал самый простой возможный репозиторий DotFiles в эта суть Анкет Невозможно создать папку на сути, например, Symlinks_bashrc должен быть Symlinks/Bashrc Анкет
Вы найдете фрагмент для установки варева и изменения оболочки пользователя по умолчанию на MacOS. Если вы установите Bash с Brew, у вас есть два Bash : один в /bin/bash (3.2.57) и один в /usr/local/bin/bash (5+).
Vibioh/dotfiles
Dotfiles для настройки моей терминальной среды
Монтаж
curl "https://raw.githubusercontent.com/ViBiOh/dotfiles/main/bootstrap" | bash
Обновлять
"${HOME}/code/dotfiles/init" -aКонфигурация
Вы можете установить следующие переменные среды для настройки поведения установки:
Dotfiles_no_node = "true"не выполняет установкуУстановка/УзелФайл (заменитьУзеллюбым именем файла в верхнем регистреустановить/DIR)
#!/usr/bin/env bash # Server configuration example export DOTFILES_NO_ALACRITTY="true" export DOTFILES_NO_APPLE="true" export DOTFILES_NO_DNSMASQ="true" export DOTFILES_NO_FIREFOX="true" export DOTFILES_NO_GOLANG="true" export DOTFILES_NO_GPG="true" export DOTFILES_NO_KUBERNETES="true" export DOTFILES_NO_NODE="true" export DOTFILES_NO_PASS="true" export DOTFILES_NO_PROTOBUFF="true" export DOTFILES_NO_PYTHON="true" export DOTFILES_NO_PYTHON_ANSIBLE="true" export DOTFILES_NO_PYTHON_PGCLI="true" export DOTFILES_NO_SHELLCHECK="true" export DOTFILES_NO_SUBLIME="true" export DOTFILES_NO_SYNCTHING="true" export DOTFILES_NO_TERRAFORM="true"
SSH
ssh-keygen -t ed25519 -a 100 -C "$(whoami)@$(hostname)" -f
Мой Личные дотфилсы иметь больше синтаксического сахара, но являются источником вдохновения для написания этой статьи. Это «репозиторий шаблона», не стесняйтесь использовать его. С почти 2K Commits, достижение моего Dotfiles было путешествием, и я просто хотел поделиться им. Надеюсь, вам понравилась поездка на чтение!
PS: английский не мой родной язык, и это мой первый пост здесь, будь добрым, я открыт для совета по улучшению =)
изображение обложки от Unsplash
Оригинал: «https://dev.to/vibioh/dotfiles-5695»