🖥️

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

2021/08/21に公開

追記

解決したい課題

結果

  • 環境構築に必要なツールはDockerのみになった。
    • MintはHomebrewからgit submoduleに変更。
    • CococPodsはbundlerからDockerに変更。
Mint (in project directory)
├─ Carthage
├─ xcodegen
├─ swiftgen
└─ swiftlint

Docker
└─ CocoaPods
  • サンプルはyusuga/xcode-setup
  • まだ細かい最適化はできそうだけど、グローバル環境を汚染しないという意味ではこれで要件は満たせたと思う。これで、XcodeとDockerさえインストール済みならどの環境でもmakeコマンドのみで環境構築できるようになったはず。

改善方法の詳細

MintのインストールにHomebrewを使いたくない

  • HomebrewはMintをインストールするためだけに使っていたので、逆にいうとMintのインストールをHomebrew以外にすれば良いということになるので、 git submodule で追加する方法に変更。
git submodule add git@github.com:yonaskolb/Mint.git App/Mint
  • MintはMakeコマンドでのビルドをサポートしているので以下でビルドしてmintを生成。
    • App/Mint/.build/apple/Products/Release/mint に生成される。
make -C ./App/Mint build

Mint経由でインストールするツールの保存先をプロジェクト配下のディレクトリにする

  • mintはツールのインストール先を MINT_PATH で指定可能なので、 App/.mint/lib に変更する。
MINT_PATH=App/.mint/lib App/Mint/.build/apple/Products/Release/mint bootstrap -m App/Mintfile

CocoaPodsのインストールにbunlderを使いたくない

  • bundler経由でインストールしていたCocoaPodsをDockerに変更。
    • Imageはrenovate/cocoapodsを使用。
    • -u--allow-root でrootでの実行を指定しているのは、CircleCIでの処理を考慮しているため。
docker run \
  --rm \
  -v App:/local \
  -w /local \
  -u $(id -u root):$(id -g root) \
  renovate/cocoapods:1.10.1 \
    pod --allow-root install
  • bundlerを除外できたのはとても嬉しくて、rbenvを使ってたとしてもローカルのRubyのバージョン管理がとてもめんどくさくて、チームメンバーからもRuby起因での環境構築ができないという問い合わせが一番多かった…。

Makefileを改善

  • 上記すべてをMakefileに反映。

CircleCI、Fastlaneを整備

  • Xcodeの環境構築とは違うので詳細は割愛しますが、Makefileを活用しつつCircleCIFastlaneの実装例を追加。
    • 一部Privateリポジトリを参照しているのと、アカウント情報が僕のものなのでそのままでは実行はできませんのであくまでも参考程度に。
    • CircleCIのdockerを使う部分はもっと改善の余地があるかも。ExecutorをLinuxとDockerのどっちの方が速いのか判断つかず、とりあえずLinuxを選択。
  • Fastlaneは基本はCircleCI上でしか実行しないので、インストールはbundlerを使用し、アプリの環境構築とは別にMakefileを用意。

Discussion