XcodeのBuild Phasesにて、SwiftGen のような自動生成ツールや、SwiftLint のような静的解析をかけることがよくあると思います。
最近、それらのツールを Swift CLI 用パッケージマネージャー Mint で管理するようにしました。その時に少しつまづきポイントがあったので記録します。
Mintfile のあるディレクトリで実行しよう!
Mintfile でパッケージを指定している場合、Mintfile の存在するディレクトリで mint を実行する必要があります。そうしないと次のように mint の実行が失敗します。
mint run SwiftLint
# 👉 🌱 "swiftlint" package not found
Build Phases スクリプト実行時のカレントディレクトリに Mintfile がないような場合は、Mintfile のディレクトリに移動してから実行するようにしましょう。
環境変数SDKROOTを解除しよう!
mint run
で実行するツールがまだインストールされていない場合は、インストールするところから始まります。この時、次のようなエラーが発生する場合があります。
🌱 Cloning SwiftLint 0.40.3
🌱 Resolving package
/private/var/folders/m7/c2p5rh6d73g56sqnz33wrzsw0000gn/T/mint/github.com_realm_SwiftLint: error: manifest parse error(s):
<unknown>:0: warning: using sysroot for 'iPhoneSimulator' but targeting 'MacOSX'
<unknown>:0: error: unable to load standard library for target 'x86_64-apple-macosx10.15'
これは、SwiftLint を macOS 向けにビルドしようとしているのに、利用するSDKがiOSシミュレーター用になっているためです。具体的には、XcodeでiOSのアプリをビルドする場合、Build Phasesでは環境変数 SDKROOT
がiOSシミュレーター用のSDKパスが指定されています。例えばこんな感じです。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.1.sdk
スクリプト実行の間だけ、環境変数 SDKROOT
を解除することで回避することができます(が、後述のxcrunを使う方法がベターです)。
unset SDKROOT
mint run swiftlint
(2020/11/24追記)
@uhooi さんに、より安全な方法として、xcrunコマンドで使用するSDKを指定する方法を教えていただきました。こちらをオススメします。
xcrun --sdk macosx mint run swiftlint