開発環境セットアップを効率化させるdotfilesの管理方法とコマンド

#Programming#Technology#Development

この記事は dotfiles Advent Calendar 2020 - Qiita の3日目の記事です。

開発環境をセットアップするとき、多くの方は長年使っているdotfilesを独自に管理して使用していると思います。

今回、この記事ではご多分に漏れず、秘伝のタレが染み込んだオレオレスクリプトで独自にdotfilesを管理をしてきた方法を紹介したいと思います。正直、自分自身で作成した管理スクリプトなので、この記事は誰得な状態になるかもしれませんが、こんな管理方法をしているんだなと思っていただければと思います。

ちなみに、カレンダーに参加した当初は管理方法を変えようと息巻いていたのですが、そのときに思いついた管理方法をすっかり失念してしまい、思い出せないため現状の管理方法を紹介しようと思った次第です。

dotfilesの管理方法

前述した通り、秘伝のタレが染み込んでいる管理スクリプト込みのリポジトリがこちらです。

$ tree
.
├── bin
│   ├── dotfiles -> ../libexec/dotfiles
├── bundle
├── dict
│   └── myths-legends
└── libexec
    ├── dotfiles
    ├── dotfiles-bootstrap
    ├── dotfiles-help
    ├── dotfiles-install
    ├── dotfiles-sync
    └── dotfiles-version

ディレクトリ構造に関しては bin/dotfiles -> ../libexec/dotfiles のスクリプトで libexec に存在するサブコマンドを呼び出して使うようにしています。

  • bootstrap
  • help
  • install
  • sync
  • version

というサブコマンドを用意していますが、基本的には installbootstrap のみ使用しています。それらを解説します。

libexec/dotfiles-install

$ ./bin/dotfiles install ./bundle

のように、設定したい dotfiles のディレクトリ(例だと ./bundle )を指定することによって、ホームディレクトリにシンボリックリンクをするというありがちなことをしています。

ホームディレクトリに直接リンクしているので、今後は ~/.config に配置する改修をしようというのを考えています。なぜならば、ホームディレクトリに直接置いているとやはり雑多に管理している印象を自分自身が受けてしまうので、それを変更したいためです。

そしてこのスクリプトは自分で別途用意した他の dotfiles を導入することもできるようになっています。

$ ./bin/dotfiles install ./another-dotfiles

ミニマムインストールしたいときに使っていましたが、最近は全く出番がありません。

libexec/dotfiles-bootstrap

$ ./bin/dotfiles bootstrap ./bundle/.bootstrap

昔はAnsibleを使ってプロビジョニングを行っていたのですが、Ansibleインストールするのが面倒だったため、簡易スクリプトでインストールするようにしました。

これはただ単に .bootstrap を起動しているだけなので /bin/bash ./bundle/.bootstrap を実行しているだけです。

そのため libexec/dotfiles-bootstrap を作成したの完全に趣味です。

私の dotfiles は趣味の塊です

ジョブ実行の終了待ちでの遊び

おまけですが、ジョブ実行中に遊び心で画像のようなスピナーを表示させています。

Spinner

適当なスクリプトですが、スクリプトの待ちで遊びたい方はどうぞ。

jobs_await() {
  local pid="$1"
  local spinners=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
  while true; do
    for spinner in ${spinners[@]}; do
      printf "  $spinner  \r" > /dev/stderr
      sleep 0.05
    done
    if ! jobs -rp | grep "$pid" > /dev/null; then
      break
    fi
  done
}

{
  # execution task
} &
pid=$!
jobs_await $pid
wait $pid

exit 0

開発環境のセットアップ

ここからは完全におまけなのですが、新しくMacを購入したときに私がやっているセットアップを紹介したいと思います。

かなりミニマムですが、これで大体事足りています。

Computer Name

まず、PCを購入してやるのはコンピューターの命名を変更するところからやっています。System Preferences > Sharing > Computer Name にて変更が可能です。

命名ですが、クラウドインスタンスの場合は数学者の名前、Macのように物理PCがある場合は時間の神を用いています。

Spinner

ここにあるZurvanというホストネームも ズルワーンという時間を意味する創造神の名前で使っています。

Keyboard sensitivity

キーボードの Key Repeat を System Preferences では設定できない値をターミナル経由で設定します。

$ defaults write -g InitialKeyRepeat -int 10
$ defaults write -g KeyRepeat -int 1

Install Xcode Tools

Macで開発者ツールと言ったら Xcode なので、手っ取り早くインストールしてしまいましょう。

# Install Xcode and the Xcode Command Line Tools
$ sudo xcode-select --install

# Agree to Xcode license
$ sudo xcodebuild -license

# Install the Rosetta2
$ sudo softwareupdate --install-rosetta

これで基本的なものは使えるようになっています。

Install MacPorts or Homebrew

Mac用のパッケージマネージャーとして、MacPorts か Homebrew をインストールします。個人的に Homebrew が昔から苦手だったので、最近から MacPorts に移行しています。

$ sudo port -v selfupdate

この後は特に事前に必要なものをインストールしておくものはないです。開発で必要になったら順次導入しています。

開発向けのセットアップ

SSH鍵の生成

ED25519の暗号化で鍵を生成しているのと、GitHubに登録するときに後々どこの鍵かをわかりやすいようにコメントを入れています。

$ ssh-keygen -t ed25519 -C "$USERNAME@$HOST"

クラウドのインスタンスをよく立てたりするので、ホストの名前(コンピューターネーム)とかは大事。

Git LFS

Gitで容量の大きいファイルを扱うときものです。本来なら下記のコマンドでインストールできます。

# Homebrew: 
$ brew install git-lfs

# MacPorts: 
$ port install git-lfs

arm64 には対応しておらずインストールに失敗するので、今回はマニュアルインストールをしました。

こちらのページのDownloadからファイルをDLして展開します。

$ cd /path/to/git-lfs-dir
$ PREFIX=~/local ./install.sh

PREFIX を設定して、 install.sh を叩いて git-lfs をインストールすれば Rosetta2 で動く git-lfs が導入完了です。

ツール

あとはその他便利ツールをインストールしています。

if which go > /dev/null 2>&1; then
  go get -v -u github.com/x-motemen/ghq
  go get -v -u github.com/fatih/gomodifytags
  go get -v -u github.com/itchyny/mmv/cmd/mmv
  go get -v -u github.com/mattn/gof
  go get -v -u github.com/mattn/cho
fi

go get で対応しているので、この前に Go をインストールしておくのと、 go get は将来的になくなる可能性もあるので現状のメモ程度で使っています。

おわりに

完全に自分メモとしての管理手法とセットアップを記事にしました。これが誰かのためになるかはわからないですが、何かの参考になれば幸いです。

年末年始には dotfiles の管理方法は変えていこうかと計画しているので、アップデートがあればまたブログにて紹介します。


Cover photo: https://unsplash.com/photos/1sSfrozgiFk

B!

Shintaro Kaneko

December 03, 2020