明示的に依存関係を宣言して分離する

GitHub で編集する

理想的には iOS-factor アプリはシステム全体のパッケージの暗黙的な存在に依存することはありません。 すべての依存関係を依存関係宣言マニフェストによって完全かつ正確に宣言します。 これには XcodeCocoaPodsfastlane の正確なバージョンを含みます。

明示的に依存関係を宣言するメリットは、アプリを初めて使用する開発者向けの設定を簡素化するだけでなく、再現可能な方法で過去のビルドを再実行できる信頼できるビルドシステムを持つことです。 新しい開発者は、開発マシンにアプリケーションのコードベースをチェックアウトすることができます。これには、言語ランタイムと依存関係マネージャーだけが前提条件としてインストールされている必要があります。 彼らは決定的なビルドコマンドでアプリケーションのコードを実行するために必要なものすべてを設定することができます。

正確な依存関係を指定することで、6か月前から遡ってビルドし直すことができます。Xcode、CocoaPods、Swiftの同じバージョンを使用するためビルドが成功することがわかっています。

iOS 開発は Web 開発のようにはコンテナ化されておらず、Apple が公式のソリューション(rdar://40669395)を提供するまで、この要件を満たすサードパーティのツールに限られています。

当面は、さまざまなサードパーティのツールを使用することで依存関係を明示的に宣言することができます。

Swift ベースのツール

Apple は Swift Package Manager に関する優れたガイドを提供しています。

Xcode のバージョン指定

iOS プロジェクトのルートディレクトリで .xcode-version ファイルを使えば、Xcode の正確なバージョンを宣言することができます。

この方法では、CI システムが指定されたバージョンの Xcode を自動的にインストールして利用するように構成することができます。(インストール済みの)Xcode のバージョンを切り替えるには、chxcode のようなツールを使うことができます。

Xcode のインストールを自動化するには、Apple が Xcode をインストールするコマンドラインツール(rdar://40669425)を提供するまではサードパーティ製ツールである xcode-install を使います。

Ruby ベースのツール

Ruby は Gemfile で正確な依存関係を定義するために bundler を使います。

source "https://rubygems.org"

gem "fastlane", ">= 2.96.1", "<= 3.0.0"
gem "cocoapods", "~> 1.5"

Gemfile と自動的に生成される Gemfile.lock は Ruby ベースのバージョン管理システムにチェックインしなければなりません。そうするとビルドシステムは Ruby ベースの依存関係をインストールするために bundle install を実行することができます。

JavaScript ベースのツール

JavaScript ベースの iOS アプリ(例: React Native)は、package.json ファイルを使って必要なすべての依存関係を定義します。

{
  ...
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "15.4.2",
    "react-native": "0.42.3",
    ...
  }
}

package.json は再現可能なビルドのバージョン管理にチェックするべきです。