🌊

「dotfiles」で、”スマートなMac設定移行” をする方法

2022/03/08に公開

「dotfiles」で、”スマートなMac設定移行” をする方法

ゴール

以下のような、1行のコマンドだけで設定が完了することを目指しました。

/bin/zsh -c "$(curl -fsSL https://raw.githubusercontent.com/watsuyo/dotfiles/master/shell/setup)"
  • yes/noやパスワードの入力を省略させることも可能ですが、今回は確認しながら設定を行いたかったため、厳密には1行のコマンド + 数回の入力があります

概要

Web業界でエンジニアをしていると数年に一度は、MacBookの環境構築をする機会があります。

今回は、社内でMacBook Pro M1 2021の支給が始まったことをきっかけに、dotfilesを作成して開発環境のセットアップをできる限り自動化させたので、その知見共有をします。

dotfiles とは?

Dotfiles are used to customize your system. The “dotfiles” name is derived from the configuration files in Unix-like systems that start with a dot (e.g. . _profile and .gitconfig). [1]

UNIX系OSのMac OSやLinuxなどでいう、Userディレクトリ直下に存在する “.(ドット)”で始まるファイルの集まりのことを指します。

dotfilesディレクトリに設定ファイルを集約することで、まとめてGit管理できます。

👇が今回作成した、Dotfilesです。

https://github.com/watsuyo/dotfiles

今回やったこと

1行のコマンドによって、開発やMacを使う上で愛用してるソフトウェアをインストール & 設定が完了することを目的としました。

必要なソフトウェアはすべて、Brewを通じてインストールをしています。

また、設定ファイルである .hogehoge のようなファイルを、指定されているあるべきディレクトリにシンボリックリンクを貼りました。

GitHubにdotfilesごとデプロイすることで、冒頭のようなcurlコマンドでインストーラスクリプトを実行できます。

次に、コードを追いながら、インストーラについて解説します。

インストーラ

Homebrewのインストール

ここでいうインストーラは、各種shellファイルを呼び出すためのshellファイルのことです。

今回は、セットアップ時にインストーラをcurlで呼び出すことで、git clone を手動で行わなくても済むようにしています。

まずは何がともあれ、Homebrewをインストールします。
https://brew.sh/

すでに、Homebrewがインストール済みかどうかは、 /usr/local/bin/brew ディレクトリが存在するかで判定しています。

#!/bin/sh
set -e

cd ~

# Install Homebrew
if [ ! -f /usr/local/bin/brew ]
 then
  echo "Installing Homebrew..."
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
 else
  echo "Homebrew already installed."
fi

dotfilesディレクトリをclone

次に、GitHubリポジトリにデプロイしておいた、dotfilesディレクトリをcloneします。

echoで対話させることで、処理がいったん止まります。

初期セットアップを前提にしているので、処理が止まっている間に、ssh-keygen を行い、公開鍵をGitHub上に登録を行います。(これは手動)

1を選ぶことで、問題なくgit cloneが行われていればOKです。

また if [ ! -d ~/dotfiles ] によって、dotfilesディレクトリがすでに存在する場合は、cloneを行わないようにしています。

# Clone my dotfiles
if [ ! -d ~/dotfiles ]
 then
  cd ~/.ssh
  ssh-keygen
  pbcopy < ~/.ssh/id_rsa.pub
  echo "公開鍵をGitHubに登録しましたか?"
  select yn in "Yes"; do
   case $yn in
    Yes ) break;;
   esac
  done

  echo "Cloning dotfiles..."
  git clone git@github.com:watsuyo/dotfiles.git
 else
  echo "dotfiles already cloned."
fi

ソフトウェアをbrew install

次に、各種ソフトウェアをBrewを通じてインストールします。

# Install some software
echo "Installing some software & library..."
brew bundle -v --file=./dotfiles/Brewfile

インストールしたいソフトウェアは事前に、Brewfile に記載しておきます。

brew installなのか、brew install —caskでインストールするのかは、事前に調べておき、Homebrewの公式サイトでもインストール方法に関する情報を検索できます。
https://formulae.brew.sh/formula

一部ではありますが、👇のように記載します。

