くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Homebrew BundleとGitでMacBookPro(Intel)からMac mini(M2)に移行する

前に使っていたMacBookPro(Intel)がだいぶガタついてきたので、
Mac mini(M2)に買い替えた。

IntelプロセッサからAppleシリコンに変わるので、
移行アシスタントだとうまくいかないようだったので、
クリーンインストールするようにした。

ただ、愚直にやっているとつらいので、
簡単に環境構築できないかといろいろ調べてみたときの備忘録(*´ω`*)

Homebrew BundleとGitで整えた感じ。

これが意外によく、あとで外出用のサブ機としてMac Book Air(M2)を買ったけど、
そのまま利用できるようになった(*´ω`*)

利用したツール

開発中のソースやドキュメントは、Gitやクラウドストレージにある前提。

Homebrew Bundleでアプリなどを管理

Homebrew Bundleは、Brewfileというファイルに指定したアプリなどを一括インストールできるツール。

対応しているのはこのあたり。

Homebrew (on macOS or Linux) for installing dependencies.

Homebrew Cask is optional and used for installing Mac applications.

mas-cli is optional and used for installing Mac App Store applications.

Whalebrew is optional and used for installing Whalebrew images.

Visual Studio Code is optional and used for installing Visual Studio Code extensions.

Brewfileの例はこんな感じ。

# 'brew tap'
tap "homebrew/cask"
# 'brew install'
brew "imagemagick"
# 'brew install --cask'
cask "google-chrome"
# 'mas install'
mas "1Password", id: 443987910
# 'whalebrew install'
whalebrew "whalebrew/wget"

# 'vscode --install-extension'
vscode "GitHub.codespaces"

基本的にはアプリはHomebrewでインストールするようにしてる。

Gitで設定ファイルを管理

.bashrcなどの設定ファイルはGitで管理する形。いわゆる、dotfiles。

必要なものとしては、

  • .bashrcなどの管理する設定ファイル
  • 設定ファイルを配置するinstall.sh

できないこと/しないこと

基本はこの2つでできるけど、

  • Homebrew Bundleでインストールできないアプリなど
  • .ssh/など機密性の高いファイル
  • キーチェーンの証明書
  • 各種アプリの設定
  • ソースコード中の.gitignoreに指定しているファイル

などは手動で対応しないといけない。

キーチェーンについてはこちらでできるっぽい。

移行の流れ

移行元: 対象のファイルを特定/整理する

まずは、いるもの/いらないものを整理する

不要なアプリなどはこのときに削除するのもいい。

移行元: Brewfileを作成する

インストール済みのアプリから.Brewfileを作成できる。

# ~/.Brewfileの作成
$ brew bundle dump --global -f
$ head .Brewfile 
tap "dart-lang/dart"
tap "heroku/brew"
tap "homebrew/bundle"
tap "homebrew/cask-versions"
tap "leoafarias/fvm"
brew "act"
...

移行元: dotfilesをリポジトリを準備する

移行・管理するファイルをdotfiles/にまとめ、
リポジトリを作成しておく。

$ mkdir ~/.dotfiles
$ cd ~/.dotfiles
$ git init ~/dotfiles

対象としてはこんな感じ。

.
├── .aws
│   ├── config
│   └── credentials
├── .bash/
├── .config
│   ├── configstore/
│   ├── firebase/
│   ├── flutter/
│   ├── gcloud/
│   ├── gh/
│   └── tabtab/
├── .vim/
├── bin
│   └── install.sh
├── solarized
│   ├── dircolors.256dark
│   ├── dircolors.ansi-dark
│   ├── dircolors.ansi-light
│   ├── dircolors.ansi-universal
│   ├── solarized_dark.terminal
│   └── solarized_light.terminal
├── .Brewfile
├── .actrc
├── .bash_profile
├── .bashrc
├── .gitconfig
├── .gitignore
├── .gitignore_global
├── .vimrc
└── README.md

.bashrcなどはもちろんだけど、
.aws.config配下などにCLIツールの設定ファイルがあるので注意。

credentialsなど認証情報や資格情報もあるので、
gitで管理ではなく、手動で移行するほうが安全なので、
中身はよく確認しておく。

移行元:

こちらの記事を参考にbin/install.shはこんな感じ。

#!/usr/bin/env bash
set -ue

helpmsg() {
  command echo "Usage: $0 [--help | -h]" 0>&2
  command echo ""
}

