Umi Uyuraのブログ

プログラミング関連の作業ログ

Macの環境構築手順を整理してdotfilesにまとめた(BoxenからHomebrewベースへ)

去年は職場のMacやプライベートのMacが頻繁に不調に陥り、何度かMacの環境を作り直すことがあったのですが、Boxenベースの構築ツールを用意していたことで、けっこう助かっていました。

Boxenで環境構築してみました - Umi Uyuraのブログ

とは言え、 Boxenは2013年でオワコンとされている( Mac - Boxen使ってて許されるのは2013年だけだった - Qiita ) し、確かにPuppetモジュールベースはアップデートへ追従していくのがなかなか手間なので、昨年末ころから環境構築方法について見なおしていました。

ようやくMac OSYosemiteにアップデートして、そこである程度動作確認が取れたので、まとめておこうと思います。

方針

おおきくは、以下の方針で整理していこうと考えていました。

  1. 主なアプリはHomebrewベース(brew bundleとHomebrew Cask)で導入する
  2. 各種言語環境のツール類は、それぞれのパッケージシステムを呼び出すスクリプトに細分化しておく

Boxenの場合、この1.と2.を一括して扱うことができました。 そのため、一発実行すれば必要な環境が自動的に構築されるという点では便利でしたが、その分複雑になっていて、メンテナンスの負荷が高いものでした。

そこで、今回は自動化よりは単純さを優先することにして、必要なものをシェルスクリプトレベルでまとめる程度にして、複雑なツールは使わないことにしました。

その分、スクリプトの実行など手作業が必要ですが、実際のところ、環境構築しているときにそのMacのそばにいる場合がほとんどなので、別に全てが自動化されていなくても良いですし、このレベルにしておけば、いずれ優秀な自動化ツールなどができたときに、移行するのもやりやすいのではと考えたからです。

整理したこと

という方針のもと、今回やったことをずらずら書いてみます。

dotfilesをまとめる

まずはBoxenのときには管理していなかった、いわゆるdotfilesをまとめることにしました。

Bashの設定など、ベースは フロントエンドエンジニアのための Dotfiles // Speaker Deck をかなり参考にさせていただきました。

GitHubで管理する

このdotfilesをベースに環境構築手順を整理していくことにしました。

そして、できあがってきたものをGitHubで管理することに。

これで自宅でも会社でも同じ環境が作れますし、随時アップデートもできるようになりました。

umi-uyura/dotfiles

READMEに構築手順を整理する

ブログにまとめておこうと思いましたが、どうせGitHubに諸々置くのであれば、そこに手順書もつけてしまった方が適宜修正や更新もできるし、ということで、READMEに構築手順を書いておくことにしました。

こういったものは時間がたつと忘れてしまうので、とりあえず書いてあるとおりに実行していけば環境が作れるというようなものになっています。

dotfiles/README.md

defaultsコマンドによるOS Xの初期設定をスクリプトにまとめる

BoxenにもOS Xの初期設定のためのPuppetモジュールがありましたが、基本的にモジュールに定義されているものを使うことが主だったので、追加したい設定があったときに若干面倒臭かった覚えがあります。

今回は、素直にMacに用意されているdefaultsコマンドを使って、シェルスクリプトにまとめておくことにしました。

dotfiles/init/osx_defaults.sh

Homebrewアプリはbrew bundleでインストール

brew bundleがすでに非推奨になっているという問題がありましたが、今のところまだ使えている点と、これも最悪シェルスクリプトに置き換えられるので、これは採用することにしました。

一部のFormulaでX11(Xquartz)が必要なものがあったので、それは別ファイル(BrewfileX)として、次のHomebrew CaskでXquartzを導入してからインストールするようにしました。

dotfiles/init/Brewfile dotfiles/init/BrewfileX

Homebrew CaskによるMacアプリのインストール

Macアプリに関しては、当初の目的の通りHomebrew Cask Caskベースで入れることにしました。

これもbrew bundleの仕組みを使って、Caskfileを作成して、 brew bundle Caskfile でインストールする方法にしています。