brew "git"
brew "stow"
brew "starship"
brew "python@3.9"
brew "tree"
brew "yarn"
brew "exa"
brew "koekeishiya/formulae/yabai"
brew "koekeishiya/formulae/skhd"

cask "visual-studio-code"
cask "iterm2"
cask "google-chrome"
cask "slack"
cask "docker"
cask "alfred"
.
.
.

設定ファイルの置き場所

dotfilesでは、設定ファイルを同じディレクトリ内で管理します。

ソフトウェアによって、コンピュータ内のどこに設定ファイルを配置するかはバラバラなため、配置場所を指定する必要があります。

設定ファイルの実態は、dotfilesディレクトリ内にありますが、User直下や**.config**ディレクトリ配下にある設定ファイルはシンボリックリンクで参照するようにします。

.configディレクトリがなければ、ディレクトリを作成します。

if [ ! -d ~/.config ]
 then
  echo "Creating ~/.config directory..."
  mkdir ~/.config
fi

シンボリックリンク

GNU Stowを使用します。
https://www.gnu.org/software/stow

GNU Stow is a symlink farm manager which takes distinct packages of software and/or data located in separate directories on the filesystem, and makes them appear to be installed in the same place.[4]

GNU Stowは、あたかも同じ場所にインストールされているように見せるシンボリックリンクファームマネージャです。

packagesディレクトリ配下に、ソフトウェア名のディレクトリを作成し、そこを起点に実際の設定ファイルのが置かれるディレクトリ構造と同様な構造にすることで、正しくシンボリックリンクが作成されます。

たとえば、Userディレクトリ直下であれば、ソフトウェア名のディレクトリ直下に .hoge などの設定ファイルを作成します。

Starshipであれば、.config直下に設定ファイルがあるため、starship/starship.toml のように。
Karabiner-Elementsであれば、karabiner/.config/karabiner/karabiner.json のように配置します。
https://starship.rs
https://karabiner-elements.pqrs.org

echo "Symlinking dotfiles..."
sh ~/dotfiles/shell/symlink
echo "Symlinking dotfiles..."
stow -v -d ~/dotfiles/packages -t ~ starship zsh karabiner vscode vim git yabai skhd

シンボリックリンクが有効かどうかは、以下のように確認できます。
これで、dotfilesディレクトリ内の設定ファイルを編集すると、自動的にUserディレクトリ内の設定ファイルに反映されます。

$ ls -la
lrwxr-xr-x   1 User  staff    48 Mar  5 23:16 karabiner -> ../dotfiles/packages/karabiner/.config/karabiner
lrwxr-xr-x   1 User  staff    51 Mar  5 23:16 starship.toml -> ../dotfiles/packages/starship/.config/starship.toml

最後に

はじめてのdotfiles作成だったので、GitHub上で公開されているdotfilesや、dotfilesの非公式ガイドを参考に進めることでイメージがつきました。
http://dotfiles.github.io/tutorials

また、手作業でターミナルにコマンドを叩くイメージを持ちつつ、それを自動化させていると考えれば、どういう順番で何を実行すればいいかが理解しやすいかなと思います。

説明を端折ってしまった、

  • zsh-autosuggestions
  • Alfred
  • Zprezto
  • zsh
  • yabai

https://github.com/zsh-users/zsh-autosuggestions
https://www.alfredapp.com
https://github.com/sorin-ionescu/prezto
https://www.zsh.org
https://github.com/koekeishiya/yabai

などのアプリケーションの設定については、私のdotfilesをご覧ください。(別で記事を書く予定です。)
https://github.com/watsuyo/dotfiles

ちなみに、Publicかつ、MITライセンスですのでご自由にcloneしていただいて構いません。

参考文献と引用

  1. Getting Started With Dotfiles, Lars Kappert, https://medium.com/@webprolific/getting-started-with-dotfiles-43c3602fd789, (最終閲覧日: 2022/03/07)
  2. Homebrew, https://brew.sh/, (最終閲覧日: 2022/03/07)
  3. Homebrew Formulae, https://formulae.brew.sh/formula/, (最終閲覧日: 2022/03/07)
  4. GNU Stow, https://www.gnu.org/software/stow/, (最終閲覧日: 2022/03/07)

Discussion