LoginSignup
7
5

More than 5 years have passed since last update.

Carthageのcopy-frameworksをRelease時のみ実行したい

Last updated at Posted at 2018-03-16

はじめに

下記のようにやってたけど、指摘があってクリーンビルドしたら dyld: Library not loaded: が見つからなくてクラッシュするので、下記に書かれているようにReleaseのみにする方法はやめましょう...!!

Release時のみ実行(してしまうとまずい)

iOSアプリ開発でCarthage使う時、Run Scriptにcopy-frameworksを設定すると思うんだけど、これはApp Storeへのサブミット時の不具合を回避するために設定しているのということなので、普段のDebugビルド時にはいらないんじゃないかなと。

つまり、Run Scriptは次のようにしていいんでは...という気持ちで下記のようにしてました


if [ "${CONFIGURATION}" = "Release" ]; then
/usr/local/bin/carthage copy-frameworks
fi

この"${CONFIGURATION}"の ReleaseはXcodeでデフォルトで用意されているので、自分でカスタムするものではなく、それをそのまま使っています。

しかしこれではクリーンビルドしてしまうと次のビルド実行後はダイナミックライブラリが見つからずに実行時エラーになってしまうのでした。

追記: Debug時にもcopy-frameworks必要という件の概要

岸川さん( @kishikawakatsumi )に指摘をしてもらった内容を追記します

他にも指摘をしてくれたんですが割愛させてもらって、なぜCarthageのドキュメントどおりにしてcopy-frameworksの実行が必要かを記載します

  • 前提として
    • ライブラリをDynamic Frameworkとしてビルドして利用する場合、app bundleのFrameworksにコピーされる必要がある
      • copy-frameworksはinput filesに追加したパスのフレームワークをコピーしてくれている
    • iTunesへの申請にはシミュレータ用のバイナリがipaに含まれてはいけない
      • copy-frameworksはi386とx86_64をipaから省いてもくれる(Valid Archのみにしている)
  • Linked Frameworksに追加するのは
    • Linkとビルドフェーズに設定を追加している

つまり、ipaをValid ArchのみにしてくれてるのはRelease時のみでいいが、フレームワークのコピーはDebug時でもやる必要があるので(一度やればキャッシュが残っているがクリーンビルドで消える)、Debug時でもcopy-frameworksが必要だということですね。

関連

CrashlyticsのdSYM送信スクリプトをRelease時のみ実行したい
https://qiita.com/yimajo/items/98cbf5bdbc098c683657

7
5
0

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
7
5