57

現在、いくつかのスクリプトを使用して、Xcodeにリソースとして含めているファイルを生成しています。スクリプトを実行し、プロジェクトから削除してから、プロジェクトに追加し直します。スクリプトがファイルを生成し、それらをxcodeプロジェクトに自動的に追加できるように、この最後のステップを自動化する方法が必要です。

私はbashを使用していますが、どの言語の例でも役に立ちます。

ありがとう、アンドリュー

4

8 に答える 8

42

アンドリューと同じようなニーズがありました。事前にリソースを知らなくても、スクリプトからリソースを含めることができるようにする必要がありました。私が思いついた解決策は次のとおりです。

次のコマンドを含む「Copy Bundle Resource」の後に、新しい Run Script ビルド フェーズを追加します。

find -L ${SRCROOT}/SomeDerivedResources \
    -type f -not -name ".*" \
    -not -name "`basename ${INFOPLIST_FILE}`" \
    | xargs -t -I {} \
    cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

恐ろしく見えますが、分解してみましょう。

find -L ${SRCROOT}/SomeDerivedResources

これにより、ソース ルートのディレクトリ SomeDerivedResources がクロールされます (-Lシンボリック リンクをたどるように指示されます)。

-type f

通常のファイルのみを含める

-not -name ".*"

ドットで始まるファイルを無視する

-not -name "`basename ${INFOPLIST_FILE}`"

私の場合、Info plists は SomeDerivedResources ディレクトリにあるため、そのファイルが製品にコピーされないようにする必要があります。

| xargs -t -I {}

find結果をxargswithにパイプし-t(結果のコマンドを stderr にエコーしてビルド ログに表示する)、-I(入力ファイルごとに 1 回コマンドを実行する){}引数プレースホルダーとして使用する

cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

最後に、見つかった各ファイル ( で示される{}) を製品のリソース ディレクトリにコピーします。

これを入力したときに、cp の代わりに rsync セットアップを使用すると、ビルドのたびにリソースをコピーできなくなる可能性があることに気付きました。リソースが非常に大きい場合は、検討する価値があるかもしれません。

(また、いくつかの理由により、フォルダー参照は私の必要性に応じて機能しません。1 つは、アイコンが DerivedResources ディレクトリにあり、それらをバンドルのサブディレクトリに配置しても機能しないようです。また、理想的には、できるようにしたかったことです。 and を使用[UIImage imageNamed:@"MyAwesomeHappyImage.png"]します-pathForResource:ofType:(一部のファイルは、DerivedResources ディレクトリ内にさらにネストされています。必要に応じてこれらの制限が含まれていない場合は、フォルダー参照ルートを使用することを強くお勧めします。)

于 2011-05-26T03:28:19.427 に答える
37

これは、アプリケーションに新しいビルド フェーズを追加することで実行できます。

  1. Xcode プロジェクト ブラウザーで、アプリケーションのターゲットを見つけて展開し、すべてのビルド フェーズを表示します。

  2. 新しい「スクリプトの実行」ビルド フェーズをターゲットに追加します。最も簡単な方法は、ターゲットを右クリックして、[Add/New Build Phase/New Run Script Build Phase] を選択することです。

  3. 新しいビルド フェーズを追加すると、インスペクター ウィンドウが表示されます。このウィンドウでは、シェル スクリプト全体を入力するか、単にコマンド ラインを入力してスクリプトを実行できます。

  4. ここに金があります: インスペクタ ウィンドウの下部で、入力ファイルと出力ファイルを指定できます。入力ファイルを指定すると、依存関係が自動的に設定されます (シェル スクリプトは、入力ファイルの一部が変更された場合にのみ実行されます)。出力ファイルを指定すると、依存関係がそれらのファイルに自動的に伝播されます。シェル スクリプトが実行されると、Xcode は、シェル スクリプトが変更したファイルを処理する必要があることを認識します。

  5. 下のスクリーンショットに示すように、新しいビルド フェーズをフェーズ リストの一番上までドラッグしてください。これらのリソース ファイルをバンドルに含める必要がある場合は、順序が重要になります。

  6. 保存し、ビルドし、リポジトリにコミットし、昇給を求め、新鮮な空気を吸い、良い一日を過ごしましょう! :)

于 2009-09-03T05:46:38.347 に答える
12

@Ben Cochran が提案したように (素晴らしいスクリプトに感謝します)、ファイルの数が多い場合は、各ファイルを再コピー (または再チェック) する必要がないように、rsync を使用してそれを行う方法を次に示します。

ここに画像の説明を入力

于 2012-06-26T10:22:05.353 に答える
8

基本的に、ファイルはメインバンドルにコピーするだけです

その場合は、プロジェクトへのフォルダー参照を追加するだけです (プロジェクト フォルダーにフォルダーを作成し、それをプロジェクトの [リソース] グループ ([ファイルとグループ] リスト内) にドラッグします。次に、表示されるシートで [作成] を選択します)。追加されたフォルダーのフォルダー参照」ラジオ ボタン) を選択すると、Xcode はビルド時にフォルダーとそのすべてのコンテンツをターゲット バンドルにコピーします。

追記: この方法を使用して画像サブフォルダーを追加する場合は、'[UIImage imageNamed:]' を使用するために、画像名の前にサブフォルダー名を付ける必要があります。たとえば、「MyImages」という名前のサブフォルダーに「Rendezvous.png」という名前の画像がある場合:

`

// this won't work
UIImage * image = [UIImage imageNamed:@"Rendezvous"];
if (image) {
    NSLog(@"Found Rendezvous!");
} else {
    NSLog(@"Didn't find Rendezvous.");
}

// but this will!
image = [UIImage imageNamed:@"MyImages/Rendezvous"];
if (image) {
    NSLog(@"Found MyImages/Rendezvous!");
} else {
    NSLog(@"Didn't find MyImages/Rendezvous.");
}

`

于 2010-09-11T18:06:03.753 に答える
5

システムのソース ルートに関連する場所に既にファイルがある場合は、いつでも「ファイルのコピー」フェーズを追加できます。これにより、リソースのコピー元のディレクトリを指定できます。

これを、既に提供されているビルド スクリプト フェーズの回答と組み合わせることができます。たとえば、Subversion からアセットをプロジェクトのサブディレクトリにチェックアウトするスクリプトを実行し、「$(SRCROOT)/Assets」からコピーするファイルのコピー フェーズを実行します。

于 2010-03-05T05:14:05.733 に答える
2

少し遅れていることはわかっていますが、探しているもののように聞こえる何かを行う方法を説明するこの記事に出くわしました。

于 2011-04-03T13:17:09.590 に答える