Xcode 4のプロジェクトテンプレート    Xcode 4のプロジェクトテンプレート                                Cocoa勉強会 #54 2012.09.01(土)                    ...
Xcode 4のプロジェクトテンプレート  の2種類があります。今日は、プロジェクトテンプレートについて説明します。ファイル テンプレートについては、後述の参考情報に詳しいサイトを載せましたのでそちらを参照く ださい。 テンプレートの構成  X...
Xcode 4のプロジェクトテンプレート           Cocoa Application             - Concrete: true             - Ancestors:               + Coc...
Xcode 4のプロジェクトテンプレート  "Include Unit Tests"はCocoa Document-based Applicationで定義されているのでこれ も消えてしまっていますね。  では、ここで新しいテンプレートファイル...
Xcode 4のプロジェクトテンプレート                 <key>Description</key>                 <string>Whether linking QuartzCore.framework o...
Xcode 4のプロジェクトテンプレート plistからのファイル、プログラム生成  先に触れたように、Xcode 4ではplistからファイルやその内容のプログラムを生成するこ とができます。この機能に関連するplistのキーは次の2つになり...
Xcode 4のプロジェクトテンプレート   の2つを組み合わせて、           // Cocoa Application Base.xctemplate/TemplateInfo.plist           <key>Nodes<...
Xcode 4のプロジェクトテンプレート                   MainMenuDoc.xib                   TemplateInfo.plist                   ___PACKAGENA...
Upcoming SlideShare
Loading in …5
×

Xcode4 project template

2,518 views

Published on

Xcode 4のプロジェクトテンプレートの構成とそのカスタマイズ方法について。

2012-09-01 Cocoa勉強会 #54

  • 2013-04-13
    InjectionTargetsについて例を書きました。

    - http://d.hatena.ne.jp/kimuraw/20130412/p1
    - https://gist.github.com/kimuraw/5373058
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

