【mac】開発環境構築を dotfile + mackup + git + ...etc を使って最短で仕上げる（その１）

## 環境構築ほど面倒なものはない
macを買い換えたときに、開発環境をそっくりそのまま移行するのって、とても面倒なので、どうにか簡潔にできないかって思ったところ「dotfile」「mackup」などがあるらしく。それらの設定ファイルを「git」で管理して、いつでもどこでも同じような開発環境が構築できるようにします。

## 作業の流れ
### homebrewなどを整理する
意外とインストールばっかりで整理しないmacportsやhomebrewを掃除します。これだけで数GBの容量が稼げる場合があるので、容量が足りない人は実行してみる価値ありです。

これらのサイトが参考になりました。
https://qiita.com/billthelizard/items/b0dec28bdb15d4d97921
https://qiita.com/fuqda/items/db8aff0ba4068aea2cc6

### masを導入する
https://github.com/mas-cli/mas

App Storeからインストールする必要のあるアプリをCLIからインストールできる仕組み。 homebrew-bundle にも対応しているので、homebrew-bundle経由でインストールを実行することも可能です。 次に説明する homebrew-cask もだが、自分の使う全てのMacで必要なもの（エディタとかSNS, ブラウザとか）はこれで導入することにした。

```sh
brew install mas
```

`mas list`で現在のmacに入っているアプリでApp Store経由でインストールした物が表示される。

```zsh
~ via Node v10.14.2
✦ ❯ mas list
1333542190 1Password 7 (7.4.1)
405399194 Kindle (1.26.1)
441258766 Magnet (2.4.5)
844918735 PicGIF Lite (2.0.8)
497799835 Xcode (11.3)
409183694 Keynote (9.2.1)
425424353 The Unarchiver (4.1.0)
823766827 OneDrive (19.192.0926)
803453959 Slack (4.2.0)
409201541 Pages (8.2.1)
539883307 LINE (5.20.1)
1176895641 Spark (2.5.1)
409203825 Numbers (6.2.1)
897118787 Shazam (2.9.0)
```

次に説明する homebrew-bundle と連携させることができるが、直接masを触ることはなく、インストールされていれば自動的にピックアップしてくれるようなので、masに関しては一旦これで終わり。

### homebrew-bundleを導入する
https://github.com/Homebrew/homebrew-bundle

Brewfileというファイルを作っておいてその中に必要なものを書いておいてbrew bundleコマンドで複数パッケージをまとめてインストールすることができるみたいです。しかも「mas」のリストを自動的にdumpしてくれるという優秀ぶり。

brewが入っていれば`brew bundle`と実行するだけで初期設定を行ってくれる。初回起動時は Brewfile が見つからないと言われるが、実行できる状態にはなっている。

```zsh
~ via Node v10.14.2
✦ ❯ brew bundle
==> Tapping homebrew/bundle
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-bundle'...
remote: Enumerating objects: 92, done.
remote: Counting objects: 100% (92/92), done.
remote: Compressing objects: 100% (82/82), done.
remote: Total 92 (delta 5), reused 32 (delta 4), pack-reused 0
Unpacking objects: 100% (92/92), done.
Tapped 1 command (190 files, 266.9KB).
Error: No Brewfile found
```

現在インストールされているパッケージをピックアップするために`dump`を指定して実行すると、ファイルとして書き出してくれるようだ。これをdotfilesで管理することで、どのmacでも同様のパッケージを維持することができる。ファイルの中身は後々編集するとして、dotfilesへファイルを移動して、シンボリックリンクを作ることを忘れないように。

```sh
brew bundle dump
mv Brewfile dotfiles/
ln -s dotfiles/Brewfile .
```

masが入っているので、dumpによって生成されたファイルを確認すると、ファイルの下の方にmasの行があることが確認できるはずだ。。。すごい。

```
:
:
mas "1Password 7", id: 1333542190
mas "Keynote", id: 409183694
mas "Kindle", id: 405399194
mas "LINE", id: 539883307
mas "Magnet", id: 441258766
mas "Numbers", id: 409203825
mas "OneDrive", id: 823766827
mas "Pages", id: 409201541
mas "PicGIF Lite", id: 844918735
mas "Shazam", id: 897118787
mas "Slack", id: 803453959
mas "Spark", id: 1176895641
mas "The Unarchiver", id: 425424353
mas "Xcode", id: 497799835
```

### homebrew-caskを使うようにする
https://github.com/Homebrew/homebrew-cask

App Storeで配信されていないアプリ（.pkgなど外部からインストールするアプリ）をCLIでインストールするために使います。caskの利用設定はこちらの記事が参考になります。
https://qiita.com/swallowtail62/items/61244ea3c7d00f692823

自分のインストールしているアプリが`cask`に対応していれば、caskからのインストールに置き換える方が今後簡単に環境を移行することができます。
（※ 基本的に最新バージョンしかインストールすることができないようです。ダウングレードインストールもできるようですが、骨が折れそうな作業をしている方が多数だったためオススメしません。その場合は手動でインストールする方がよさそうです。）


自分のインストールしたいアプリが対応しているか検索してみましょう（例: google chrome）

```zsh
~ via Node v10.14.2 took 2s
✦ ❯ brew search chrome
==> Formulae
chrome-cli                                                          chrome-export

==> Casks
chrome-devtools                              epichrome                                    homebrew/cask-versions/google-chrome-canary
chrome-remote-desktop-host                   google-chrome                                homebrew/cask-versions/google-chrome-dev
chromedriver                                 mkchromecast
dmm-player-for-chrome                        homebrew/cask-versions/google-chrome-beta
```

