SlideShare ist ein Scribd-Unternehmen logo
1 von 8
Downloaden Sie, um offline zu lesen
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
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
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
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
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
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
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
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

Weitere ähnliche Inhalte

Mehr von Wataru Kimura

InputMethodKit超入門
InputMethodKit超入門InputMethodKit超入門
InputMethodKit超入門Wataru Kimura
 
Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信Wataru Kimura
 
Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化Wataru Kimura
 
Hotkeyslib3 Cocoaでホットキー
Hotkeyslib3 CocoaでホットキーHotkeyslib3 Cocoaでホットキー
Hotkeyslib3 CocoaでホットキーWataru Kimura
 
らくらくアップデートSparkle
らくらくアップデートSparkleらくらくアップデートSparkle
らくらくアップデートSparkleWataru Kimura
 
ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析Wataru Kimura
 
SIMBLでCocoaアプリをパワーアップ
SIMBLでCocoaアプリをパワーアップSIMBLでCocoaアプリをパワーアップ
SIMBLでCocoaアプリをパワーアップWataru Kimura
 
Three20のTTURLRequest
Three20のTTURLRequestThree20のTTURLRequest
Three20のTTURLRequestWataru Kimura
 
InputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろうInputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろうWataru Kimura
 

Mehr von Wataru Kimura (12)

Macos services
Macos servicesMacos services
Macos services
 
InputMethodKit超入門
InputMethodKit超入門InputMethodKit超入門
InputMethodKit超入門
 
Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信
 
PSMTabBarControl
PSMTabBarControlPSMTabBarControl
PSMTabBarControl
 
Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化
 
Hotkeyslib3 Cocoaでホットキー
Hotkeyslib3 CocoaでホットキーHotkeyslib3 Cocoaでホットキー
Hotkeyslib3 Cocoaでホットキー
 
値変換
値変換値変換
値変換
 
らくらくアップデートSparkle
らくらくアップデートSparkleらくらくアップデートSparkle
らくらくアップデートSparkle
 
ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析
 
SIMBLでCocoaアプリをパワーアップ
SIMBLでCocoaアプリをパワーアップSIMBLでCocoaアプリをパワーアップ
SIMBLでCocoaアプリをパワーアップ
 
Three20のTTURLRequest
Three20のTTURLRequestThree20のTTURLRequest
Three20のTTURLRequest
 
InputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろうInputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろう
 

Xcode4 project template

  • 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. 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. 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. 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. 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. 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. 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. 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