Xcode4 project template

  1. 1. Xcode 4のプロジェクトテンプレート Xcode 4のプロジェクトテンプレート Cocoa勉強会 #54 2012.09.01(土) 木村 渡 はじめに プロジェクトテンプレートが必要になる機会はあまりないのですが、独自フレームワーク を作成していて(例えばRubyCocoaとか)、それを配布する場合などはテンプレートを同 梱すると便利です。毎回フレームワークを追加したり、コードを書き換えしたりが必要なの はわずらわしいものです。 テンプレート自体は昔のProject Builder時代からありましたが、Xcode 4で大きく変わっ たため詳しいことを知らない人も多いかと思います。そこで今回は、Xcode 4のプロジェク トテンプレートがどのようになっているかについて説明します。 おことわり 基本的にAppleのドキュメントはありません。"AS IS"で「試してみたらこうなった」とい う結果ですのでご了承ください。Xcode 4.2とXcode 4.4でだいたい確認しています。 テンプレートとは あまり説明する必要もないとは思いますが、「新規プロジェクト」や「新規ファイル」の ときに選択するのがテンプレートです。 大きく分けて、 プロジェクトテンプレート ファイルテンプレート ページ 1
  2. 2. Xcode 4のプロジェクトテンプレート の2種類があります。今日は、プロジェクトテンプレートについて説明します。ファイル テンプレートについては、後述の参考情報に詳しいサイトを載せましたのでそちらを参照く ださい。 テンプレートの構成 Xcode 4.4のテンプレート は、/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templatesに置か れています。 Xcode 3と比べてみよう Xcode 3のテンプレートと比べてみましょう。 Xcode 3はそのまんま、って感じですね。それに比べて、Xcode 4はテンプレートのファ イルは生成されるプロジェクトに対してファイルが少ないように見えます。 テンプレートの継承・機能追加(インジェクション) Xcode 4では、別のテンプレートを継承して新しいテンプレートを作成したり、テンプレ ートに機能追加(インジェクション/注入)する内容を別のテンプレートとして作成することが できます。その機能に関連するplistのキーは次の3つになります。 AAnncceessttoorrss 継承する親をIdentifierで指定します。複数指定できます。 IInnjjeeccttiioonnTTaarrggeettss インジェクションする対象をIdentifierで指定します。 CCoonnccrreettee 実体のテンプレートかどうかを指定します。この値がtrueのものだけが、Xcodeの 「新規プロジェクト」に表示されます。 たとえば、Cocoa Applicationは次のように構成されています。 ページ 2
  3. 3. Xcode 4のプロジェクトテンプレート Cocoa Application - Concrete: true - Ancestors: + Cocoa Application Base - Ancestors: < Objective-C Application < Bundle Base < Base < Mac Base < Prefixable Core Data Spotlight Application - Concrete: false (default) - InjectionTargets: Cocoa Application - Ancestors: < Core Data Application < Cocoa Document-based Application 大きく分けて、Cocoa ApplicationとCore Data Spotlight Applicationの2つで構成され ています。Cocoa Applicationは素のアプリを、それの拡張をCore Data Spotlight Applicationで定義定義しています。ここは、プロジェクト作成時の画面を見たほうが分かり やすいでしょう。 試しに、Core Data Spotlight ApplicationのInjectionTargets要素をコメントアウトして みると、次のようになります。 ページ 3
  4. 4. Xcode 4のプロジェクトテンプレート "Include Unit Tests"はCocoa Document-based Applicationで定義されているのでこれ も消えてしまっていますね。 では、ここで新しいテンプレートファイルをつくって実験してみましょう。以下のファイ ルを作成し、 /Library/Developer/Xcode/Templates/Project Templates/Mac/Application/にCocoa Application+QuartzCore.xctemplate/TemplateInfo.plistとして配置します。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Kind</key> <string>Xcode.Xcode3.ProjectTemplateUnitKind</string> <key>Identifier</key> <!-- define unique id --> <string>jp.nifty.i.kimuraw.dt.unit.TestTmpl</string> <key>InjectionTargets</key> <array> <!-- inject into "Cocoa Application" --> <string>com.apple.dt.unit.cocoaApplication</string> </array> <key>Options</key> <array> <dict> <key>Identifier</key> <string>linkQuartzCoreFramework</string> <key>Name</key> <string>link QuartzCore framework</string> ページ 4
  5. 5. Xcode 4のプロジェクトテンプレート <key>Description</key> <string>Whether linking QuartzCore.framework or not</string> <key>Type</key> <string>checkbox</string> <!-- add a checkbox --> <key>SortOrder</key> <integer>1</integer> <key>Default</key> <string>false</string> <key>Units</key> <dict> <key>true</key> <!-- when the checkbox is on, inject the following settings --> <array> <dict> <key>Targets</key> <array> <dict> <key>Frameworks</key> <array> <string>QuartzCore</string> </array> </dict> </array> </dict> </array> </dict> </dict> </array> </dict> </plist> すると、新規プロジェクトでCocoa Applicationを選択したときのオプションに Cocoa Applicationにチェックボックスが追加される チェックするとQuartzCore.frameworkにリンクしたプロジェクトが作成される となります。 同様の手順で、フレームワークを追加やビルドオプションの設定を追加できますので、よ く行う設定があればテンプレートを作成しておくと便利かもしれません。 ページ 5
  6. 6. Xcode 4のプロジェクトテンプレート plistからのファイル、プログラム生成 先に触れたように、Xcode 4ではplistからファイルやその内容のプログラムを生成するこ とができます。この機能に関連するplistのキーは次の2つになります。 DDeeffiinniittiioonnss 生成する内容の定義です。一種の辞書のようなものです。詳しくは後述の説明で。 NNooddeess 生成するファイルとその内容を指定します。Definitionsで定義した内容を利用できま す。 Definitionsはdict要素で構成され、以下のパターンがあります。 string: 指定した文字列をファイルの内容として利用します。 dict - Path: 指定したパスの外部ファイルを内容として利用します。 dict - Group: 生成したファイルのグループを指定します。 それでは実際の内容を見ていきましょう。 // Cocoa Application Base.xctemplate/TemplateInfo.plist <key>en.lproj/Credits.rtf</key> <dict> <key>Path</key> <string>Credits.rtf</string> <key>Group</key> <string>Supporting Files</string> </dict> これはテンプレートのバンドル内にあるCredits.rtfというファイルを、 en.lproj/Credits.rtfというキーで定義しています。 // Base/Objective-C Application.xctemplate/TemplateInfo.plist <key>main.m:main</key> <dict> <key>Beginning</key> <string>int main(int argc, char *argv[]) {</string> <key>End</key> <string>}</string> <key>Indent</key> <integer>1</integer> </dict> と // Cocoa Application Base.xctemplate/TemplateInfo.plist <key>Definitions</key> <dict> : <key>main.m:main:NSApplicationMain</key> <string>return NSApplicationMain(argc, (const char **)argv);</string> ページ 6
  7. 7. Xcode 4のプロジェクトテンプレート の2つを組み合わせて、 // Cocoa Application Base.xctemplate/TemplateInfo.plist <key>Nodes</key> <array> <string>main.m:main:NSApplicationMain</string> が int main(int argc, char *argv[]) { NSApplicationMain(argc, (const char **)argv); } になります。実際にはコメントやimportなどもありますが、そちらはBase/Objective-C Application.xctemplateで定義されています。 また、より複雑なケースとしてはCocoa Document-based Application.xctemplateのド キュメントクラスがどのように構成されているかを確認してみてください。きっと頭が痛く なるはずです。 DefinitionsとNodesを利用したテンプレートの操作はコードを書き換えるよりも、自社の ロゴなど毎回追加するリソースファイル群をテンプレートとして定義して、インジェクショ ンにより追加するといった用途が実用的ではないかと思います。 RubyCocoaでやったこと RubyCocoaのプロジェクトでは、通常のCocoaアプリのプロジェクトとは以下の点が異 なります。 RubyCocoa.frameworkにリンク main.mでrubyインタプリタ・RubyCocoaの初期化処理を行う rb_main.rbを追加 クラスの実装ファイルがObjective-C(.h, .m)でなくRuby(.rb) 結局、Cocoa Application Baseから一式コピーして次のような構成となりました。 Ruby-Cocoa Application Base Ruby-Cocoa Application Ruby-Cocoa Document-based Application Ruby-Core Data Application Ruby-Core Data Spotlight Application ドキュメントのクラスなどはplist中で定義しようとしたらワケわからなくなったので、.rb ファイルを外部ファイルとして用意するようにしました。 Ruby-Cocoa Document-based Application/ Document.rb Document.xib ページ 7
  8. 8. Xcode 4のプロジェクトテンプレート MainMenuDoc.xib TemplateInfo.plist ___PACKAGENAMEASIDENTIFIER___AppDelegate.rb 今回整理したことを応用すると、少なくともRuby-Cocoa Application Baseはなくすこ とができると考えています。 まとめ Xcode 4のプロジェクトテンプレートの構成とその内容、新しいテンプレートの作成例に ついて説明しました。Xcode 4のテンプレートでは 継承ができる 別テンプレートでの定義をインジェクションできる plistからファイルを生成できる という機能があり、Xcode 3よりも柔軟にテンプレートを作成できるようになっていま す。その分、複雑にもなっています。 まだまだ調べているところであり、おもしろいこと・わからないことなどありましたらぜ ひお知らせください。 参考情報 CCrreeaattiinngg CCuussttoomm XXccooddee 44 FFiillee TTeemmppllaatteess ((22001122年33月の記事)) http://www.bobmccune.com/2012/03/04/creating-custom-xcode-4-file- templates/ ファイルテンプレートの詳細な説明です。マクロやオプションはプロジェクトでも同様 ですので参考になります。 連絡先 きりかノート 2冊め: http://d.hatena.ne.jp/kimuraw/ twitter id: @kimuraw ページ 8

×