Macの環境移行を自動化する！（アプリ編）

<h2>概要</h2>
<p>
Macbookの動きがだんだんと遅くなってきたのでクリーンインストールを検討してるのですが、すべてを構築し直すのはとても面倒…。なので現在インストール済みのアプリを取得し、シェルスクリプトで自動的にインストールする方法を考えました。
</p>

<h3>目的</h3>
<ul>
<li>メインPCでインストールしてるアプリをサブMacに入れたい</li>
<li>クリーンインストールのアプリ再インストールの手間を省きたい</li>
</ul>

<h3>今回紹介する手段</h3>
<p>Homebrewのcaskを使用して、アプリをインストールします。<br>参考サイト：<a href="https://qiita.com/7coAim/items/fe8ac542a78f9f985572">Macのセットアップを自動化！３つのポイント</a></p>

<p>自分でポチポチ打つのも面倒なので…。</p>

<p>Python3を使用してApplecationsフォルダのアプリを取得し、シェルファイルを自動生成します。自動生成されたシェルファイルを移行先で実行するという方法です。</p>

<h3>注意点</h3>
<ul>
<li>Homebrewでインストール可能なアプリのみです。１００％ではありません。</li>
<li>インストール不要なアプリがある場合は、Pythonから出力されたシェルファイルを削除してください。</li>
</ul>

<h3>実行環境（確認）</h3>
<ul>
<li>macOS Mojave</li>
<li>Homebrew 2.1.6</li>
<li>Python 3.7.3</li>
<li>tqdm 4.31.1</li>
</ul>

<h2>実践</h2>
<h3>複製元のMacで行う(メインMac)</h3>
<p>Xcode-selectをインストール</p>
```terminal
$ xcode-select --install
```
<p>Homebrewをインストール</p>
```terminal
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


<p>
以下、Python3のコードを実行する。<br>
リンク：<a href="https://github.com/AkiUnleash/brew_cask_install">GitHubでも公開中｜AkiUnleash/brew_cask_install</a>
</p>

```python
# coding: UTF-8
import os
import glob
import subprocess
import re
from tqdm import tqdm

# コマンド出力結果を返す関数
def res_cmd(cmd):

    # コマンド結果の出力
    return subprocess.Popen(
        cmd, stdout=subprocess.PIPE,
        shell=True).communicate()[0]

# brew serch コマンドテキスト発行する
def brew_search(appName):

    # コマンドの内容
    cmd = ("brew search " + appName)

    # 結果の判断
    return 1 if appName in str(res_cmd(cmd)) else 2

# 検索したファイル名を配列にする(result_arr)
def globFileInfo(directry):

    # 配列宣言
    result_arr = []

    # ApplicationsフォルダのApp名を取得→配列化
    files = glob.glob(directry)
    for file in tqdm(files):
        # ファイル名を取得→全小文字／スペースはハイフンに置換
        fname = os.path.basename(file)
        fname = fname[0:len(fname)-4:].lower().replace(' ', '-')

        # brew search でインストール可能化の確認(可=1/不可=2)
        flg = brew_search(fname)

        # 配列に取り込む
        result_arr.append([fname, file, flg])

    return result_arr


if __name__ == "__main__":


    # appファイルを検索して配列化
    result_arr = globFileInfo("/Applications/*.app")
    result_arr = result_arr + globFileInfo("/Applications/**/*.app")

    # result_arrのflgでソートする
    result_arr = sorted(result_arr, key=lambda x: x[2])

    # シェルファイル作成
    outputSh = './brew_cask_install.sh' 
    with open(outputSh, 'w'):pass

    # シェルファイルの追記
    f = open(outputSh, 'a')

    # shファイルを出力する
    for r in tqdm(result_arr):
        status = 'installable' if r[2] == 1 else 'not installable'
        f.write('#[' + status + ']' + r[1] + '\n')
        if r[2] == 1:
            f.write('brew cask install ' + r[0] + '\n\n')
        else:
            f.write('# brew cask install ' + r[0] + '\n\n')

    # シェルファイルの追記クローズ
    f.close

    # パーミッションの変更(実行可にする)
    os.chmod(outputSh, 0o744)

```

<h3>複製先のMacで行う（クリーンインストール後orサブMac）</h3>

<p>
上記Pythonコードを実行すると、以下「brew_cask_install.sh」が出力されます。
必要なアプリのみ残し（不要であればコードを削除して）、複製先のMacで実行してみてください。<br>
brewではインストール不可能なアプリはコメントで[not installable]として出力されます。
</p>

```shell
#[installable]/Applications/Visual Studio Code.app
brew cask install visual-studio-code

#[installable]/Applications/SourceTree.app
brew cask install sourcetree

#[installable]/Applications/XMind.app
brew cask install xmind

  ・・・（中略）・・・

#[not installable]/Applications/feedly.app
# brew cask install feedly

#[not installable]/Applications/Xamarin Workbooks.app
# brew cask install xamarin-workbooks
```

<h2>おわりに</h2>
<p>
自動化する！と少しつりぎみな見出しになっていますが…インストールの手間は少し省けると思われます。今後はシステム環境設定の環境移行の自動化にチャレンジします。<br>
誤りがあればご指摘いただけると助かります。
</p>

<h2>変更履歴</h2>
<p>
2019/07/09:初版
</p>