LicensePlist を Build Tool Plugin で利用する方法(Xcode 26)
どうも。Reoです。
今回は LicensePlist を Build Tool Plugin を使って利用する方法について紹介します。
LicensePlist に関しては何年も前から利用していますが、Swift Package Manager から導入するようになり、従来の導入方法と大きく変わったと感じたので記事として残しておきます。
環境
- Xcode 26.0.1
- LicensePlist 3.27.2
- ターゲットは iOS
導入方法
mono0926/LicensePlistの README を参考に導入しましょう。
- Swift Package Managerで導入する
license_plist.ymlを用意する- Build Tool Pluginを設定する
Settings.bundleを用意する- ライセンスファイルを
Settings.bundleにコピーする
この手順で導入していきます。
Swift Package Manager で導入する
Xcode を開き、 Swift Package Manager で導入します。
PROJECT > Package DEpendencies より + を選択。
https://github.com/mono0926/LicensePlist を検索します。
バージョンが最新であることも確認しましょう。(2026年1月時点で3.27.2 が最新)
Dependency Rule は Up to Next Minor Version を選択。LicensePlist は特に Xcode バージョンの影響を受けやすく感じたので、LicensePlist のマイナーバージョンが自動で更新されてしまうと問題が発生する場合もあると思ったので、こちらを選びました。
Add Package より導入。Target はどちらも None で ok 。
license_plist.yml を用意する
設定ファイルとして license_plist.yml を用意します。
このファイルはXcode上ではなく、プロジェクトのルートに作成します。
Finder 上で .xcodeproj がある場所と同じ場所に配置します。
お好きなエディタで license_plist.yml の中身を書きましょう。
options:
xcodeprojPath: "*.xcodeproj"
xcworkspacePath: "*.xcworkspace"
prefix: Acknowledgements
xcworkspacePath / xcodeprojPath/ packagePaths のいずれかは必須です。.xcworkspace がない場合にはxcodeprojPath だけで okです。
prefix はファイル名の設定で、デフォルト値が com.mono0926.LicensePlist となっています。
Build Tool Pluginを利用する場合には、outputPath と packageSourcesPath は利用できません。
その他にも利用できないオプションをいくつか見つけたので、それは後述します。
Build Tool Plugin を設定
プロジェクト > TARGET > Build Phases > Run Build Tool Plug-ins を開きます。
+ ボタンより追加していきます。
LicensePlistBuildTool を選択して、Add を選択します。
Settings.bundle を用意する
続いて、Settings.bundle を用意しましょう。Settings.bundle がないと、設定アプリ内に情報を表示することができません。
File > New > File from Template... を選択
Settings.bundle を探して Nextを選択。
名前はそのまま Settings.bundle でokです。自分はいつも Resources フォルダに配置しています。任意の場所でokです。
Settings.bundle の Root を編集する
Settings.bundle 内の Root.plist を編集します。
作成した時点で次のようにサンプルが入っていますが、これらは全部不要です。消しちゃいましょう。
LicensePlistを使ううえで必要なのは次の項目です。
- Type:
Child Pane - Title: 設定アプリで表示されるタイトル
- Filename:
license_plist.ymlで設定したprefix
[!info] Child Pane がない?
アイテムを追加する時の選択肢に
Child Paneはないです。 適当なTypeで作成した後に、Child Pane と書き換えると認識されます。(もしくはPSChildPaneSpecifierと書く)
コードでは次のようになっていればokです。Xcode 上ではQuick Look でコードを確認できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
<key>Title</key>
<string>Licenses</string>
<key>File</key>
<string>Acknowledgements</string>
</dict>
</array>
</dict>
</plist>
Settings.bundle が用意できたら一度ビルドしてみましょう。
ビルドした後に、設定アプリ > アプリ > 自分のアプリ を開きます。
先ほど設定したタイトル Licenses の行ができていればokです。ライセンスの中身は現在空になっています。
ログを見てみよう
先ほど Run Build Tool Plug-ins に追加したことで、ビルドした時に LicensePlist は実行されるようになっています。
ログを確認してみましょう。左側のパネルの1番右側のメニューよりログを見ることができます。
差分がない時は実行されないのでログは次のように Completed because no diff で終了しています。
[2026-01-17T00:03:36.355+09:00] [INFO] Start
[2026-01-17T00:03:36.357+09:00] [WARNING] not found: Pods/Target%20Support%20Files -- file:///
[2026-01-17T00:03:36.357+09:00] [WARNING] not found: Pods/_Prebuild/Target%20Support%20Files -- file:///
[2026-01-17T00:03:36.357+09:00] [INFO] Pods License parse start
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: Pods/Manifest.lock -- file:///.
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: Cartfile.resolved -- file:///.
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: Cartfile -- file:///.
[2026-01-17T00:03:36.357+09:00] [INFO] Carthage License collect start
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: Mintfile -- file:///.
[2026-01-17T00:03:36.357+09:00] [INFO] Mint License collect start
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: nestfile.yaml -- file:///.
[2026-01-17T00:03:36.357+09:00] [INFO] nest License collect start
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: Package.resolved -- file:///.
[2026-01-17T00:03:36.357+09:00] [WARNING] Not found: Package.swift -- file:///.
[2026-01-17T00:03:36.359+09:00] [INFO] Swift Package Manager License collect start
[2026-01-17T00:03:36.361+09:00] [INFO] Manual License start
[2026-01-17T00:03:36.361+09:00] [WARNING] Completed because no diff. You can execute force by `--force` flag.
license_plist.yml に force: true を追加して実行してみると次のようになっています。
[2026-01-17T00:17:19.370+09:00] [INFO] Start
...
[2026-01-17T00:17:19.374+09:00] [INFO] Swift Package Manager License collect start
[2026-01-17T00:17:19.376+09:00] [INFO] Manual License start
[2026-01-17T00:17:19.376+09:00] [INFO] license reading from disk start(owner: ishkawa, name: APIKit)
[2026-01-17T00:17:19.377+09:00] [INFO] license reading from disk start(owner: Kitura, name: HeliumLogger)
[2026-01-17T00:17:19.377+09:00] [INFO] license reading from disk start(owner: mono0926, name: LicensePlist)
[2026-01-17T00:17:19.378+09:00] [INFO] license reading from disk start(owner: Kitura, name: LoggerAPI)
[2026-01-17T00:17:19.378+09:00] [INFO] license reading from disk start(owner: apple, name: swift-argument-parser)
[2026-01-17T00:17:19.378+09:00] [INFO] license reading from disk start(owner: Kitura, name: swift-html-entities)
[2026-01-17T00:17:19.378+09:00] [INFO] license reading from disk start(owner: apple, name: swift-log)
[2026-01-17T00:17:19.379+09:00] [INFO] license reading from disk start(owner: SimplyDanny, name: SwiftLintPlugins)
[2026-01-17T00:17:19.379+09:00] [INFO] license reading from disk start(owner: tomlokhorst, name: XcodeEdit)
[2026-01-17T00:17:19.379+09:00] [INFO] license reading from disk start(owner: jpsim, name: Yams)
[2026-01-17T00:17:19.380+09:00] [INFO] Deleted exiting plist within Acknowledgements
[2026-01-17T00:17:19.380+09:00] [INFO] Directory created: file:///Users/user/Library/Developer/Xcode/DerivedData/Robin2-hftslipxorpowbgvawisxpslagml/Build/Intermediates.noindex/BuildToolPluginIntermediates/Robin2.output/Robin2/LicensePlistBuildTool/com.mono0926.LicensePlist.Output
[2026-01-17T00:17:19.384+09:00] [INFO] End
[2026-01-17T00:17:19.384+09:00] [INFO] ----------Result-----------
[2026-01-17T00:17:19.384+09:00] [INFO] # Missing license:
[2026-01-17T00:17:19.384+09:00] [INFO] None 🎉
各ライブラリが読まれて、エラーなく結果は None 🎉 で終了していることが確認できます。
では何故、設定アプリ上で表示されないんでしょう?
ライセンスファイルを Settings.bundle にコピーする
先ほどの LicensePlistBuildTool が実行された後に、生成されたライセンスファイルを Settings.bundle にコピーする必要があります。
プロジェクト > TARGET > Build Phases に Run Script を追加することになりますが、これはLicensePlist に Command Plugin が用意されているので、それを利用します。
プロジェクトを右クリックし、AddAcknowledgementsCopyScriptCommand を選択します。
プロジェクトではなくターゲットの方を選択して Run を選択します。(このときプロジェクトを選択すると、それぞれのターゲット全てにコピースクリプトが追加されることになります。テストなど不要なターゲットには追加しないようにしましょう。)
Allow Command to Change Files を選択します。
プロジェクト > TARGET > Build Phases に Copy Acknowledgements が追加されていることを確認します。
スクリプトの内容は次の通りです。
echo "Will copy acknowledgements"
ACKNOWLEDGEMENTS_DIR=${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/com.mono0926.LicensePlist.Output
DESTINATION_PATH=${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/
cp -r "${ACKNOWLEDGEMENTS_DIR}"/* "${DESTINATION_PATH}"
rm -rf "${ACKNOWLEDGEMENTS_DIR}"
AddAcknowledgementsCopyScriptCommand を使わずに Build Phases に直接追加しても ok です。
このスクリプトにより、LicensePlistBuildTool で収集・生成されたライセンスファイルが Settings.bundle にコピーされます。
App Sandbox をオフにする
先ほどのスクリプトを追加してビルドしようとすると、エラーが出ます。
AcknowledgementsCommand doesn’t copy into Settings.bundle #222の問題により、現在はSandboxをオフにした状態ではエラーが出てしまいます。
この対策として TARGETS > Build Settings > Build Options > User Script Sandboxing をオフにする必要があります。
プロジェクト側もSandboxing オフにしないと Archive 時などにエラーが出るのかは後で確認しておきます。
確認してみよう
Sandboxing をオフにして再度ビルドしてみます。
ビルド完了後、設定アプリを開き、アプリ > 自分のアプリを開きます。 Licenses の中にライセンス一覧が表示されていることが確認できます。
これで無事に LicensePlistの導入が完了しました。
Build Tool Plugin での注意点
Build Tool Pluginではそれ以外の方法と違い多くの制約があります。 Swift Package プラグインの全体像#プラグインの制限がとても参考になります。
まず、外部へのアクセスが難しいです。
Mintで導入したCLIツール(SwiftLintなど)はアプリ自体に同梱されるわけではありません。多くの場合ツールの本体はローカルにあり、これは Build Tool Plugin からはアクセスすることができません。
私の調査では、Build Tool Pluginを使う場合はMintを使ったツールのライセンスファイルは生成できないという結論になりました。(調査はLicensePlistでSwiftPMのライブラリのライセンス情報が書き出せない(2026年1月)にて行なっています。)
また同様にネットワークアクセスもできません。
ネットワークアクセスができないということは、GitHubリポジトリからのライセンスファイル取得なども利用できません。(なのでgitHubToken の設定も恐らく意味がない)
自分の調査では、次のオプションが利用できないことを確認しています。
| CLI option | 役割 | 利用可否 |
|---|---|---|
--output-path |
出力ディレクトリ指定 | × |
--cartfile-path |
Carthage の Cartfile 指定 | ? |
--mintfile-path |
Mintfile 指定 | × |
--nestfile-path |
Nestfile 指定 | ? |
--pods-path |
CocoaPods の Pods ディレクトリ指定 | ○(怪しい) |
--package-paths |
SwiftPM の Package.swift 指定 | ○ |
--package-sources-path |
SwiftPM の SourcePackages 指定 | × |
--xcodeproj-path |
.xcodeproj 指定 |
○ |
--xcworkspace-path |
.xcworkspace 指定 |
○ |
--prefix |
plist の Bundle Identifier prefix | ○ |
--github-token |
GitHub API 用トークン | × |
--html-path |
HTML 形式での出力 | ? |
--markdown-path |
Markdown 形式での出力 | ? |
--license-file-names |
検索対象ライセンスファイル名 | ? |
--force |
既存出力の上書き | ○ |
--add-version-numbers |
ライブラリのバージョン表示 | ○ |
--suppress-opening-directory |
Finder を自動で開かない | × |
--single-page |
単一 plist にまとめる | ○ |
--fail-if-missing-license |
ライセンス欠落時に失敗 | ? |
--add-sources |
ソース URL を表示 | ? |
--sandbox-mode |
サンドボックス実行 | × |
--pods-path は指定しても無視されているっぽいのですが、適当な文字列を入れるとエラーが出るので一応利用できているのかな?と思います。
--output-path など Build Tool Pluginでは利用できませんが、Command Pluginでは利用できるオプションもあります。
制約があるとはいえ、最近はほとんどのライブラリをSwiftPMにて管理している人が多いと思うので、特に問題なく使えるケースのが多いと思います。
以前の自分の利用方法とのちがい
以前は Mint を使って LicensePlistの導入をしていました。この時の方法は、「iOSアプリのライセンス生成ツール「LicensePlist」のセットアップ&操作方法」の記事とほぼ同様の方法で利用していました。(記事の方法との違いは mint 実行を Build Phases に追加していたこと)
その時の方法では、生成したライセンスファイルをプロジェクト内の Settings.bundle に配置していました。プロジェクトツリーは次のような感じでファイルが入っています。
プロジェクト内に配置するので、もちろん Git上での差分も表示されます。(git管理するのかどうか論争も恐らくあったと思いますが、自分はgitに含めていました。)
この時の方法では outputPath というオプションを使い Settings.bundle 内にすることでプロジェクト内に配置することができました。このオプションは Build Tool Plugin では無効となります。
Build Tool Pluginを用いた方法は、ビルド時に直接、ビルド成果物の Settings.bundle にコピーする形となります。そのため、Gitでの差分や直接ライセンスファイルの確認はできません。
一応昔からその方法もできたらしく、実は正統派はそっちだったのかも?って気もしましたが、自分から見るとこの部分が大きく変わったなと感じました。
もし以前の自分と同様な方法を使っていて移行する場合には、プロジェクトから Settings.bundle 内のライセンスファイルは消してしまってokです。むしろ既存のプロジェクト側のSettings.bundleの中身とマージされてしまうので、不要なライセンスファイルが残る原因となってしまうので消しておいた方が良いでしょう。
Command Plugin を使ってみよう
LicensePlist にはもうひとつプラグイン機能が用意されています。
GenerateAcknowledgementsCommand という Command Plugin です。先ほどの AddAcknowledgementsCopyScriptCommand と同様にXcode上で手動で動かせます。
これを使うと、以前のようにプロジェクトの Settings.bundle にファイルを含める形で利用することができます。
license_plist.yml はそのままで実行してみましょう。プロジェクトを選択してRun。
実行後はプロジェクトのルートフォルダに com.mono0926.LicensePlist.Output というフォルダができています。中身はこんな感じ。
license_plist.yml の outputPath に prefix で指定したファイル名でライセンスファイル群が生成されています。今回はlicense_plist.yml内で outputPathの指定をしなかったのでルートに配置されました。
license_plist.yml を次のように書き換えます。
options:
outputPath: "./Robin2/Resources/Settings.bundle"
xcodeprojPath: "*.xcodeproj"
xcworkspacePath: "*.xcworkspace"
prefix: Acknowledgements
force: true
再度 GenerateAcknowledgementsCommand を実行すると、プロジェクトツリーのSettings.bundle内にライセンスファイルが生成されています。
この場合は Run Build Tool Plug-ins には LicensePlistBuildTool は含めません。また Copy Acknowledgements のスクリプトも削除しておきましょう。
この状態でビルドして、設定アプリよりライセンスを確認しましょう。
ライセンス一覧が正しく確認できるはず…あれ?できていないですね?
GenerateAcknowledgementsCommand は3.27.2 時点ではバグあり
先ほどの方法でライセンス一覧が正しく表示されるはずですが、設定アプリから見ると空っぽになっていました。
現在 3.27.2 では GenerateAcknowledgementsCommand にはバグがあり、ライセンスファイル生成時に失敗してしまいます。ちなみに Xcode 16.2 以前までは生成できていました。
プラグインの実行ログを見てみましょう。失敗していることがわかります。
Showing All Messages
[2026-01-18T23:07:00.702+09:00] [INFO] ----------Result-----------
[2026-01-18T23:07:00.702+09:00] [INFO] # Missing license:
[2026-01-18T23:07:00.702+09:00] [WARNING] APIKit
[2026-01-18T23:07:00.702+09:00] [WARNING] HeliumLogger
[2026-01-18T23:07:00.702+09:00] [WARNING] LicensePlist
[2026-01-18T23:07:00.702+09:00] [WARNING] LoggerAPI
[2026-01-18T23:07:00.702+09:00] [WARNING] SwiftLintPlugins
[2026-01-18T23:07:00.702+09:00] [WARNING] XcodeEdit
[2026-01-18T23:07:00.702+09:00] [WARNING] Yams
[2026-01-18T23:07:00.702+09:00] [WARNING] swift-argument-parser
[2026-01-18T23:07:00.702+09:00] [WARNING] swift-html-entities
[2026-01-18T23:07:00.702+09:00] [WARNING] swift-log
失敗をしているのはSwift Packageのライブラリです。今回のプロジェクトでは使っていませんが、CocoaPodsのライブラリはこの方法でも正しく生成されます。
この件については、Issue「GenerateAcknowledgementsCommand does not generate Swift Package licenses on Xcode 26 #251 」を立ててきたので今後のバージョンで直ることを期待しましょう。
自分でIssueを立てたのでできれば直しに行きたいお気持ちもあるんですが、自分の環境だけだったりしない?とかビビって今のところは他力本願です。すみません。
この方法のメリット/デメリット
GenerateAcknowledgementsCommand を使って手動で実行する方法は、従来の方法に近いと感じます。
自分がこの方法のメリットだと思う点を挙げてみます。
- ビルド時に処理が走らないので軽くなる
- Gitで差分が確認できる
- リリース時にちゃんと
Settings.bundleに生成されるかなどの不安がない - LicensePlistの不具合に気づきやすい
- Sandbox 制約を受けにくい(はず)
- Xcode のバージョン更新時に古いライセンスファイルを残しておける
個人的に一番のメリットは、LicensePlistの不具合に気づきやすいことと差分確認ができることかな、と思います。
Build Tool Pluginのように自動で実行され、差分は直接確認しないとわからないとなると、うまく動作していなくても気づかないことの方が多そうです。実際自分も従来の方法で差分があったからこそ不具合に気づいたので…
デメリットは手動実行をそもそも忘れてしまうこと。なので Xcodeから実行ではなく自動化しておくのが一番な気もします。そうなるとわざわざCommand Pluginじゃなくていいじゃん説となります。
またCommand PluginもBuild Tool Pluginと同様にネットワークアクセスができないので、GitHubから直接ライセンス情報を引っ張ってくる方法は利用できません。あと Mintfile もBuild Tool Plugin同様に利用できないことを確認しています。なのでこれもプラグイン機能じゃなくていいじゃん〜となってしまいます。
そんなこんなで、わざわざ GenerateAcknowledgementsCommand を使う必要はそこまでないのかなとは思われます。
でもLicensePlist自体がXcodeバージョンによってうまく動作しないことがあるので、Xcodeのアップデートで今回のようなバグが発生すると、LicensePlistが新しいXcodeバージョンに対応されるまでライセンスファイルが空になってしまい、リリースに影響を受けてしまいそうです。
個人的には小規模プロジェクトなら手動実行で十分だし、ライブラリ更新頻度も低いし差分見れる方がありがたいなは思うので、バグが直ったらどっちの方法にするかはちょっと迷います。
うまく使えない時
今後この記事も古くなっていきますので、今回の方法で使えない場合もあるかと思います。
LicensePlistはXcodeのバージョンにより影響を受けることが多いです。
Xcodeのバージョンを上げたときは、LicensePlist が正しく使えるかどうかを確認、使えない場合はLicensePlistに新しいバージョンが出ていないかを確認してみましょう。
バージョンを上げてみても動作が不安定な場合はビルドログをチェックしたり、イシューをチェックしてみましょう。ライブラリのパス周りがXcodeバージョンに依存する形の設計になっていると感じたので特にパスがあっているかなどを見ると良いでしょう。
調査方法については私のメモなども参考にしてみてください。(Build Tool PluginとCommand Pluginの違いを知らない状態から始まっているので結構ひどいですが…)
LicensePlistでSwiftPMのライブラリのライセンス情報が書き出せない(2026年1月)
エラー集
今回の記事を書いている時に発生したエラー集をまとめておきます。
license_plist.yml が見つからない
license_plist.yml を用意せずに Build Tool Plugin に登録してビルドをすると、次のようなエラーが出ます。
Can't find 'license_plist.yml' file
プロジェクトルートに license_plist.yml を追加することで解決します。
Sandbox のエラー
AcknowledgementsCommand doesn’t copy into Settings.bundle #222の問題です。
Sandbox: bash(28019) deny(1) file-read-data /Users/user/Library/Developer/Xcode/DerivedData/Robin2-hftslipxorpowbgvawisxpslagml/Build/Products/Debug-iphoneos/Robin2.app/com.mono0926.LicensePlist.Output
Sandbox: rm(28021) deny(1) file-read-data /Users/user/Library/Developer/Xcode/DerivedData/Robin2-hftslipxorpowbgvawisxpslagml/Build/Products/Debug-iphoneos/Robin2.app/com.mono0926.LicensePlist.Output
TARGETS > Build Settings > Build Options > User Script Sandboxing をオフにすることで解決することができます。
代替
最後になりますが、ライセンスリストを生成する新しいライブラリを見つけたので紹介します。LicenseListというライブラリです。
こちらは設定アプリではなく、アプリ内にライセンス情報を表示することができます。 また、Swift Package限定となります。
LicensePlistがうまく使えなかったり、アプリ内に表示したい場合はこちらを使うと良いでしょう。
おわりに
今回の記事は「LicensePlistでSwiftPMのライブラリのライセンス情報が書き出せない(2026年1月)」という問題から始まりました。
何年も前からずっとお世話になっていたLicensePlistですが、Build Tool Pluginに移行してからはうまく使えていなかったことが判明しました。私の失敗は、Build Tool Plugin と Command Plugin の違いを理解していなかったことです。
今回バグの調査をしているうちに何も理解してないで使っていることが判明してしまったので、改めて記事を書いてまとめてみることにしました。思ったより長くなっちゃいましたね。
それではでは〜