OSX Yosemiteの環境をコマンド一発でセットアップできるようにしてみた

  • 70
    Like
  • 0
    Comment
More than 1 year has passed since last update.

TL;DR

rebuild <ユーザー名>/dotfilesと打つと、コマンドラインツールを自動でインストールしてdotfilesをcloneしてインストールスクリプトを走らせてくれるrebuild gemを作りました

k0kubun/rebuild

はじめに

エディタやシェルなどのツールは~/.*に設定ファイルが配置されることが多いです。
そこで、多くの人がそれらの.で始まるファイル群をGitHubでdotfilesというリポジトリ名で管理しています。

ですが、せっかく設定ファイルをちゃんと管理していても、Yosemiteをアップグレードインストールすると環境が壊れ、無限に余計な作業が発生したりします。
なら、クリーンインストールした状態から一発で元の環境を再現できたら、/usr/localを退避させる必要もなく、すごく便利ではないでしょうか?

Command Line Tools

まず、まっさらな状態ではgitが使えません。
なので、「GitHubからリポジトリのアーカイブをダウンロードして解凍し、セットアップスクリプトを走らせることで解決している人もいます。

ですが、curl -LSfs https://raw.githubusercontent.com/***/dotfiles/master/install.sh | bash
とか cd; curl -#L https://github.com/***/dotfiles/tarball/master | tar -xzv --strip-components 1 --exclude={README.md,bootstrap.sh,LICENSE-MIT.txt}
とかって、ブラウザを開いてコピペするのも自分で打ち込むのも面倒ではないでしょうか?

rebuildを叩くだけ

ターミナルを開いたらsudo gem install rebuild && rebuildと打ち込んでください。
AppleScriptによるGUIスクリプティングにより、マウスに触らずにgitやgccが使えるようになります。 (一度は利用規約読んでる人向けです)

そして、rebuildではなくrebuild <ユーザー名>/dotfilesと打てば、リポジトリルートにある*.shを自動で走らせるところまでやってくれます。
これにより、gitの有無や自身のcloneを気にせずセットアップスクリプトを書くことができます

セットアップ全自動化

あとはあなたの環境セットアップスクリプトに足りない自動化スクリプトを追加するだけです。
そのために便利なスニペットを紹介します。

なお、rebuildの実行は冪等性が保証されており、実行するスクリプトも何度叩いても同じ状況が保てるように工夫しておくと、普段の環境の更新にも便利です。

~/.*へのsymlink

そもそもdotfilesは.で始まるファイルを管理するものなので、これがなければ始まりません。
たとえばあなたのdotfilesルートディレクトリにある.*をすべて~/.*にsymlinkを貼るスクリプトは以下のようになります。

repository_root=`cd $(dirname $0); pwd`

for dotfile in `ls -A ${repository_root} | grep "^\."`; do
  from="${repository_root}/${dotfile}"
  to="${HOME}/${dotfile}"

  if [ ! -e $to ]; then
    ln -s $from $to
  fi
done

.*なファイルを追加するだけでよく、スクリプトの保守に手間がかかりません。

Homebrew

brew bundleは死にました。Brewfileはなくても、以下のようにすれば管理に手間はかからないはずです。

if ! which -s brew; then
  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

BREW_PACKAGES="
  go
  openssl
  rbenv
  readline
  reattach-to-user-namespace
  ruby-build
  tmux

  peco/peco/peco
  motemen/ghq/ghq
  caskroom/cask/brew-cask
"

for package in $BREW_PACKAGES; do
  if brew list -1 | grep -q "^$(basename $package)"; then
    echo "Skip: brew install ${package}"
  else
    brew install $package
  fi
done

brew tap peco/peco; brew install pecoとかやめてbrew install peco/peco/pecoにしましょう

Homebrew Cask

手でdmgを落としてきてインストールする時代は終わりました

CASK_PACKAGES="
  alfred
  google-chrome
  google-japanese-ime
  iterm2
  karabiner
  yorufukurou
  dropbox
"

for package in $CASK_PACKAGES; do
  if brew cask list -1 | grep -q "^${package}"; then
    echo "Skip: brew cask install ${package}"
  else
    brew cask install $package
  fi
done

キーバインド

Karabiner(元KeyRemap4MacBook)は非常に便利で、キーバインドで困ったらこれでほぼ解決することができます。
これをシェルからセットアップする方法も共有します。

if ! pgrep -q Karabiner; then
  sql="
    INSERT OR REPLACE INTO access
    VALUES('kTCCServiceAccessibility','org.pqrs.Karabiner-AXNotifier',0,1,0,NULL);
  "
  sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "${sql}"
  open -a Karabiner.app
fi

# /Applications/Karabiner.app/Contents/Library/bin/karabiner export > karabiner.sh
# を事前にしておく
source karabiner.sh

Macは セキュリティ>プライバシー>アクセシビリティ にあたるデータはsqliteで管理していて、そこに上記のSQLを流すことによってKarabiner_AXNotifierの設定を省略できます。
また、Karabinerは一度起動すると自分でlaunchdに登録してくれるので、一度起動してしまうだけでセットアップはオッケーです。

肝心の設定は、/Applications/Karabiner.app/Contents/Library/bin/karabiner export現在の設定を再現するシェルスクリプトを吐き出すので、これを利用します。

その他

他にも自動化したら逐次追記します

感想

自動化楽しい!!!!!!!!!!!!