2016-04-07 11 views
1

2つのSwiftプロジェクト、OAuthとCommonsを含むXcodeワークスペースがあります。
各プロジェクトには、iOSフレームワークターゲットとテストターゲットがあります。彼らはお互いに依存していません。
コモンズプロジェクトはのOAuthフレームワーク目標輸入WebKitのimport WebKit)しながら依存関係を有していません。iOSフレームワークのテストがXcodeワークスペースで失敗する

さて、私はXcodeでのテストを実行した場合のOAuthのテストが正常に動作しますがコモンズのテストは、次のXcodeのエラーログで失敗:私は、次のコマンドをコマンドラインからテストを実行する場合

Test target CommonsTests encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted) 

xcodebuild -workspace Workspace.xcworkspace -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6" -scheme OAuth test 

xcodebuild -workspace Workspace.xcworkspace -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6" -scheme Commons test 

私は2番目のコマンドの後に次のエラーを取得する:

The bundle “CommonsTests” couldn’t be loaded because it is damaged or missing necessary resources. Try reinstalling the bundle. 
(dlopen_preflight(~/Library/Developer/Xcode/DerivedData/Workspace-aslcnsaomwggxqcxoozzfuztgszf/Build/Products/Debug-iphonesimulator/CommonsTests.xctest/CommonsTests): Library not loaded: @rpath/libswiftWebKit.dylib 
Referenced from: ~/Library/Developer/Xcode/DerivedData/Workspace-aslcnsaomwggxqcxoozzfuztgszf/Build/Products/Debug-iphonesimulator/OAuth.framework/OAuth Reason: image not found) 

私の設定で何が問題になるのでしょうか? 問題は他の誰かにも発生しますか?


回避策:

1)私はまた、すべてが正常に動作バンドルCommonsTestsでのWebKitが含まれている場合。 しかし、OAuthとCommonsフレームワークの間に依存関係がないので、なぜこれが必要であるのかわかりません。

2)OAuthプロジェクト(とターゲット)の名前をOAuth2のように変更すると、すべて正常に動作します。 これは本当に奇妙です。名前の衝突かキャッシングの問題のいずれかです。

名前の変更の回避策は他の誰かの問題を解決しますか?


サンプル・プロジェクト:https://www.dropbox.com/s/dn3ywhxlc9kb6y4/SampleProject.zip?dl=0

設定:
のXcode 7.3(エラーがあまりにもXcodeの7.2で発生)
OS X 10.11.4(エラーがあまりにOS X 10.11.3上で発生)

答えて

0

問題をもう一度見た後、私は奇妙な行動の理由を見つけることができました。

短い答え:
xctestはこのフレームワークをリンクするようなので、私自身のOAuthフレームワークと名前の衝突を起こし/System/Library/PrivateFrameworks/OAuth.framework/OAuthに位置プライベートのOAuthアップルのフレームワークがあります。

ロング回答:
xctestまたはXCTest.frameworkプライベートフレームワークフォルダからOAuth.frameworkをロードするように見えます。1は、Xcodeの中にワークスペースを使用している場合は、テスト環境はdyldのために以下の環境変数を使用しています

"DYLD_FRAMEWORK_PATH“ = "/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks“;

変数は、次のような効果があります

DYLD_FRAMEWORK_PATH 
       This is a colon separated list of directories that contain frameworks. The dynamic linker 
       searches these directories before it searches for the framework by its install name. It 
       allows you to test new versions of existing frameworks. (A framework is a library install name 
       that ends in the form XXX.framework/Versions/YYY/XXX or XXX.framework/XXX, where XXX and YYY 
       are any name.) 

       For each framework that a program uses, the dynamic linker looks for the framework in each 
       directory in DYLD_FRAMEWORK_PATH in turn. If it looks in all the directories and can't find 
       the framework, it searches the directories in DYLD_LIBRARY_PATH in turn. If it still can't 
       find the framework, it then searches DYLD_FALLBACK_FRAMEWORK_PATH and DYLD_FALL-BACK_LIBRARY_PATH DYLD_FALLBACK_LIBRARY_PATH 
       BACK_LIBRARY_PATH in turn. 

DYLD_FRAMEWORK_PATHは、検索を定義しますフレームワークのディレクトリとは、デフォルトの検索パスとインストール名をに上書きします。 nary。バイナリは、環境変数はディレクトリ /Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator は関係なく、実際のインストールの名前の​OAuth.framework/OAuthバイナリ検索されていること。行動につながる /System/Library/Frameworks/OAuth のようなフレームワークがインストールパスを指定する場合でも、

この動作は、バイナリを再コンパイルせずに新しいバージョンの既存のバイナリでフレームワークを無効にすることができるためです。

しかし、2つのフレームワークが同じ名前を持っていれば、バイナリを誤ってリンクすることもあります。それで、同じ名前のフレームワークのうちの1つが、パスで指定されていても読み込むことができます。最初のディレクトリがDYLD_FRAMEWORK_PATHに含まれていて、他のディレクトリの前にある場合は、指定されたインストール名のパスに関係なく、その名前のために最初のディレクトリが選択されます。

具体例:

xctestバイナリロードコマンド: ​/System/Library/PrivateFrameworks/OAuth.framework/OAuth (compatibility version 300.0.0, current version 1280.24.0)

のOAuthは、次のパスに存在している:
/System/Library/PrivateFrameworks/OAuth.framework/OAuth /Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator/OAuth.framework/OAuth

xctestは、以下の環境変数で開始されます。
"DYLD_FRAMEWORK_PATH“ = "/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks“;

その後
/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator/OAuth.framework/OAuth
でのOAuth Frameworkがインストール名が
/System/Library/PrivateFrameworks/OAuth.framework/OAuth

であっても、使用されています
関連する問題