Рубрики
Uncategorized

~/.dotfiles

Зачем предположить, что вы получаете свой новый компьютер. У вас есть куча Softwares, чтобы … помеченные DevOps, Bash, Productivity, Unix.

Предположим, вы получаете свой новый компьютер. У вас есть куча 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»