記事「Rustで依存しているクレートのライセンスをまとめる」のサムネイル

Rustで依存しているクレートのライセンスをまとめる

依存しているクレートのライセンス条項をまとめるためのcargo-bundle-licensesを使ってみました。

GitHub - sstadick/cargo-bundle-licenses: Generate a THIRDPARTY file with all licenses in a cargo project.
Generate a THIRDPARTY file with all licenses in a cargo project. - sstadick/cargo-bundle-licenses
GitHub - sstadick/cargo-bundle-licenses: Generate a THIRDPARTY file with all licenses in a cargo project. favicon github.com
GitHub - sstadick/cargo-bundle-licenses: Generate a THIRDPARTY file with all licenses in a cargo project.

背景

私はTauriという、Rustでバックエンドの処理が書けるデスクトップ/モバイルアプリケーションフレームワークを使っています。ライセンス表示をしようと思い、依存しているクレートのライセンス条項をまとめる方法を検討していました。

Rust側とWebフロント側での依存関係をまとめたいため、JSON形式で扱いたいなと思いながら探しており、そこで見つけたのがcargo-bundle-licensesです。

cargo-bundle-licenses

出力形式としては、TOML、JSON、YAMLが選べます。

cargo bundle-licenses --format json --output deps.json

randクレートに依存しているプロジェクトで実行すると、成果物は以下のようになりました。

{
  "root_name": "dep",
  "third_party_libraries": [
    {
      "package_name": "bitflags",
      "package_version": "2.9.0",
      "repository": "https://github.com/bitflags/bitflags",
      "license": "MIT OR Apache-2.0",
      "licenses": [
        {
          "license": "MIT",
          "text": "(ライセンス条項)"
        },
        {
          "license": "Apache-2.0",
          "text": "(ライセンス条項)"
        }
      ]
    },
    {
      "package_name": "cfg-if",
      "package_version": "1.0.0",
      "repository": "https://github.com/alexcrichton/cfg-if",
      "license": "MIT/Apache-2.0",
      "licenses": [
        {
          "license": "MIT",
          "text": "(ライセンス条項)"
        },
        {
          "license": "Apache-2.0",
          "text": "(ライセンス条項)"
        }
      ]
    },

    (省略)

randと、randが依存しているクレートのクレートのライセンス条項が含まれています。(ライセンス条項)の部分には実際のライセンス条項が書かれています。

内部的にはcargo_metadataでパッケージの場所を取得し、そこでLICENSE.txtLICENSE-MITなどのファイルを探しているようです。

cargo-bundle-licenses/src/discovery.rs at main · sstadick/cargo-bundle-licenses
Generate a THIRDPARTY file with all licenses in a cargo project. - sstadick/cargo-bundle-licenses
cargo-bundle-licenses/src/discovery.rs at main · sstadick/cargo-bundle-licenses favicon github.com
cargo-bundle-licenses/src/discovery.rs at main · sstadick/cargo-bundle-licenses

他のツールとの比較

  • cargo-licensecargo-denylist機能
    どちらもライセンスの一覧を表示する機能がありますが、ライセンス条項は含まれていません。

  • cargo-about
    ライセンス条項の一覧をHTMLで出力します。

今回はJSONでライセンス条項をまとめたかったため、このツールが適していました。

まとめ

cargo-bundle-licenses を使用すると、Rustプロジェクトの依存クレートのライセンス条項をまとめることができます。TOML、JSON、YAMLのフォーマットで出力できます。

Q. MIT ライセンスの特徴として正しくないものはどれでしょう?

Q. AGPL(Affero General Public License)が通常のGPLと異なる主な点は何でしょう?