🖥️

続々: グローバル環境を汚染しないXcodeの開発環境構築

2022/08/28に公開

解決したい課題

  • 前回の続: グローバル環境を汚染しないXcodeの開発環境構築では、Mintのインストールにgit submoduleを使用していたが、それをSwift Package Manager(SwiftPM)に差し替える。
    • git submoduleは前提知識が必要で若干ハマりやすいため、色々な人が使う環境では可能であれば導入したくない。

結果

  • Carthage、CocoaPods、XcodeGenなどよく利用する開発周辺ツールを使うプロジェクトで、XcodeとDockerのみで環境を構築
    • 前回からの差分でMintのインストールは、git submoduleからSwiftPMに変更
    • CococPodsはDockerで実行
  • サンプルはyusuga/xcode-setup
Mint (in project directory)
├─ Carthage
├─ xcodegen
├─ swiftgen
└─ swiftlint

Docker
└─ CocoaPods

変更の詳細

MintをSwiftPMでインストール

本筋ではないが、MintをSwiftPMに変更するためにMintのgit submoduleを削除した時のメモ
git submodule status
 30101d25524043fd753d25d033b438f943a585b5 App/Mint (0.17.1-2-g30101d2)
  • submoduleのファイルツリーと .gitmodule ファイル内のSubmoduleのエントリを削除
git rm App/Mint
rm 'App/Mint'
  • git submoduleの一覧を表示して消えていることを確認
git submodule status
  • .git/modules 内のSubmoduleのディレクトリと .git/config のエントリを削除
    • これらは別のリポジトリからフェッチせずに過去のcommitにchekcoutできるようにするためにある
rm -rf .git/modules/App/Mint && \
git config --remove-section submodule.App/Mint
  • SwiftPMでMintをインストール & 実行するMakeコマンドを追加
MINT_EXECUTABLE := xcrun -sdk macosx swift run --package-path $(SWIFT_PACKAGES_PATH) mint

mint := MINT_PATH=$(MINT_LIBRARY_DIR) $(MINT_EXECUTABLE)
mint_run := $(mint) run --mintfile $(MINTFILE_PATH)
  • SwiftPM経由で mint bootstrap を実行
    • 初回のみgitリポジトリのフェッチとライブラリのビルドが走る
mint:
	$(mint) bootstrap --mintfile $(MINTFILE_PATH)
  • Makeコマンド経由で mint run を実行しやすくするためのコマンドを用意
mint_which:
	$(make) mint_execute COMMAND='which'

mint_run:
	$(make) mint_execute COMMAND='run'

mint_execute:
ifndef COMMAND
	@echo "make mint_execute COMMAND=<コマンドを指定してください>\n例: make mint_execute COMMAND=run"
	@exit 1
endif
ifndef OPTIONS
	@echo "make mint_execute $(COMMAND) OPTIONS=<オプションを指定してください>\n例: make mint_execute COMMAND=run OPTIONS=xcodegen"
	@exit 1
endif
	$(mint) $(COMMAND) --mintfile $(MINTFILE_PATH) $(OPTIONS)
  • Xcodeのビルドスクリプトで実行している、SwiftLintを変更
    • CIから mint run を呼び出す場合もMakeコマンド経由だと楽
    • OPTIONS 周りの記述方法が気になるようだったら、それぞれMakeコマンドを用意する
if make mint_which OPTIONS='swiftlint' >/dev/null; then
    make mint_run OPTIONS='swiftlint --strict'
else
    echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

Makefileを更新

今後

Discussion