Carthage / カーステージ

author
4 minutes, 41 seconds Read

Carthage は、Cocoa アプリケーションにフレームワークを追加する最もシンプルな方法であることを目的としています。

Carthage は依存関係を構築してバイナリ フレームワークを提供しますが、プロジェクトの構造とセットアップは完全に制御したままになります。 Carthage は、プロジェクト ファイルやビルド設定を自動的に変更しません。

  • Quick Start
  • Carthage のインストール
  • アプリケーションにフレームワークを追加する
    • はじめに
      • Building platform->
      • フレームワークの構築。独立した XCFrameworks
        • Migrating a project from framework bundles to XCFrameworks
      • Building platform-specific framework bundles
        • If you’re building for macOS
        • If you’re building for iOS.XCFrameworks
        • If you’re built for the platform-specific framework bundles
        • プラットフォーム固有のフレームワーク バンドルを構築します。 tvOS, または watchOS
      • すべてのプラットフォーム
      • (オプション)古い依存関係について警告するビルドフェーズの追加
      • Swift バイナリ フレームワークのダウンロードの互換性
    • Carthage を使用するプロジェクトの実行
    • ユニット テストまたはフレームワークにフレームワークを追加する
    • フレームワークのアップグレード
      • Experimental Resolver
    • Nested 依存関係
    • 依存関係にサブモジュールを使用する
    • 依存関係の自動再構築
    • ビルドのキャッシュ
    • Bash/Zsh/Fish の補完
  • サポートすること Carthage for your framework
    • Share your Xcode schemes
    • Resolve build failures
    • Tag stable releases
    • Archive prebuilt frameworks into one zip file
      • Use travis->Travis->Share frameworks
          Use travis->Share frameworks
      • Resolve build fails

    • Tag stable release
  • アプリの起動時間を短縮するために静的フレームワークをビルドする
  • 互換性を宣言する
  • 既知の問題
    • DWARFs シンボル問題
  • CarthageKit
  • Carthage との相違点 CocoaPods
  • License
  • Quick Start

    1. Get Carthage by running brew install carthage or choose another installation method

    2. Create a Cartfile in same directory where your .xcodeproj or .xcworkspace is

    3. List an desired dependencies in the Cartfile, 例えば

      github "Alamofire/Alamofire" ~> 4.7.2
    4. Run carthage update --use-xcframeworks

    5. A Cartfile.resolved ファイルと Carthage ディレクトリが .xcodeproj または .xcworkspace がある同じディレクトリに現れます

    6. Carthage/Build から構築した .xcframework バンドルをアプリケーション Xcode プロジェクトの “Frameworks and Libraries” のセクションにドラッグしてください。

    7. Carthage をアプリケーションに使用する場合、「& Sign を埋め込む」を選択し、そうでなければ「埋め込まない」。

    詳細については、アプリケーションへのフレームワークの追加

    Carthage

    Carthage をインストールするには複数の選択肢があります:

    • Installer.B: インストーラー。 最新リリースの Carthage.pkg ファイルをダウンロードして実行し、画面上の指示に従います。 CLI で pkg をインストールする場合、最初に sudo chown -R $(whoami) /usr/local を実行する必要があるかもしれません。

    • Homebrew: Homebrew を使って、brew updatebrew install carthage を実行するだけで、carthage ツールをシステムにインストールすることができます。 (注意: 以前にバイナリ版の Carthage をインストールしていた場合は、/Library/Frameworks/CarthageKit.framework を削除してください)。

    • MacPorts: sudo port selfupdatesudo port install carthage を実行するだけで、MacPorts を使用し、システムに carthage ツールをインストールすることができます。 (注意: 以前にバイナリ版の Carthage をインストールしていた場合は、/Library/Frameworks/CarthageKit.framework を削除してください)。

    • From source: 最新の開発版 (非常に不安定または互換性がない可能性があります) を実行したい場合は、リポジトリの master ブランチをクローンし、make install を実行するだけです。 Xcode 10.0 (Swift 4.2) が必要です。

    Adding frameworks to an application

    Carthage をインストールしたら、プロジェクトにフレームワークを追加し始めることができます。 Carthage は、iOS 8 以降 (または OS X の任意のバージョン) でしか利用できない動的フレームワークのみをサポートしていることに注意してください。

    Getting started

    Building platform-independent XCFrameworks (Xcode 12 and above)

    1. プロジェクトで使用するフレームワークをリストする Cartfile を作成します。 これは、Carthage/Checkouts フォルダーに依存関係をフェッチし、それぞれをビルドするか、または事前にコンパイルされた XCFramework をダウンロードします。
    2. アプリケーション ターゲットの General settings タブの Frameworks, Libraries, and Embedded Content セクションで、ディスク上の Carthage/Build フォルダーから使用したい各 XCFramework をドラッグ アンド ドロップします。
    フレームワークバンドルから XCFrameworks へのプロジェクトの移行

    バージョン 0.37.0 (2021 年 1 月) の XCFrameworks の使用を推奨し、Apple Silicon Mac で構築する場合は XCFrameworks を必須としています。

    移行手順

    1. Delete your Carthage/Build folder to remove any existing framework bundles.
    2. Build new XCFrameworks by running carthage build --use-xcframeworks.XCFrameworks from Discrete framework bundles to XCFrameworks requires a few changes to your project: Migration steps
      1. Delete your Carthage/Build folder to remove any existing framework bundles. 506>
      2. ターゲットの Frameworks, Libraries, and Embedded Content セクションおよび/またはその Link Binary with Libraries ビルド フェーズから Carthage フレームワークへの参照を削除します。
        • アプリケーション ターゲットの場合: [全般設定] タブの [フレームワーク、ライブラリ、および埋め込みコンテンツ] セクションで、ディスク上の Carthage/Build フォルダから、使用する各 XCFramework をドラッグ アンド ドロップします。
        • Framework ターゲットの場合: [Build Phases] タブの [Link Binary with Libraries] フェーズで、ディスク上の Carthage/Build フォルダから使用する各 XCFramework をドラッグ アンド ドロップしてください。 Xcode 12 以上でフレームワーク バンドルを構築する場合、マルチ アーキテクチャ プラットフォームはサポートされません。 XCFrameworks を使用してビルドすることをお勧めします。
          If you’re building for macOS

          macOS-specific instructions

          1. Cartfile を作成し、プロジェクトで使用したいフレームワークをリストアップします。 これは、依存関係を Carthage/Checkouts フォルダーにフェッチし、それぞれをビルドするか、またはコンパイル済みのフレームワークをダウンロードします。
          2. アプリケーション ターゲットの [General settings] タブの [Embedded Binaries] セクションで、ディスク上の Carthage/Build フォルダーから使用したいフレームワークをそれぞれドラッグアンドドロップします。

          さらに、OS X でデバッグおよびクラッシュ レポートするために、デバッグ シンボルをコピーする必要があります。

          1. アプリケーション ターゲットのビルド フェーズ設定タブで、+ アイコンをクリックし、新規ファイル コピー フェーズを選択します。
          2. 宛先ドロップダウン メニューをクリックし、製品ディレクトリを選択します。
          iOS、tvOS、または watchOS 用に構築する場合

          Platform-specific instructions

          1. プロジェクトで使用するフレームワークをリストした Cartfile を作成します。 これは、Carthage/Checkouts フォルダに依存関係をフェッチし、各々をビルドするか、またはプリコンパイルされたフレームワークをダウンロードします。 Xcode 11.0 以降では、[Frameworks, Libraries, and Embedded Content] セクションで、ディスク上の Carthage/Build フォルダから使用する各フレームワークをドラッグ アンド ドロップします。 その後、「埋め込み」セクションで、追加した各アイテムのプルダウンメニューから「埋め込まない」を選択します。 Xcode 10.x 以前の場合、[Linked Frameworks and Libraries] セクションで、ディスク上の Carthage/Build フォルダから使用したい各フレームワークをドラッグ アンド ドロップします。

          2. アプリケーション ターゲットの Build Phases 設定タブで、+アイコンをクリックして [New Run Script Phase] を選択します。 シェルを指定したRun Scriptを作成します(例:/bin/sh)。シェルの下のスクリプト領域に以下の内容を追加します:

            /usr/local/bin/carthage copy-frameworks
          3. input.xcfilelistというファイルとoutput.xcfilelist

          4. input.xcfilelistに使用するフレームワークへのパスを追加してください。 例:

            $(SRCROOT)/Carthage/Build/iOS/Result.framework$(SRCROOT)/Carthage/Build/iOS/ReactiveSwift.framework$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework
          5. コピーしたフレームワークへのパスをoutput.xcfilelistに追加します。 例:

            $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveSwift.framework$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveCocoa.framework

            入力ファイルと一緒に出力ファイルを指定すると、Xcode は入力ファイルが変更されたとき、または出力ファイルが見つからないときだけ、スクリプトを実行する必要があります。 これは、Carthage でフレームワークを再構築していない場合、ダーティ ビルドがより高速になることを意味します。

          6. Carthage 実行スクリプト フェーズの “Input File Lists” セクションに input.xcfilelist を追加

          7. Carthage 実行スクリプト フェーズの “Output File Lists” セクションに output.xcfilelist を追加

          このスクリプトはユニバーサル バイナリが引き金になっている App Store 投稿バグに対処するとともに、アーカイブ時に必要なビットコード関連ファイルと dSYM が確実にコピーされるようにします。

          ビルドされた製品ディレクトリにコピーされたデバッグ情報により、ブレークポイントで停止するたびに、Xcode はスタック トレースをシンボル化することができるようになります。 これは、デバッガーでサード パーティのコードをステップスルーすることも可能になります。

          アプリケーションを App Store または TestFlight に提出するためにアーカイブする場合、Xcode はこれらのファイルもアプリケーションの .xcarchive バンドルの dSYMs サブディレクトリにコピーします。 その中で最も重要なのは Cartfile.resolved ファイルで、各フレームワークに対して実際にビルドされたバージョンをリストアップしています。 プロジェクトを使用する他の誰もが、同じフレームワーク バージョンを構築するためにそのファイルが必要になるからです。

          (オプション) 古い依存関係について警告するビルド フェーズの追加

          依存関係のいずれかが古くなったときに自動的に警告する Run Script フェーズを追加することができます。 シェルを指定する Run Script を作成し (例: /bin/sh)、シェルの下のスクリプト領域に次の内容を追加します:

      /usr/local/bin/carthage outdated --xcode-warnings 2>/dev/null

      Swift バイナリ フレームワーク ダウンロード互換

      Carthage はダウンロードした Swift (と Objective-C/Swift 混合フレームワーク ) がローカルで使用中の Swift と同じバージョンで構築されているかを確認するため、確認を実行します。 バージョンの不一致がある場合、Carthage はソースからフレームワークを構築するよう進めます。 フレームワークをソースから構築できない場合、Carthage は失敗します。

      Carthage はローカルの Swift バージョンを決定するために xcrun swift --version の出力を使用するので、使用する予定の Swift ツール チェーンで Carthage コマンドを実行することを確認します。 多くの使用例では、何も追加する必要はありません。 しかし、たとえば、Xcode 8.x を使用して Swift 2.3 プロジェクトを構築する場合、carthage bootstrap にデフォルトの swift を指定する 1 つのアプローチは、次のコマンドを使用することです:

      TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage bootstrap

      Running a project that uses Carthage

      上記の手順を終了して変更を反映したら、プロジェクトの他のユーザーはリポジトリを取得し carthage bootstrap を実行して、あなたが加えたフレームワークを開始するだけでよいです。

      ユニット テストまたはフレームワークにフレームワークを追加する

      任意のターゲットの依存関係に対して Carthage を使用することは、アプリケーションに対して Carthage を使用することにかなり似ています。 主な違いは、フレームワークが実際に Xcode で設定されリンクされる方法にあります。

      ユニット テスト ターゲットには [一般設定] タブの [Linked Frameworks and Libraries] セクションがないため、代わりに、構築済みのフレームワークをライブラリとのリンク構築フェーズにドラッグする必要があります。

      [ビルド設定] タブのテスト ターゲットで、@loader_path/Frameworks がまだ存在しなければ [実行パス検索] に追加します。

      まれに、それぞれの依存関係をビルド製品にコピーしたい場合もあります (例: … 続きを読む たとえば、外部フレームワーク内に依存関係を埋め込むため、または依存関係がテスト バンドルに存在することを確認するため)。 これを行うには、Frameworks を宛先とする新しい Copy Files ビルド フェーズを作成し、そこにフレームワークの参照も追加します。 テスト バンドルはフレームワークを取り除く必要がなく、copy-frameworks の同時インスタンス実行 (並列ビルドをオン) はサポートされていないため、carthage copy-frameworks コマンドは使用しないでください。

      Upgrading frameworks

      カートファイルを変更したり、各フレームワークの最新版に更新したい場合 (指定した要件がある場合) 、単に carthage update コマンドをもう一度実行してください。

      carthage update Box

      または

      carthage update Box Result
      Experimental Resolver

      フレームワークをアップグレードするロジックは、速度とメモリ使用量を減らす目的で書き直されました。 現在はオプトイン機能となっています。 update コマンドに --new-resolver を渡すことで使用できます (例:

      carthage update --new-resolver Box

      更新中にパフォーマンスの問題が発生した場合、新しいリゾルバを試してみてください

      Nested dependencies

      プロジェクトに追加するフレームワークに Cartfile で明示的にリストされた依存関係がある場合、Carthage が自動的にそれを取得します。 その後、Carthage/Build フォルダーからプロジェクトにそれらを自分でドラッグする必要があります。

      プロジェクト内の組み込みフレームワークに他のフレームワークへの依存関係がある場合、それらをアプリケーション ターゲットにリンクする必要があります (アプリケーション ターゲットがそのフレームワークへの依存関係を持たず、それらを使用しない場合でも)。

      依存関係にサブモジュールを使用する

      デフォルトでは、Carthage は依存関係のソース ファイルをプロジェクト フォルダーに直接チェックアウトし、選択に応じてそれらをコミットまたは無視するように任せます。 依存関係を Git サブモジュールとして利用したい場合は、carthage update または carthage checkout--use-submodules フラグを付けて実行します。

      この方法で実行すると、Carthage はリポジトリの .gitmodules および .git/config ファイルに書き込み、依存関係のバージョンが変更されるとサブモジュールを自動的に更新します。

      依存関係を自動的に再構築する

      開発中に依存関係に取り組み、親プロジェクトを構築するときにそれらを自動的に再構築したい場合、次のように Carthage を呼び出す Run Script 構築フェーズを追加できます:

      /usr/local/bin/carthage build --platform "$PLATFORM_NAME" --project-directory "$SRCROOT"

      プレーン チェックアウトは直接修正してはいけないため、これを行う前にサブモジュールを使用すべきことに留意してください。

      Caching builds

      デフォルトでは、Carthage は、以前と同じ解決済みのバージョンであるかどうかに関係なく、依存関係を再構築します。 --cache-builds を渡すと、carthage は可能な限り依存関係の再構築を回避します。 Carthage がこのキャッシュを実行する方法の詳細については、バージョン ファイルに関する情報を参照してください。

      Note: 現時点で --cache-builds--use-submodules と互換性がありません。 両方を使用すると、サブモジュールの依存関係の作業コピーおよびコミットされた変更が正しく再構築されなくなります。 詳細は #1785 を参照してください。

      Bash/Zsh/Fish 補完

      Bash/Zsh/Fish Completion のドキュメントにあるように、Carthage コマンドとオプションの自動補完が利用できます。

      Supporting Carthage for your framework

      Carthage では動的フレームワークのみが公式にサポートされています。 動的フレームワークは OS X のどのバージョンでも使用できますが、iOS 8 以降では使用できません。 さらに、バージョン 0.30.0 以降、Carthage は静的フレームワークをサポートします。

      Carthage には集中パッケージ リストやプロジェクト指定形式がないため、ほとんどのフレームワークは自動的に構築されます。

      Xcode スキームの共有

      Carthage はあなたの .xcodeproj から共有した Xcode スキームのみを構築します。 意図したスキームがすべて正常にビルドされるかどうかは、carthage build --no-skip-current を実行し、Carthage/Build フォルダーをチェックすることで確認できます。

      このコマンドを実行しても重要なスキームがビルドされない場合は、Xcode を開き、そのスキームを共有としてマークし、Carthage がそれを検出できるようにしてください。

      ビルドの失敗を解決する

      carthage build --no-skip-currentでビルドに失敗した場合、xcodebuild -scheme SCHEME -workspace WORKSPACE build または xcodebuild -scheme SCHEME -project PROJECT build (実際の値) を実行して、そこで同じ失敗が発生するかどうかを確認します。

      複数のバージョンの Apple 開発者ツール (Xcode ベータ版など) をインストールしている場合、xcode-select を使用して Carthage が使用するバージョンを変更します。

      まだ Carthage でフレームワークを構築できない場合は、issue を開いてください。 たとえば、タグ v1.2 では、セマンティック バージョンは 1.2.0.

      バージョン番号がないタグ、またはバージョン番号の後に何らかの文字があるタグ (例:,

      Archive prebuilt frameworks into one zip file

      Carthage は、プロジェクトのリポジトリ上の GitHub リリースに添付されているか、バイナリ プロジェクト定義ファイルを介して、ゼロから構築する代わりに、自動的にプレビルド フレームワークを使用することができます。

      特定のタグにビルド済みフレームワークを提供するには、サポートされているすべてのプラットフォーム用のバイナリを 1 つのアーカイブに圧縮し、そのアーカイブをそのタグに対応する公開リリースに添付する必要があります。 添付ファイルは、バイナリを含むことを Carthage に示すために、その名前に .framework を含める必要があります(例: ReactiveCocoa.framework.zip)。 アーカイブのディレクトリ構造は自由ですが、フレームワークは名前に基づいて Carthage/Build/<platform> にコピーされるため、アーカイブ内に一度だけ表示されるべきです (例: ReactiveCocoa.framework)。

      以下のように、carthage 自体でアーカイブ操作を行うこともできます。

      タグ付けされたビルド済みフレームワークをアップロードするために travis-ci を使用する

      タグ付けされたリリースをビルドしてアップロードするために travis-ci を使用することは可能です。

      1. Travis CLI を gem install travis

      2. でインストールし、

      3. あなたのリポジトリ用に travis-ci を設定します (ステップ 1 と 2)

      4. そのテンプレートに基づいてリポジトリのルートに .travis.yml ファイルを作成します。 FRAMEWORK_NAME を正しい値に設定します。

        PROJECT_PLACEHOLDER と SCHEME_PLACEHOLDER を入れ替えます。

        プロジェクトの代わりにワークスペースを使用している場合は、xcode_project 行を削除して xcode_workspace 行をアンコメントします。

        プロジェクトの形式は、このようになるはずです。 MyProject.xcodeproj

        The workspace should be in the format: MyProject.xcodeproj

        The workspace should be in the format: MyWorkspace.xcworkspace

        xcode_sdk の値を他の SDK に更新するのは自由ですが、iphoneos SDK でテストする場合は、コード署名 ID をアップロードする必要があります

        For more informations you can visit travis docs for objective-c projects

        language: objective-cosx_image: xcode7.3xcode_project: <PROJECT_PLACEHOLDER># xcode_workspace: <WORKSPACE_PLACEHOLDER>xcode_scheme: <SCHEME_PLACEHOLDER>xcode_sdk: iphonesimulator9.3env: global: - FRAMEWORK_NAME=<THIS_IS_A_PLACEHOLDER_REPLACE_ME>before_install: - brew update - brew outdated carthage || brew upgrade carthagebefore_script: # bootstrap the dependencies for the project # you can remove if you don't have dependencies - carthage bootstrapbefore_deploy: - carthage build --no-skip-current - carthage archive $FRAMEWORK_NAME
      5. Run travis setup releases.Project.xcodesproj

        .xcodesproj.xcodesProject

        3276 follow documentation here

        このコマンドは GitHub のクレデンシャルを .travis.yml ファイルにエンコードして、travis が GitHub にリリースをアップロードできるようにするものです。comアップロードするファイルの入力を求められたら、$FRAMEWORK_NAME.framework.zip

      6. タグで実行するためにデプロイセクションを更新します:

        .travis.ymlで、

        on: repo: repo/repo

        そして tags: trueskip_cleanup: true を追加します。

        skip_cleanup: trueon: repo: repo/repo tags: true

        これにより、新しいタグがプッシュされたときに配置を作成するように travis に通知し、travis が生成された zip ファイルをクリーンアップするのを防ぎます

      アプリの起動時間を高速化する静的フレームワークの構築

      アプリに多くの動的フレームワークを埋め込んだ場合、プリメイン起動時間がかなり遅くなることがあります。 Carthage では、動的フレームワークを静的フレームワークとして構築することにより、これを緩和することができます。 静的なフレームワークは、アプリケーションに直接リンクすることも、ワークフローに少し変更を加えるだけでより大きな動的フレームワークに統合することも可能で、プリメインの起動時間を大幅に短縮できます。 ただし、フレームワークと明記されているため、Darwin バンドルには .framework 拡張子が付き、静的にリンクされたオブジェクト アーカイブが含まれていることに注意してください。

      ワークフローはほとんど変わりません。

      • 動的バイナリと同様に、製品 > スキーム > スキームの管理…で共有されている Carthage 準拠プロジェクトのスキームをチェックする必要があります
      • 動的バイナリと同じように、.framework ファイルに対してリンクする必要があります。動的バイナリ

      ただし:

      • Carthage 準拠プロジェクトの Cocoa Framework ターゲットの [構築設定] の [リンク] セクションで、Mach-O Type を Static Library
      • 静的にリンクしたフレームワークは .NET で構築されるでしょう。/Carthage/Build/$(PLATFORM_NAME)/Static
      • carthage copy-frameworks Build Phase

      Carthage 0.29.0 以下

      詳細は StaticFrameworks doc を参照してください。

      このアプローチにはいくつかの注意点があることに注意してください:

      • Swift static frameworks は Apple によって公式にサポートされていません
      • これは Carthage に組み込まれていない高度なワークフローであり、YMMV

      Declare your compatibility

      Carthage とともに使用できることを宣伝したいとお考えでしょうか。 次の Markdown:

      (https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)

      既知の問題

      DWARFs symbol problem

      Pre-built framework cannot be debugged using step execution on other machine that the framework was built on….を README に挿入するだけで互換バッジ:

      を追加することができます。 単純に carthage bootstrap/build/update --no-use-binaries で修正できますが、より自動化された回避策については、#924 を参照してください。 この問題の根本的な原因を Apple に修正してもらいたい場合は、rdar://23551273 を複製してください。

      CarthageKit

      コマンドライン ツールの機能の大部分は、実際には CarthageKit というフレームワークにカプセル化されています。

      Carthage を他のツールの一部として使用したい場合、あるいは Carthage の機能を拡張したい場合は、CarthageKit ソース コードを見て、API がニーズに合っているかどうかを確認してください。

      Carthage と CocoaPods の違い

      CocoaPods は Cocoa の長年にわたる依存性マネージャーです。 では、なぜ Carthage が作られたのでしょうか。

      まず、CocoaPods は (デフォルトで) アプリケーションとすべての依存関係のために Xcode ワークスペースを自動的に作成し、更新します。 Carthage は xcodebuild を使用してフレームワーク バイナリを構築しますが、それらを統合する責任はユーザーに委ねられます。 CocoaPods のアプローチは使いやすく、Carthage のアプローチは柔軟で邪魔になりません。

      CocoaPods の目標は、その README に次のように記載されています:

      … より集中したエコシステムを作成し、サード パーティのオープン ソース ライブラリの検出と関与を改善すること。 プロジェクトの中央リストがないため、メンテナンス作業が軽減され、中央障害点が回避されます。 しかし、プロジェクトの発見はより困難で、ユーザーは GitHub のトレンド ページまたは同様のものに頼らなければなりません。

      CocoaPods プロジェクトには、プロジェクトに関するメタデータを含み、どのように構築されるべきかを指定する、いわゆる Podspec ファイルも必要です。 Carthage は、依存関係を単一のワークスペースに統合するのではなく、xcodebuild を使用して構築します。同様の仕様ファイルはありませんが、依存関係には、製品を構築する方法を説明する独自の Xcode プロジェクトを含める必要があります。 CocoaPods は、さらなる複雑さを犠牲にして、Carthage には決してない多くの素晴らしい機能を提供します。

      License

      Carthage は MIT License の下でリリースされています。

      ヘッダーバックグラウンドの写真は CC BY-NC-SA 2.0 license でリリースされました。 オリジナル写真: Richard Mortel.

      .

    Similar Posts

    コメントを残す

    メールアドレスが公開されることはありません。