パート2.「ポッド」をモジュールに分割します。 私たちは他の誰かの「ポッド」を使って自分自身を開発します

はじめに



ある時点で「ポッド」の開発を続けると、プロジェクトが大きくなり、麺のように見え 、いくつかの論理的な部分で構成されていることがわかります。 この理解が早ければ早いほど、1つのプロジェクトのさまざまなエンティティを個別のブロックに簡単に分離できます。 たとえば、プロジェクトの一部はサーバーへの接続を確立し、もう一方はJSONでオブジェクトをシリアル化し、その逆も同様です。3番目はUIと対話します。 このような各エンティティは、「サブスペック」と呼ばれる個別のモジュールで区別できます(表示を簡単にするため、以下では「モジュール」という言葉を使用します)。 このアプローチは、「ポッド」の開発をより柔軟に管理するのに役立つだけでなく、「ポッド」のユーザーに、不要なコードでプロジェクトを乱雑にすることなく、必要なモジュールのみを使用する機会を与えます。



テストプロジェクト



「ポッド」自体の開発は、少なくとも奇妙です。 通常、その開発はプロジェクトのコンテキストで実行されます。 さらに良いことに、「ポッド」の開発のために特別なプロジェクトが開発されている場合、それはテストとコードでの有用な使用例でカバーされます。 〜/ Documents / PodSample / Projectディレクトリにテストプロジェクト「Single View Application」を作成しましょう。 次に、「ポッド」に接続します。 これを行うには、同じディレクトリにPodfileファイルを作成します。 結果は次のようになります。



Podfileに記入します

platform :ios, '7.0' pod 'MyLibrary', :path => '~/Documents/PodSample/MyLibrary.podspec'
      
      





「pod」の開発者である私たちは、人生を簡素化し、名前の後に、仕様へのパス( .podspecファイル)を明示的に示すことができます。 その結果、インストーラーは仕様リポジトリに入りませんが、指定されたパスで明示的に指定された仕様を取得します。 原則としてファイル名MyLibrary.podspec省略できます。「pod」の仕様ファイルが存在するディレクトリを指定するだけで、インストーラはそれを見つけます。 また、たとえば、相対パスの使用を妨げるものはありません。

 platform :ios, '7.0' pod 'MyLibrary', :path => '..'
      
      





次に、Xcode、または少なくともテストプロジェクトMyPodExample.xcodeprojを閉じます。

「ポッド」をインストールします。

 $ cd ~/Documents/PodSample/Project/ $ pod install Analyzing dependencies Fetching podspec for `MyLibrary` from `~/Documents/PodSample/MyLibrary.podspec` Downloading dependencies Using MyLibrary (0.0.1) Generating Pods project Integrating client project
      
      





インストーラーは、テストプロジェクトと新しい「ポッド」プロジェクトを追加する「ワークスペース」を生成します。 ワークスペースMyPodExample.xcworkspaceを開き、同様のものを観察します。





モジュールを選択



便利な「ポッド」がすでにサーバーに接続し、JSONを処理し、内部ストレージにデータを保存できるとします。 クラスのセットを作成し、パブリックインターフェイスでいくつかのメソッドを宣言します。 結果はGitHubにタグが混在した状態です。

「ポッド」のモジュールへの分離は、2段階で行われます。 最初に、コードが整理され、そのために独自のファイルでさまざまなエンティティが配布されます。 次に、「spec」を更新します。結果のモジュールを「subspec」ブロックで記述し、「dependency」パラメーターを使用して相互に依存関係を割り当てます。

 Pod::Spec.new do |s| s.name = "MyLibrary" s.version = "0.0.2" s.summary = "Example of creating own pod." s.homepage = "https://github.com/username/MyCustomPod" s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { "Username" => "username@mail.domain" } s.platform = :ios, 7.0 s.source = { :git => "https://github.com/username/MyCustomPod.git", :tag => s.version.to_s } s.framework = 'Foundation' s.requires_arc = true s.default_subspec = 'Core' #     Core s.subspec 'Core' do |core| core.source_files = 'Classes/AKClass.{h,m}' core.public_header_files = 'Classes/*.h' core.dependency 'MyLibrary/Connection' core.dependency 'MyLibrary/Provider' end s.subspec 'Provider' do |provider| provider.source_files = 'Classes/AKProvider.{h,m}' provider.frameworks = 'MapKit', 'CoreData' #     provider.platform = :ios, 5.0 #       iOS 5.0 end s.subspec 'AccessToken' do |access_token| access_token.source_files = 'Classes/AKAccessToken.{h,m}' access_token.libraries = 'xml2' #    access_token.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' } #     end s.subspec 'Parser' do |parser| parser.source_files = 'Classes/AKParser.{h,m}' end s.subspec 'Storage' do |storage| storage.source_files = 'Classes/AKStorage.{h,m}' storage.dependency 'MyLibrary/AccessToken' end s.subspec 'Connection' do |connection| connection.source_files = 'Classes/AKConnection.{h,m}' connection.dependency 'MyLibrary/Storage' connection.dependency 'MyLibrary/Parser' end end
      
      





「プロバイダー」モジュールについては、「MapKit」と「CoreData」の2つのフレームワークを接続する必要があることを示しています。 「AccessToken」モジュールの場合、「xml2」ライブラリに接続する必要があります。指定されたパスでヘッダーファイルを探します: $(SDKROOT)/ usr / include / libxml2