また、自宅でしか使わないようなKindle for MacAmazon Musicなどは、これも別ファイル(CaskfileOptional)に分けて、使いたいものだけ必要に応じて入れることにしています。

各種言語環境はanyenvベースにする

最近は主にNode.jsを使っていて、たまにRubyPHPなどを触ることがあるので、その辺りの言語環境のバージョン管理をしてくれるツールとして anyenv を使ってみることにしました。

同様のツールは言語環境ごとに探せば色々と出てきますが、ある程度統一した操作で扱えるのが良いなと思った点です。

ただ、*envそれぞれで若干使い方が異なっていたりするようで、意図的に使っているのはNode.js用のndenvとRuby用のrbenvあたりで、jenv、phpenv、goenvあたりは、まだ手探りな感じです。

各言語環境で導入するツール類をインストールするスクリプトにまとめる

主にNode.jsやRubyで使っているツール類をインストールする処理をまとめました。

これはこれで、*envで新しいバージョンの環境を入れたとき、ツール類もそのバージョン上で入れなおさなければならないですが、そのときにこのスクリプトを叩き直せば良くなりました。

dotfiles/init/node_npm.sh

dotfiles/init/ruby_gems.sh

dotfiles/init/go_gets.sh

Goを使った開発はしていないのですが、最近はGoベースの便利ツールがあったりするので、それも用意しています。

OSやアプリの初期設定的なものはメモっておく

defaultsコマンドでカバーできていない設定や、個々のアプリの細かい設定なども忘れてしまうので、ドキュメント化しておくことにしました。

dotfiles/manualsettings.md

Mac App Storeから入れられるものや、手動で入れる(Caskで提供されていない)ものもメモっておく

Homebrew Caskで提供されていないアプリに関しては、Mac App Storeか配布サイトから入れることになるので、何を入れていたか忘れないように、これもドキュメント化しておきました。

dotfiles/doc/manualinstall.md

感想

まずは自分の使っている環境の棚卸しができたので、良かったかなー、と。

とりあえずこのリポジトリを見れば、必要なアプリのインストールや初期設定がわかるという状態になりました。

brew bundle を使っている部分を除けばシェルスクリプトレベルになっているので、これをベースに自動化するなり他の構築ツールを試すなりできるので、探り探りですが、ここから育てていければ良いかな、と思っています。

あとはEmacs用の.emacsも整理対象だったのですが、これはこれだけで色々とあるので別リポジトリで管理することに。

こちらについても後でまとめようと思います。

Boxen環境の削除

もう使うことはなさそうな気がするけど、Boxen環境を削除するときにやったことを一応メモ。

Boxen環境の削除

Boxenが提供しているコマンドを使います。

$ ./script/nuke --all --force
-> Removing /Library/LaunchDaemons/dev.dnsmasq.plist.
-> Removing /Library/LaunchDaemons/dev.nginx.plist.
-> Removing /opt/boxen.
-> Removing /var/db/.puppet_*.
-> Removing git credential helper config.

/var/db/ 内に生成される `.puppet_appdmg_* やら .puppet_compressed_app_installed_* やら .puppet_pkgdmg_installed_* といったファイルは、以前は手動で削除していたのですが、Boxen側で削除してくれるようになっていたようです。(勘違い?)

$HOME/.gitconfig

Boxenが追記したっぽい部分を削除

[credential]
    helper = /opt/boxen/bin/boxen-git-credential

[core]
    excludesfile = /opt/boxen/config/git/gitignore

$HOME/.gemrc

Boxenが作ったっぽいファイルなので削除

# DO NOT EDIT THIS FILE MANUALLY. THIS FILE IS MANAGED BY BOXEN.
#
# Install gems without docs by default
---
gem: --no-ri --no-rdoc

手動でインストールしたアプリを削除

定番 AppCleaner を使ってザクザクッと削除。

ログイン時に自動起動するアプリがあった場合、システム環境設定のログイン項目に設定が残っている("不明"になっている)場合があるようなので、これも削除しました。

参考