web-dev-qa-db-ja.com

スクリプトからXcodeプロジェクトにファイルを追加しますか?

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

私はbashを使用していますが、言語の例があれば役立ちます。

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

51
Andrew

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

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

  2. 新しい "run script" build phase をターゲットに追加します。最も簡単な方法は、ターゲットを右クリックして、「追加/新規ビルドフェーズ/新規実行スクリプトビルドフェーズ」を選択することです

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

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

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

  6. 保存し、構築し、リポジトリにコミットし、昇給を要求し、新鮮な空気を取り、素敵な一日を過ごしましょう:)

33
e.James

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

次のコマンドを含む「バンドルリソースのコピー」の後に、新しいスクリプト実行ビルドフェーズを追加します。

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の結果を-txargsにパイプします(結果のコマンドをstderrにエコーし、ビルドログに表示します)、-I(コマンドを1回実行します各入力ファイル)および{}を引数プレースホルダーとして使用します

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

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

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

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

35
Ben Cochran

@Ben Cochranが示唆するように(素晴らしいスクリプトをありがとう)、各ファイルをコピー(再チェック)する必要がないように、多数のファイルがある場合は、これをrsyncで行う方法です。

enter image description here

11
Adriano Lucas

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

その場合は、プロジェクトにフォルダー参照を追加するだけです(プロジェクトフォルダーにフォルダーを作成し、それをプロジェクトの「リソース」グループ(「ファイルとグループ」リスト内にドラッグします。表示されるシートで、「作成「追加されたフォルダーのフォルダー参照」ラジオボタン)および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.");
}

`

6
geowar

ソースルートに対してシステムのどこかにファイルがある場合は、常に 「ファイルのコピー」フェーズ を追加できます。これにより、リソースのコピー元のディレクトリを指定できます。

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

5

私はそれが少し遅れていることを知っていますが、私はちょうど出会いました この記事 あなたが探しているもののように聞こえる何かをする方法を説明します。

2
Richard