なまえは まだ ない

思いついたことをアウトプットします

自分で作ったMacの環境設定を他のMacでも再利用できるようにする

はじめに

Macを真っさらな状態から設定してみようということで、ここまで全4回にわたって環境構築をしてきました。

ただここまでやってきた内容を、またMacをリセットしたとか新しく買ったという時にいちいちやり直すのは面倒です。 というわけで、これらの内容をスクリプト化して簡単にやり直せるよう自動化しましょう。

ゴールを考える

まずは今までの作業をスクリプト化します。数回のコマンド/スクリプト実行で作業完了することを目指します。 また、果たしてそんなシチュエーションがあるか不明ですが、 複数のMac環境がある場合に片方で行なった変更を簡単に同期できるようにしたいです。 これは多くの方がやっているように、Gitリポジトリスクリプトを登録することで実現しようと思います。

というわけで、目標はとりあえず次の通りです。

  1. 実施した作業をできる限りスクリプトで表現する
  2. 作成したスクリプトやファイルはGitで管理できるようにする
  3. 後々の変更に強いディレクトリ/ファイル構成を目指す

実際にやってみた

OS設定

特筆すべき内容はありません(笑)。 パート2でやったOS設定をシェルスクリプトに書き出せば終了です。 スクリプト名は仮にmacos.shとしておきましょう。

手元のMac環境をリセットする (2) - なまえは まだ ない

ターミナル関連の設定

基本的にパート3でやった内容をひとつのスクリプトとして記述します。 terminal.shとでもしておきます。

手元のMac環境をリセットする (3) - なまえは まだ ない

.zproztorcを直接編集してカラーテーマを変更した作業は、次のようにsedコマンドで実現しました。

sed -i "" -E "/zstyle ':prezto:module:prompt' theme/s/'[a-z]+'/'pure'/" "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/zpreztorc

もっとスマートな書き方があったら教えてください。

Macに同梱されているsedコマンドはBSD版というものらしく、検索でヒットするGNU版とは若干挙動が異なります。 -iオプションでファイルを直接編集する場合、バックアップファイルを作成しない場合は空の拡張子指定("")が必要です。

Zshのモジュールを追記した作業もsedで表現したかったのですが、今のところ良い感じの解にたどり着いていません。 ここは後の宿題にしようと思います。

ちなみに、MacGNU版のsedコマンドを使いたい場合はHomebrewからインストールできるようです。

brew install gnu-sed

今後こちらに切り替えるかもしれません。

エディター関連

ここが今回の主役かもしれません。

Vim

.vimrcは当たり前ですが凝れば凝るほど長くなっていくので、 後々のことを考えて、大まかな役割で複数のVim Scriptに分割しておきます。 今回はVimの基本的な設定や共通設定をbase.vim、 NeoBundleによるプラグイン関連をbundle.vimとして分割することにしました。 それぞれの設定項目はパート4の内容そのままです。

手元のMac環境をリセットする (4) - なまえは まだ ない

.vimrc本体は各Vim Scriptをロードするだけの処理としました。 注意としては、base.vimで記載したカラーテーマはNeoBundleでインストールしたものなので、 先にbundle.vimをロードします。

source ./dotfiles/vim/bundle.vim
source ./dotfiles/vim/base.vim

あとはこの.vimrcシンボリックリンクをユーザーディレクトリに配置します。

ln -sf dotfiles/vim/.vimrc ${HOME}/.vimrc

Visual Studio Code

VSCode拡張機能のインストールがGUIで簡単にできるのが魅力のひとつですが、 いちいち検索&インストールというのも面倒です。 VSCodeにはコマンドライン拡張機能をインストールする機能が実装されているので、そちらを利用します。

code --install-extension <extension-id>

すでにインストールされている拡張機能の一覧は--list-extensionsオプションで取得することができます。 これをファイルにダンプすれば、インストール対象のリストが簡単に作成できます。

code --list-extensions > ./vscode-extensions

あとはこのファイルを読んで各行に対して--install-extensionを実行するスクリプトを書けば完成です。

#!/bin/bash

# 拡張機能のリストをファイルから取得する
dir=`cd $(dirname ${0}) && pwd`
extensions=`cat ${dir}/vscode-extensions`

# 拡張機能を順にインストールする
for ext in ${extensions[@]}; do
    code --install-extension $ext
done

これなら、今後新しい拡張機能を導入した時にも簡単に同期することができます。

settings.jsonの同期は.vimrcと同様にシンボリックリンクを貼ります。

ln -sf vscode/settings.json ${HOME}/Library/Application\ Support/Code/User/settings.json

それぞれの作業もスクリプト化する

VimVSCodeの設定をまとめて実施するスクリプトを書きます。名前はeditor.shとしておきます。

#!/bin/bash

dir=`cd $(dirname ${0}) && pwd`

# VSCodeがインストール済であれば環境設定を同期する
if type code >/dev/null 2>&1; then
    # 拡張機能をインストール
    ${dir}/vscode/install-vscode-extensions.sh
    # settings.jsonを同期
    ln -sf ${dir}/vscode/settings.json ${HOME}/Library/Application\ Support/Code/User/settings.json
fi

# Vimの環境設定を同期する
ln -sf ${dir}/vim/.vimrc ${HOME}/.vimrc

一応VSCodeは外部からインストールするアプリケーションなので、codeコマンドの存在確認はしておきます。

ディレクトリ構成

以上を踏まえて、最終的なディレクトリ構成は次のようになりました。

dotfiles/
  |---- vim/
  |  |---- .vimrc
  |  |---- base.vim
  |  `---- bundle.vim
  |---- vscode/
  |  |---- install-vscode-extensions.sh
  |  |---- settings.json
  |  `---- vscode-extensions
  |---- editor.sh
  |---- macos.sh
  `---- terminal.sh

なんとか形になりました。

まとめ

今まで実施した環境構築のステップをスクリプト化することができました。 このdotfilesディレクトリをユーザーのホームディレクトリ直下に配置して各スクリプトを実行すれば、 ほとんど作業なしに現在のMac環境を再現できるようになります。多分。

次回はこれらをGitHubリポジトリに登録して、外部から参照できるようにします。