2009-11-04 12 views
7

アップルのフレームワークプログラミングガイド>>Installing your frameworkのアドバイスに従って、/ Library/Frameworksにインストールするカスタムフレームワークがあります。私は、/ライブラリ/フレームワーク/ MyFrameworkにリンクし、そのように私のクラスでそれをインポートし、私のプロジェクトでカスタムココアフレームワークをインストールする最良の方法

cp -R build/Debug/MyFramework.framework /Library/Frameworks 

#import <MyFramework/MyFramework.h> 
私は以下のスクリプトとのフェーズを構築スクリプトの実行を追加することによって、これを行います は適用負荷は、ルールsharedlibraryすべてを...デバッガに

ロードプログラム:

これは、私はいつも私のデバッガコンソールに次のメッセージが表示されることを除いて、非常にうまく機能します警告: "/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework"(ファイルが見つかりません)のシンボルを読み取ることができません。 警告: "MyFramework"(まだメモリにマップされていない)からシンボルを読み取ることができません。 プログラムが読み込まれました。

どうやら、コンパイラはまず/ライブラリ/フレームワークで、MyFrameworkを見つけるん見て、その陽気な方法で続けて、中/ユーザー/ elisevanlooij /ライブラリ/フレームワーク、MyFrameworkを見つけることができません見えます。これまでのところ、これは実際の問題よりも面倒ですが、ユニットテストの実行時にgdbは(ファイルが見つかりません)で停止し、続行を拒否します。私は、スクリプトの実行フェーズ

cp -R build/Debug/MyFramework.framework ~/Library/Frameworks 

に余分な行を追加することで問題を解決してきたが、それは最初の場所で壊れてすべきではありませんセロ・テーピング何かのように感じています。これをどうすれば解決できますか?

答えて

11

ここ数ヶ月、私はフレームワークについてもっと学んだので、私はこの答えを書き直しています。私は、開発ワークフローの一部としてフレームワークをインストールすることについてを話しています。

パブリックフレームワーク(つまり、複数のアプリケーションまたはバンドルで使用されるフレームワーク)をインストールするのに適した場所は/ Library/Frameworks [リンクテキスト]です。「この場所のフレームワークは自動的にコンパイラと動的リンカーを実行時にコンパイルします。 "[Framework Programming Guide]。これを行う最もエレガントな方法は、[ビルド]設定の[展開]セクションにあります。

フレームワークを使用しているときに、ビルド時にフレームワークを更新したいときや、ビルド時にフレームワークを更新したいときがあります。そのため、リリース設定でのみ展開設定を変更します。したがって:

  1. フレームワークターゲットをダブルクリックして[ターゲット情報]ウィンドウを開き、[ビルド]タブに切り替えます。
  2. 設定選択ボックスでリリースを選択します。ダウン展開部へ
  3. スクロールして、次の値を入力します。

配布場所= YES(クリックチェックボックス)

インストールのビルド製品場所=/

インストールディレクトリ= /ライブラリ/フレームワーク

インストールビルド製品の場所は、インストールのルート。そのデフォルト値は/ tmpディレクトリです:もしそれをシステムのルートに変更しなければ、インストールされたフレームワークは/ tmpに隠れているので見えません。

他のプロジェクトを怒らせることなく、デバッグ設定で好きなようにフレームワークを操作できます。公開する準備ができたら、リリースに切り替えてビルドを行うだけです。

Xcode 4警告 Xcode 4に移行して以来、私はカスタムフレームワークでいくつかの問題を経験しました。主に、組込みユニットテストを実行する場合を除いて、フレームワークの有用性を実際に妨げないGDBの警告をリンクしています。私は1週間前にAppleにテクニカルサポートチケットを提出しましたが、彼らはまだそれを調べています。私が実用的な解決策を得るとき、私はこの質問がかなり一般的であることが証明されているので、この答えを更新します(1 kViewsと数えます)。

+0

Xcodeビルドシステムに関するcdespinosaの回答は、信頼できるものとみなしてください。 – NSResponder

+1

まあ、私は彼の答えを投票したので、私は膝が安全であることを願っています。しかし、私が到着したソリューションは、デフォルトのXcode設定の変更が少なく、コマンドラインの必要性がなくなるため、より洗練されたソリューションを検討しています。 –

