Ruby
Mac
GitHub
dotfiles

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

More than 3 years have 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現在の設定を再現するシェルスクリプトを吐き出すので、これを利用します。


その他

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


感想

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