CocoaPods v0.17以降、彼らモジュールがベース仕様からsource_filesの値を暗黙的に継承しなくなったと言っています。 この機会を返すには、作成されるモジュールに必要な基本ソースコードを含む「コア」モジュールを取得する必要があります。

モジュールをサブモジュールに分割することもできます。

 … s.subspec 'Connection' do |onnection| onnection.source_files = 'Classes/AKConnection.{h,m}' onnection.dependency 'MyLibrary/Storage' onnection.dependency 'MyLibrary/Parser' onnection.subspec 'Cache' do |cache| cache.source_files = 'Classes/AKCache/*.{h,m}' end end
      
      





また、モジュールが機能するプラットフォームとそのバージョンを指定することもできます。 この場合、 プロバイダーモジュールは「iOS 5.0」でも起動することを示しました。



構文を確認します。

 $ pod spec lint ~/Documents/PodSample/MyLibrary.podspec --quick -> MyLibrary (0.0.2) Analyzed 1 podspec. MyLibrary.podspec passed validation.
      
      





変更をgitにコミットし、タグを付けてGitHubに送信します。

 $ git add MyLibrary.podspec && git commit -m "Spec sliced on subspecs" $ git add -A && git commit -m "Sliced code" $ git tag "0.0.2" $ git push origin master --tags
      
      





プロジェクト全体を確認します。

 $ pod spec lint ~/Documents/PodSample/MyLibrary.podspec -> MyLibrary (0.0.2) Analyzed 1 podspec. MyLibrary.podspec passed validation.
      
      







モジュールの使用



必要なモジュールのみを使用するには、 Podfileにリストするだけで十分です

 platform :ios, '7.0' pod 'MyLibrary/Storage' pod 'MyLibrary/Parser'
      
      





単一のモジュールを指定しない場合:

 platform :ios, '7.0' pod 'MyLibrary'
      
      





その後、 pod installはすべてのモジュールのソースをインストールします。 この場合、「Core」モジュールのソースコードのみをインストールする必要がある場合、「spec」ではパラメータ「default_subspec」でその名前が示されます-上記の例を参照してください。



Podfileで、プロバイダーモジュールに対するテストプロジェクトの依存関係を示すと同時に、現在必要なバージョン-0.0.2を示します。

 platform :ios, '7.0' pod 'MyLibrary/Provider', :path => '..' pod 'MyLibrary/Connection', :path => '..'
      
      





プロジェクトの依存関係を更新します。

 $ cd ~/Documents/PodSample/Project/ $ pod update Analyzing dependencies Fetching podspec for `MyLibrary` from `..` Fetching podspec for `MyLibrary` from `..` Downloading dependencies Installing MyLibrary (0.0.2) Generating Pods project Integrating client project
      
      







サードパーティポッドの接続



「ポッド」の開発が、既存の「ポッド」 使用するためにバイクを書きたいところまで来ることがあります。 このためには、「仕様」全体とそのモジュールが必要な「ポッド」に依存していることを示すだけで十分であると推測するのは簡単です。 接続モジュールにAFNetworkingの依存関係を追加します。

 Pod::Spec.new do |s| s.name = "MyLibrary" s.version = "0.0.3" s.summary = "Example of creating own pod." s.homepage = "https://github.com/username/MyCustomPod" s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { "Username" => "username@mail.domain" } s.platform = :ios, 7.0 s.source = { :git => "https://github.com/username/MyCustomPod.git", :tag => s.version.to_s } s.framework = 'Foundation' s.requires_arc = true s.default_subspec = 'Core' #     Core s.subspec 'Core' do |core| core.source_files = 'Classes/AKClass.{h,m}' core.public_header_files = 'Classes/*.h' core.dependency 'MyLibrary/Connection' core.dependency 'MyLibrary/Provider' end s.subspec 'Provider' do |provider| provider.source_files = 'Classes/AKProvider.{h,m}' provider.frameworks = 'MapKit', 'CoreData' #     provider.platform = :ios, 5.0 #       iOS 5.0 end s.subspec 'AccessToken' do |access_token| access_token.source_files = 'Classes/AKAccessToken.{h,m}' access_token.libraries = 'xml2' #    access_token.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' } #     end s.subspec 'Parser' do |parser| parser.source_files = 'Classes/AKParser.{h,m}' end s.subspec 'Storage' do |storage| storage.source_files = 'Classes/AKStorage.{h,m}' storage.dependency 'MyLibrary/AccessToken' end s.subspec 'Connection' do |connection| connection.source_files = 'Classes/AKConnection.{h,m}' connection.dependency 'MyLibrary/Storage' connection.dependency 'MyLibrary/Parser' connection.dependency 'AFNetworking' #     "pod"' end end
      
      





統合により、ユーザーおよび外部ポッドが使用するプラットフォームのバージョンで問題が発生する場合があります。 それらを正常に解決したら、依存関係を更新します(Xcodeまたはプロジェクトが閉じられている場合は非常に望ましいです)。

 $ cd ~/Documents/PodSample/Project/ $ pod update Analyzing dependencies Fetching podspec for `MyLibrary` from `..` Fetching podspec for `MyLibrary` from `..` Downloading dependencies Installing AFNetworking (2.0.1) Installing MyLibrary (0.0.3) Generating Pods project Integrating client project
      
      





必要な「ポッド」がダウンロードされて接続され、ワー​​クスペースが構成されます。 これで、他のすべてのポケモンポッドのパワーを「ポッド」で使用できます。



継続する。



予定:

パート3.彼の「ポッド」の公開 共有リポジトリと個人。



All Articles