こんな感じで検索結果が出てくるので「Casks」の部分に注目してください。「google-chrome」があると思うので、cask経由でインストールできそうです。caskでインストールするアプリの詳細をみたい場合にはinfoコマンドを利用します。

```zsh
~ via Node v10.14.2
✦ ❯ brew cask info google-chrome
google-chrome: 79.0.3945.130 (auto_updates)
https://www.google.com/chrome/
Not installed
From: https://github.com/Homebrew/homebrew-cask/blob/master/Casks/google-chrome.rb
==> Name
Google Chrome
==> Artifacts
Google Chrome.app (App)
```
Casksにない場合はCLIインストールができないので、手動インストールになります。
（※ homebrew-caskにプルリク発行して追加してもらうっていうやり方もあるみたいです。）
https://qiita.com/DriftwoodJP/items/2fae455dc04adea17f96


### 各環境ファイルを保存するディレクトリ作成
とりあえず「~/dotfiles」を管理するファイルを集めるディレクトリとしておきます。このディレクトリに「.zshrc」「.mackup.cfg」とかを入れて、それらのファイル群を「git」で管理します。gitでリポジトリを作成してリポジトリのリンクを取得しておいてください。

```sh
cd
mkdir dotfiles ; cd dotfiles ; git init
git push --set-upstream origin master
echo "# dotfiles" >> README.md ; git add README.md
git commit -m "first commit"
git remote add origin https://github.com/xxxxxxxxxxx/yyyyyyyyy.git
git push
```

これでgitにコミットできるようになりました。今後「dotfiles」内のファイルを変更した時にはコミットするようにしましょう。

#### .zshrc
「~/.zshrc」を「~/dotfiles/.zshrc」にコピーしてシンボリックリンクを作っておきます。

```sh
cd
mv .zshrc dotfiles/
ln -s dotfiles/.zshrc .
```

いままで「oh-my-zsh」を使ってたんですが、これが死ぬほど重くなって使えなかったので、これを機に使うのをやめました。結果、現在の.zshrcの中身はこんな感じ（※ aliasとかPATH設定は除いて記載してます）

```sh
# Tabで選択できるように
zstyle ':completion:*:default' menu select=2

# 補完で大文字にもマッチ
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# ファイル補完候補に色を付ける
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

setopt auto_param_slash       # ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt mark_dirs              # ファイル名の展開でディレクトリにマッチした場合 末尾に / を付加
setopt auto_menu              # 補完キー連打で順に補完候補を自動で補完
setopt interactive_comments   # コマンドラインでも # 以降をコメントと見なす
setopt magic_equal_subst      # コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる
setopt complete_in_word       # 語の途中でもカーソル位置で補完
setopt print_eight_bit        # 日本語ファイル名等8ビットを通す
setopt extended_history       # record timestamp of command in HISTFILE
setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE
setopt share_history          # 他のターミナルとヒストリーを共有
setopt histignorealldups      # ヒストリーに重複を表示しない
setopt hist_save_no_dups      # 重複するコマンドが保存されるとき、古い方を削除する。
setopt extended_history       # $HISTFILEに時間も記録
setopt print_eight_bit        # 日本語ファイル名を表示可能にする
setopt hist_ignore_all_dups   # 同じコマンドをヒストリに残さない
setopt auto_cd                # ディレクトリ名だけでcdする
setopt no_beep                # ビープ音を消す

# コマンドを途中まで入力後、historyから絞り込み
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
```

#### mackup
mackupを利用すれば、設定ファイルなどを特定のディレクトリに同期・特定のディレクトリからリストアすることができるので、各アプリケーションの環境設定を１から設定することなく移行することができるみたいです。

とりあえずインストールしておきます。

```sh
brew install mackup
```

このmackupの設定ファイルが「~/.mackup.cfg」を読み込むようになっているので、手動で「~/dotfiles/.mackup.cfg」を作ってシンボリックリンクを作っておきます。

```sh
cd dotfiles
touch .mackup.cfg
cd
ln -s dotfiles/.mackup.cfg .
```

以下の内容を`.mackup.cfg`に書き込みます

```
[storage]
engine = file_system
path = dotfiles
```

ここで注意が必要で「dotfiles」で「.bashrc」などを管理して、さらに別の場所にインストールしてシンボリックリンクを貼る、 みたいな設定をしてる場合にはちょっと注意が必要で、 mackupをしてしまうと一度mackupのシンボリックになり、uninstallすると 実体そのものが「~/.bashrc」に作られるので元のdotfilesとのリンクが切れてしまいます。

なので、dotfileで管理するものはバックアップしないように指定しておきます。mackup自身もdotfileで管理する場合にはmackupもignore指定してください。

`mackup list`を実行すれば、対象のアプリケーション名が表示されるので、そこからピックアップして設定してください。[applications_to_ignore]を追記することで、環境設定をバックアップしないアプリケーションを指定することができます。

```
[applications_to_ignore]
bash
vim
zsh
mackup
# 必要に応じて追記してください。
```

そして`mackup backup`を実行します。自分の場合はAdobe Illustratorのバックアップでエラーがでていたので環境設定をバックアップしない方向性にするので`.mackup.cfg`に以下を追記します。

```
[applications_to_ignore]
illustrator
```

とりあえずここまでにして、時間見つけて「その２」を書き上げます...。