0

もちろん、フレームワークを配布するときは、/ Library/Frameworksにインストールする必要があります。しかし、あなたがフレームワークのテスト/デバッグバージョンでそれをやっているのは私にとっては奇妙なことです。

私の最初の本能は、〜/ Libraryの下にテストバージョンをインストールすることです。テストとデバッグの環境を設定するだけで簡単です。可能であれば、テストしているバージョンのビルドツリーにデバッグ/テストフレームワークがあることが期待されます。この場合、テスト目的でPrivate Frameworkとしてインストールされています。それは、あなたのフレームワークの複数のバージョンを扱うときには、あなたの人生をはるかに単純にします。

最終的には、アプリケーションまたはテストスイートが正しいバージョンをロードしている限り、フレームワークの場所は関係ありません。テスト/デバッグ/開発を最も簡単にする場所を選択してください。

+0

フレームワークはいくつかのプロジェクトで使用されているため、プライベートフレームワークとしてインストールすることは不可能です。私はリリース版(cp -R build/Release/MyFramework.framework/Library/Frameworks)で同じことを試しましたが、結果は同じです。 フレームワークがどこにあるかは問題ではありません。...うーん、私の言葉は失敗します。 –

3

ライブラリ/フレームワークにフレームワークを置く理由はあまりありませんし、多くの作業があります:インストーラパッケージのユーザのために行う必要があります。これは、作成と保守の面倒な手間と、あなたのアプリをルートパワーで/ L/Fにインストールできるようにするために必要な時間と労力を費やさない限り〜/ L/Fにしかインストールできませんでした。

多くの場合、what Apple calls a “private framework”です。これをアプリケーションバンドルにバンドルします。

フレームワークの単一のコピーをライブラリにインストールする「正しい」方法(つまり、Sparkle、Growlなど)が実際にはプライベートフレームワークとして使用されるように、/Frameworksはそんな面倒です。

+0

私はインストーラパッケージを作ることはたくさんの仕事であることを疑うことはありません - 私はそれをやったことがないと思っています。しかし、それはアプリケーションのためにとにかく行う必要があるので、私はフレームワークのためにもう1つを追加することはそれほど大したことではないことを理解していません - とにかく、アプリケーションインストーラにバンドルする必要があります珍しく普及しているフレームワーク。全体的に、フレームワークを非公開にすることが重要であると私は確信していません。 –

+0

私は同意しません。 .frameworkバンドルを/ Library/Frameworksにコピーし、それを他のXcodeプロジェクトにインポートするのは本当に簡単です。 –

+0

@RaffiKhatchadourian:しかし、あなたのアプリケーションは誰のためにも動作しません。すべてのユーザーのマシン上でL/Fにフレームワークをインストールする必要があります。あなたが持っていたのと同じ場所にフレームワークを持たないユーザーのためにアプリケーションは起動しません。 –

3

これを行う従来の方法は、フレームワークプロジェクトとそのクライアントに共通のビルドディレクトリを共有させることです。 Xcodeはフレームワークヘッダーを検索し、ビルドフォルダのフレームワークバイナリと最初にのリンクを探します。したがって、ヘッダーに対してコンパイルしてリンクするアプリケーションプロジェクトは、インストールされているものよりも、最近作成されたものを選択します。

次に、cp -rを削除し、代わりにInstall Locationビルド設定を使用して、xcodebuild install DSTROOT = /コマンドラインでビルド製品を最終的な場所に配置することができます。しかし、フレームワークを再ビルドするたびにではなく、完了したらこれを行う必要があります。

+0

興味深いですが、私はこのアプローチで2つの問題を発見しました。まず、xcodebuildはDSTROOT = /をインストールして "Unable to read symbols"という問題を解決します。しかし: 1)フレームワークのビルドディレクトリが共通ビルドディレクトリ(プロジェクトフォルダの外)を指していたとき、xcodebuildはフレームワークで行われた変更を何とか見落とすでしょう。フレームワークヘッダーファイルの変更日は変更されますが、コンテンツは変更されません(おそらくバージョニングと関係しますか?)。 2)ビルドディレクトリをデフォルトビルドに戻したとき、xcodebuildはフレームワーク内に別のフレームワークのコピーをインストールします。奇妙な。 –

関連する問題