Carthage で SwiftDate を更新したらエラー “Task failed with exit code 65:” が発生する

環境

Version
Xcode 9.2
Carthage 0.29.0
SwiftDate 4.5.1

Carthage 経由でインストールしていた SwiftDate を 4.5.1 へ更新したときに以下のようなエラーが起きました。

*** Building scheme "SwiftDate-iOS" in SwiftDate.xcodeproj
*** Building scheme "SwiftDate" in SwiftDate.xcodeproj
Build Failed
Task failed with exit code 65:
/usr/bin/xcrun xcodebuild -project ...

This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: ...

考える

エラーログを見てみると SwiftDate-iOSSwiftDate 2 つの Scheme がビルドされていることがわかります。
たしか前のバージョンまでビルドされる Scheme は 1 つだけだったと思うのですが増えたのでしょうか?

なんにせよ SwiftDate Scheme のビルドに失敗しているのでチェックアウトしたリポジトリを覗いてみます。

ローカルのチェックアウトしたリポジトリを覗く

Finder で見てみます。

(名前).xcodeproj/Carthage/Checkouts/SwiftDate/

どうやら SwiftDate.xcodeproj が 2 つあるようです。
そのうち画像の
– 上の方は デモ用のプロジェクト
– 下の方は SwiftDate 本体

のようです。

この内ビルドエラーを出している Scheme を持つのはデモ用のプロジェクトの方でした。
つまり デモ用のプロジェクト がビルドエラーの原因だったのです。

疑問

  • なぜデモ用のプロジェクトはビルドに失敗しているのか?
  • ていうかそもそもなぜデモ用のプロジェクトをビルドしているのか?

よく分からなくなってきました。

考える2

SwiftDate ほどの OSS がこんなにわかりやすいビルドエラーを放置するとは考えにくいです。それらしい issue もなかったし。
おそらく問題の原因は使う側(つまり僕)にあるはずです。

こういうときはなるべく 素の状態から再現しないか検証するのが良い と先輩に教わったので、先輩の教えに従い実験してみます。

実験

というわけでまっさらなプロジェクトを作成して SwiftDate 4.5.1 を Carthage でインストールしてみました。

Cartfile

github "malcommac/SwiftDate" "4.5.1"

すると

$ carthage update --platform iOS
*** Fetching SwiftDate
*** Checking out SwiftDate at "4.5.1"
*** xcodebuild output can be found in /var/folders/_t/plhyy8m17zd6z0t809k7phv00000gn/T/carthage-xcodebuild.ghY5hb.log
*** Building scheme "SwiftDate-iOS" in SwiftDate.xcodeproj

なんと何の問題もなくビルドが成功するではありませんか!
やはり原因は手元のリポジトリにあったようです。

解決

で、結論から言うと チェックアウトした SwiftDate リポジトリを削除 することで解決しました。

ビルドエラーが起きる SwiftDate のディレクトリ

ビルドエラーが起きない SwiftDate のディレクトリ

よくみると デモ用のプロジェクトと同階層に存在するディレクトリ があったりなかったりしています。
これが怪しかったので Carthage/Checkouts/SwiftDate ディレクトリをまるごと削除したあとに

$ carthage update --platform iOS

を実行すると、ビルドエラーが起こらなくなりました。これで解決!

残った疑問

  • 同じバージョンの SwiftDate をインストールしたはずなのになぜ Checkout したディレクトリ構造に差が出たのか
  • なぜ Carthage は最初にデモ用のプロジェクトまでビルドしていたのか

Carthage の細かい使用を把握していたら疑問も解けるかもしれませんがしんどいのでこの辺にしておきます。

学び

  • 原因を探るのに 素の状態から再現しないか検証する 手法は有効