Carthage は iOS と macOS のプロジェクト向けの依存関係マネージャーであり、開発者はサードパーティのライブラリをシンプルかつ効率的な方法でアプリケーションに統合できます。CocoaPods などの他のツールとは異なり、Carthage はミニマルで非侵襲的であることを重視しています。つまり、プロジェクトの構造を変更せず、依存関係を列挙したシンプルなテキストファイルである Cartfile だけを必要とします。これにより、サードパーティのライブラリとフレームワークの恩恵を受けつつ、プロジェクトのセットアップの制御を保ちたい開発者の間で人気の選択肢となってきました。
Carthage はバイナリのフレームワークをビルドすることで機能し、それらは Xcode のプロジェクトに直接統合できます。このアプローチにより、開発者はより速いビルド時間と、より合理化された開発のプロセスの恩恵を受けられます。Carthage を使うと、複雑な構成ファイルやプロジェクトへの望ましくない変更なしに、依存関係を簡単に追加、更新、管理できます。その代わりに、ビルドされたフレームワークは手作業で Xcode に追加します。これにより Carthage は、iOS と macOS の開発プロジェクトで、シンプルながら強力な依存関係の管理ソリューションを求める人にとって良いツールとなっています。
Carthage は、iOS と macOS のプロジェクト向けの分散型の依存関係マネージャーです。サードパーティのライブラリをフレームワークとして取得・ビルドし、プロジェクトファイルが自動的に変更されることなく、開発者がそれらを自分で Xcode のプロジェクトに追加します。これによりプロジェクトの構造を完全に制御でき、依存関係は更新されたときにだけビルドされるため、ビルド時間を短縮できます。Carthage は主に CocoaPods のよりシンプルな代替手段として使われており、一方の Swift Package Manager は Apple に組み込まれたパッケージ管理のソリューションです。
More about Carthage
Carthage は、サードパーティのライブラリをプロジェクトに統合するためのシンプルで柔軟な方法を提供する、iOS と macOS 向けの依存関係マネージャーです。プロジェクトのセットアップを自動的に変更する他のツールとは異なり、Carthage は最小限のセットアップを重視し、開発者が不要な制約なしにプロジェクトを管理できる自由を与えます。
技術的には、Carthage はソースコードからバイナリのフレームワークをビルドするか、ビルド済みのものをダウンロードすることで機能し、開発者はこれらのフレームワークを Xcode のプロジェクトに直接含められます。つまり、Carthage はプロジェクトファイルを変更せず、代わりにコンパイルされたフレームワークが保存される「Carthage/Build」フォルダーを生成します。このアプローチにより、開発者はプロジェクトの構造と依存関係を完全に制御できます。
Carthage は 3 つの主要な機能をサポートしており、それぞれが依存関係を扱う異なる方法を提供しています。
依存関係のビルド:Carthage は「Cartfile」に指定されたすべての依存関係を自動的にビルドできます。これにより、Carthage が外部ライブラリのコンパイルを扱う間、開発者は自分のコードに集中できます。この機能は、複数のサードパーティのライブラリを必要とするプロジェクトに最適です。
依存関係の更新:1 つのコマンドで、Carthage はすべての依存関係を、Cartfile のバージョンの要件を満たす最新のバージョンに更新できます。これにより、セキュリティ修正を含め、ライブラリを最新の状態に保つのが簡単になり、これは互換性とセキュリティを維持するうえで重要です。
フレームワークの統合:Carthage はフレームワークを生成し、開発者はそれらを通常「Frameworks, Libraries, and Embedded Content」の下に自分で Xcode のプロジェクトに追加します。これには手作業の手順が必要ですが、どのライブラリがプロジェクトの一部なのかを正確に把握でき、サードパーティのライブラリの新しい機能と改善の恩恵を受けやすくなります。
Carthage の最大の強みの一つは、そのシンプルさと柔軟性です。自動化されたプロジェクトの変更を避けることで、Carthage は開発者がプロジェクトの制御を保てるようにします。これにより、プロジェクトファイルでの競合のリスクが減り、既存のプロジェクト構造を乱すことなく新しい依存関係を統合しやすくなります。
Carthage の依存関係の管理へのアプローチは、日々の作業の時間も節約します。依存関係を追加または更新したときにだけビルドし、不要なプロジェクトの変更を避けることで、Carthage はプロジェクトの保守に必要な時間とリソースを最小限に抑えます。これにより、ワークフローを最適化し、高品質なソフトウェアの提供に集中したい開発者にとって良いツールとなっています。
実際に、Carthage は、開発者が iOS と macOS のプロジェクトで依存関係を管理する方法に大きな影響を与えてきました。小規模と大規模の両方の開発チームが、プロジェクトを最新かつ安全で保守しやすい状態に保つために使ってきました。ただし現在、Carthage の開発は大幅に鈍化しており、ほとんどのライブラリはまず Swift Package Manager を対象としています。
まとめると、Carthage は、シンプルさ、柔軟性、効率性を 1 つのソリューションに組み合わせ、個人の開発者と大規模なチームの両方にとって依存関係の管理をより透明なものにするツールです。シンプルなセットアップとプロジェクト構造への最小限の介入により、迅速で安全な統合が必要なアプリ開発において役立つツールとなってきました。
Frequently asked questions about Carthage
Carthage とは何で、実際にはどのように機能するのですか?
Carthage は、Swift と Objective-C で書かれた iOS、macOS、tvOS、watchOS のプロジェクト向けの分散型の依存関係マネージャーです。中央のパッケージレジストリはありません。代わりに、各依存関係は通常 GitHub 上の Git リポジトリを直接指します。
依存関係は、プロジェクトのルートフォルダーにある Cartfile という名前のテキストファイルに指定されます。コマンド carthage update を実行すると、Carthage は適切なバージョンを見つけ、ソースコードを Carthage/Checkouts フォルダーに取得し、Xcode 自体のビルドツールで各ライブラリをビルドします。完成したフレームワークは Carthage/Build に置かれます。
Carthage は Xcode のプロジェクトファイルを変更しません。開発者は、該当するターゲットの Frameworks, Libraries, and Embedded Content の下に、ビルドされたフレームワークを追加します。これによりプロジェクトのセットアップを完全に制御できますが、自動的に統合するツールよりも少し多くの手作業が必要になります。
Carthage はどのようにインストールし、ライブラリはどのように追加するのですか?
Carthage は、ほとんどの場合、コマンド brew install carthage を使って Homebrew でインストールされます。あるいは、GitHub にあるプロジェクトのリリースからインストーラーパッケージをダウンロードすることもできます。
ライブラリは通常、4 つの手順で追加されます。
- プロジェクトのルートフォルダーに、
github "Alamofire/Alamofire" ~> 5.0のような行を含むファイルCartfileを作成します。 - コマンド
carthage update --use-xcframeworks --platform iOSでライブラリを取得してビルドします。 Carthage/Buildにある完成した.xcframeworkを、アプリのターゲットの Frameworks, Libraries, and Embedded Content にドラッグします。- 動的フレームワークの場合は、Embed & Sign を選択します。
~> 演算子は、メジャーバージョンが同じである限り新しいバージョンを受け入れることを意味します。その後、ライブラリは import Alamofire でコードから使えます。
Cartfile と Cartfile.resolved の違いは何ですか?
Cartfile は、プロジェクトに必要な依存関係と、それらが満たさなければならないバージョンの要件を記述します。たとえば ~> 5.0、>= 2.1、特定のブランチなどです。このファイルは手作業で編集され、意図を表します。
Cartfile.resolved は自動的に生成され、依存関係自体の依存関係も含め、実際に選ばれた正確なバージョンやコミットが含まれています。このファイルはロックとして機能するため、チームの全員とすべてのビルドサーバーがまったく同じコードを得られます。
違いはコマンドに表れます。
carthage updateはCartfileに一致する最新のバージョンを見つけ、結果をCartfile.resolvedに書き込みます。carthage bootstrapはCartfile.resolvedに記載されたとおりのバージョンを取得してビルドします。
そのため、両方のファイルをバージョン管理に置くべきです。テスト用のライブラリなど、開発中にだけ使う依存関係は Cartfile.private に置けます。
Carthage は XCFramework をどのようにビルドし、それはなぜ重要なのですか?
以前、Carthage はいわゆる fat framework をビルドしていました。そこでは、実機とシミュレーター向けのコードが lipo ツールで 1 つのファイルにまとめられていました。これは Xcode 12 で機能しなくなりました。Apple Silicon では実機とシミュレーターの両方が arm64 アーキテクチャを使い、1 つの fat framework に同じアーキテクチャを 2 回含めることはできないからです。
その解決策が、Apple が Xcode 11 で導入した XCFramework です。XCFramework は、iOS の実機と iOS シミュレーターなど、プラットフォームとバリアントごとに別々のバイナリを持つバンドルです。Carthage 0.37 以降、XCFramework は --use-xcframeworks フラグでビルドされます。たとえば carthage bootstrap --use-xcframeworks です。
結果は .xcframework フォルダーとして Carthage/Build に置かれます。これらはアプリのターゲットに直接追加され、以前の carthage copy-frameworks を使うビルドフェーズはもう必要ありません。
Carthage、CocoaPods、Swift Package Manager の違いは何ですか?
この 3 つのツールは同じ課題を解決しますが、方法が異なります。
- Carthage は分散型であり、
Cartfileに指定された Git リポジトリから依存関係を直接取得します。ライブラリはバイナリのフレームワークとしてビルドされ、Xcode のプロジェクトは変更されません。統合は手作業で行います。 - CocoaPods は中央のライブラリレジストリと
Podfileを使います。pod installコマンドはワークスペースを作成し、プロジェクトのセットアップを変更するため、統合は自動的に行われますが、透明性は低くなります。CocoaPods は現在メンテナンスモードにあります。 - Swift Package Manager (SPM) は Apple 自身のツールであり、Xcode に組み込まれています。パッケージは Xcode で直接追加するか
Package.swiftに記述し、追加のインストールは必要ありません。
依存関係は更新されたときにだけビルドされるため、Carthage はプロジェクトファイルの完全な制御と短いビルド時間が求められる場合に役立ちます。新しいプロジェクトでは、ほとんどのライブラリがサポートしているため、現在は SPM が最も広く使われている選択肢です。
Carthage でのビルド時間を抑えるにはどうすればよいのですか?
Carthage はデフォルトで依存関係をソースコードからビルドするため、最初のビルドには長い時間がかかることがあります。いくつかのオプションで時間を短縮できます。
--platform iOSは、プロジェクトが実際に使うプラットフォームにビルドを限定します。--cache-buildsは、同じバージョンですでにビルドされた依存関係をスキップするため、変更されたライブラリだけが再ビルドされます。- すべてを更新する代わりに、たとえば
carthage update Alamofireのように、個々の依存関係を個別に更新できます。 - 多くのライブラリは GitHub のリリースでビルド済みのフレームワークを提供しており、Carthage はそれを自動的にダウンロードします。クローズドソースの SDK は、
binaryと JSON の仕様への URL で指定できます。
ビルドサーバーでは、Carthage/Build フォルダーを実行間でキャッシュすることもできます。多くのチームは .gitignore でこのフォルダーを Git から外し、carthage bootstrap で再作成しています。
Carthage for dummies
Carthage は、アプリを形づくる「依存関係」と呼ばれる小さな構成要素を整理・管理するのに役立つツールです。アプリをより良く機能させるために、他の人がすでに作った既製の部品を必要とするアプリを作ることを想像するとわかりやすいでしょう。Carthage はこれらの部品を取得して把握するのに役立つため、ゼロから作る必要がありません。プロジェクトに必要なすべての本を把握し、書き手が自分の物語に集中できるようにする司書に少し似ています。他の人の作業を再利用しながら、すべてがうまく組み合わさるようにできるため、アプリの開発がより簡単で速くなります。