XCode10でビルドできなくなった時にやったこと - Multiple commands produce error

XCode10がリリースされ、早速手元にあるXCode9でビルドしたアプリもXCode10用にビルドしようとした際に以下のエラーが発生しました。

error: Multiple commands produce '/Users/{アカウント名}/Library/Developer/Xcode/DerivedData/{アプリ名}-hievebmhhbbmlybyrcuahkuwpdgk/Build/Products/Debug-iphonesimulator/{アプリ名}.app':
1) Target '{アプリ名}' has create directory command with output '/Users/{アカウント名}/Library/Developer/Xcode/DerivedData/{アプリ名}-hievebmhhbbmlybyrcuahkuwpdgk/Build/Products/Debug-iphonesimulator/{アプリ名}.app'
2) That command depends on command in Target '{アプリ名}': script phase “[CP] Copy Pods Resources”

原因は、XCodeのbuildシステムのデフォルトが変更された事によります。
buildシステムについては、以下から確認できます。

f:id:project-unknown:20180923190113p:plain

f:id:project-unknown:20180923190145p:plain

上記のように、XCode10からは、New Build Systemがデフォルトになっています。
(XCode9までは、Legacy Build Systemに該当するものがこれに当たります)

これに対する対処法は、2通りあります。

  1. Product Nameで${TARGET_NAME}を使うのをやめる
  2. Legacy Build Systemを採用する

結論を言うと、私は今回の対応で2を選択しました。
今回は、それぞれの対応方法についでご紹介します。

対応方法1 Product Nameで${TARGET_NAME}を使うのをやめる

おそらくこれが推奨されるやり方です。

Build Settings -> Product Name

ここに${TARGET_NAME}で設定されているものを、環境変数を使うのではなくて、手打ちでProduct Nameを入力します。

f:id:project-unknown:20180923190543p:plain

今回、私がやったのはTimeHackerアプリの設定を行ったので、「TimeHacker」と入力しました。

後は、WidgetやWatchでも同様の事を実施して、Buildするだけです。

…が、私の場合、おそらくCocoaPodsのパッケージ依存か何かでうまく動きませんでした。

対応方法2 Legacy Build Systemを採用する

冒頭で紹介したWorkspace Settings...の設定をLegacy Build Systemに変更します。
これでこれまでのBuild(XCode9までのBuild)が実行されます。

f:id:project-unknown:20180923190113p:plain

f:id:project-unknown:20180923190850p:plain

最後に

New Build SystemはSwift製と言うのと、今後、こちらをデファクトスタンダードになっていくと思われます。
Podsやパッケージが対応されたら、New Build Systemにうつしていこうと思います。