9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

XcodeのBuild Phasesでmintを実行する時の注意点

Last updated at Posted at 2020-10-22

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 で実行するツールがまだインストールされていない場合は、インストールするところから始まります。この時、次のようなエラーが発生する場合があります。

SwiftLintインストール時の例
🌱 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
9
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?