link_to_homedir() {
  command echo "backup old dotfiles..."
  if [ ! -d "$HOME/.dotbackup" ];then
    command echo "$HOME/.dotbackup not found. Auto Make it"
    command mkdir "$HOME/.dotbackup"
  fi

  local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
  local dotdir=$(dirname ${script_dir})
  if [[ "$HOME" != "$dotdir" ]];then
    for f in $dotdir/.??*; do
      [[ `basename $f` == ".git" ]] && continue
      if [[ -L "$HOME/`basename $f`" ]];then
        command rm -f "$HOME/`basename $f`"
      fi
      if [[ -e "$HOME/`basename $f`" ]];then
        command mv "$HOME/`basename $f`" "$HOME/.dotbackup"
      fi
      command ln -snf $f $HOME
    done
  else
    command echo "same install src dest"
  fi
}

while [ $# -gt 0 ];do
  case ${1} in
    --debug|-d)
      set -uex
      ;;
    --help|-h)
      helpmsg
      exit 1
      ;;
    *)
      ;;
  esac
  shift
done

link_to_homedir
git config --global include.path "~/.gitconfig_shared"
command echo -e "\e[1;36m Install completed!!!! \e[m"

動きとしては、
.dotfiles/配下のファイルを${HOME}直下にln -snfでリンクしている感じ。

また、同じファイルがあったら、$HOME/.dotbackupに退避しておいてくれる。

移行先: 環境構築

# zshからbashに戻す
$ chsh -s /bin/bash

# Homebrewのインストール
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.bash_profile
$ eval "$(/opt/homebrew/bin/brew shellenv)"

# GoogleJapaneseInput用にRosettaをインストール
$ sudo softwareupdate --install-rosetta

# dotfilesのclone: PATを使ってhttpでチェックアウト
$ git clone https://github.com/my-dotfiles-repo/dotfiles.git
  • Xcodeのインストール&許諾に同意する
  • 「システム設定>一般>共有」のファイル共有やリモートログインをONにし、
    .ssh/などを手動で移行
    • システム設定 > 一般 > 共有 > リモートログイン
    • ssh user@192.168.x.xでログインできる
    • scp -r user@192.168.x.x:~/.ssh .sshでコピーできる
  • キーチェーンのファイルを移行
# change permission
$ chmod 600 ~/.ssh/*

# deploy dotfiles
$ ~/.dotfiles/bin/install.sh

# install brew
$ brew bundle --global

# change repo url
$ cd ~/.dotfies
$ git remote set-url origin git@github.com:my-dotfiles-repo/dotfiles.git
  • 再起動して設定を反映する

移行先: 各種アプリのセットアップ

再起動したら、各種アプリのセットアップしていく。
設定が同期できるものはいいけど、手動設定するものが割とある。。

以下は個人的なメモ。

  • terminal の設定
  • Google IMEの設定
  • Spotlight の設定: 不要な検索結果を OFF
    • システム設定 > Siri と Spotlight から
    • アプリケーション / システム設定 / デベロッパ / 計算機を選択
  • デスクトップと Dock の設定:
    • システム設定 > デスクトップと Dock から
    • 自動非表示を ON
    • 最近の APP を OFF
  • 自動スリープの OFF: システム設定>ディスプレイ>詳細設定
  • Finder
    • 隠しフォルダの表示(`Command + Shift + .)
    • 一般: 新規ウィンドウ = HOME ディレクト
    • 一般:タブで開くを OFF
    • サイドバー: 不要な項目を OFF にする
    • 詳細: すべての拡張子を表示を ON
  • Google Drive/Slack など cask でインストールしたアプリの起動と設定
  • fvm で flutter のバージョンのインストール(fvm listで確認)
  • fnm で Node のバージョンをインストール(fnm listで確認)
  • Android Studio/Lombok plugin/ADV
    • AVDはエクスポートできないので手動で対応
    • 最新のAndroid StudioではLombok pluginがインストールできない
  • Boost Note(旧)のインストール
    • Homebrewだと新Boost Noteがはいってしまう。。

などなど。

ハマったポイント

やはりすんなりうまくはいかず、いくつかはまった

まだ、全部はさわれていないので、出てきたら追加していく。


以上!! これでだいぶ楽になった。。(*´ω`*)
家でも外でもがんばるぞ(*´ω`*)

参考にしたサイトさま