LicensePlistでSwiftPMのライブラリのライセンス情報が書き出せない(2026年1月)
背景
久しぶりにLicensePlistを使ってライセンス情報を更新すると、SwiftPMで導入したライブラリのライセンス情報が失われた。
環境
- Xcode 26.0.1
- LicensePlist 3.25.1
LicensePlist 本体は SwiftPMにより導入している。
現在の使い方
Build Tool Plug-ins として登録。
license_plist.yml をプロジェクトのルートに配置
options:
outputPath: "./MyProject/Resources/Settings.bundle"
mintfilePath: Mintfile
podsPath: Pods
packagePaths:
- Package.swift
packageSourcesPath: "./SourcePackages"
xcodeprojPath: "*.xcodeproj"
xcworkspacePath: "*.xcworkspace"
prefix: xxx.xxxxx.MyProject
force: true
suppressOpeningDirectory: true
GenerateAcknowledgementsCommand を手動で実行。
現在起きている問題
恐らく古い書き方をしちゃっているせいでSwiftPMで管理しているライブラリのライセンス情報が生成されない。
README を確認
mono0926/LicensePlistの README を確認してみよう。
Integrate into build - build tool pluginセクションを確認。このセクションは2023年3月ごろに更新されている。
Important: to process Swift Package licenses, the config must include one of the following parameters:
xcworkspacePath,xcodeprojPath,packagePaths.Note:
outputPathandpackageSourcesPathconfig parameters are ignored by the build tool plugin.
Swift Packageのライセンスを処理するには、設定に以下のいずれかのパラメータを含める必要があると書かれている。
これらは license_plist.yml にすでに書かれている。
outputPathとpackageSourcesPathの設定パラメータは、ビルドツールプラグインによって無視されるとのこと。まずはこれを直してみる。
outputPath を直してみる
licence_plist.yml から outputPath を消す。
AddAcknowledgementsCopyScriptCommand を実行。
TARGET > BuildPhases に次のように追加される。
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}"
DESTINATION_PATH を licence_plist.yml に指定していた outputPath に置き換える。
自分たちの環境では次のようにしてみた。
echo "Will copy acknowledgements"
ACKNOWLEDGEMENTS_DIR=${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/com.mono0926.LicensePlist.Output
DESTINATION_PATH=${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Resources/Settings.bundle/
cp -r "${ACKNOWLEDGEMENTS_DIR}"/* "${DESTINATION_PATH}"
rm -rf "${ACKNOWLEDGEMENTS_DIR}"
GenerateAcknowledgementsCommand を実行してみても、うまくいっていない? rm -rf "${ACKNOWLEDGEMENTS_DIR}" が実行されていない。
勘違いしていた。まず Build Phase だから com.mono0926.LicensePlist.Output のフォルダが削除されるのは GenerateAcknowledgementsCommand をしたときではなく ビルドした時か。
そして ${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/com.mono0926.LicensePlist.Output が示すのは /Users/user/Library/Developer/Xcode/DerivedData/MyProject-wje/Build/Products/Debuug-iphoneos/MyProject.app/com.mono0926.LicensePlist.Output という場所である。
プロジェクトルートに生成された com.mono0926.LicensePlist.Output は何??
license_plist.yml の outputPath は使われている
さて。license_plist.yml の outputPath を先ほど削除したので、outputPath がデフォルトの設定でプロジェクトルートになっていると推測した。
改めて license_plist.yml に outputPath を追加してみる。一度適当な場所を選択して、このオプションが有効かどうかを確認する。
options:
outputPath: "./Hoge/"
GenerateAcknowledgementsCommand を実行。すると Hoge フォルダが作成されて、その中に .latest_result.txt と .plist と xxx.xxxxx.MyProject のフォルダができている。
ちゃんと実行されているじゃん!
ということで、 outputPathの設定は戻した。プロジェクト内の settings.bundle 内を指定しているので、先ほどの copy acknowledgements の処理も丸っと削除した。
実行ログを読む
左側のパネルより実行ログを確認してみる。 Workspace > Plug-in をクリックするとログが表示される。
LicensePlist の GenerateAcknowledgementsCommand 実行ログ(2025年1月15日) (全文はプライベート)
気になるログを抜粋する。
まず、Package.resolved と Package.swift が見つかっていないため、license_plist.yml の packagePaths が間違えていそうだ。
[2026-01-15T17:19:48.696+09:00] [WARNING] Not found: Package.resolved -- file:///Users/hogehoge/MyProject/.
[2026-01-15T17:19:48.696+09:00] [WARNING] Not found: Package.swift -- file:///Users/hogehoge/MyProject/.
続いてこのログ。先ほどの ${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/com.mono0926.LicensePlist.Output の中にlatest_result.txt ないと言われている。
[2026-01-15T17:19:48.698+09:00] [WARNING] Not found: com.mono0926.LicensePlist.Output/xxx.xxxxxx.MyProject.latest_result.txt -- file:///Users/hogehoge/MyProject/.
処理の一番最後に作成はしているが…実行する前にはないってこと?
[2026-01-15T17:19:48.701+09:00] [INFO] Directory created: com.mono0926.LicensePlist.Output -- file:///Users/hogehoge/MyProject/
2回実行されているっぽいのも気になる。
とりあえず終了時に Missing license リストを見ると Swift Package のライブラリ群とmintで導入しているライブラリが取得できていないことがわかる。
[2026-01-15T17:19:48.703+09:00] [INFO] End
[2026-01-15T17:19:48.703+09:00] [INFO] ----------Result-----------
[2026-01-15T17:19:48.703+09:00] [INFO] # Missing license:
[2026-01-15T17:19:48.703+09:00] [WARNING] LicensePlist
[2026-01-15T17:19:48.703+09:00] [WARNING] SwiftLint
[2026-01-15T17:19:48.703+09:00] [WARNING] firebase-ios-sdk
ok とりあえず license_plist.yml のパスをいじってみよう。
license_plist.yml のパスを変えてみる
うまくいっていないのは、Mintfile と Swift Package。
改めて、うまくいっていないlicense_plist.yml を見てみる。
options:
outputPath: "./MyProject/Resources/Settings.bundle"
mintfilePath: Mintfile
podsPath: Pods
packagePaths:
- Package.swift
packageSourcesPath: "./SourcePackages"
xcodeprojPath: "*.xcodeproj"
xcworkspacePath: "*.xcworkspace"
prefix: xxx.xxxxx.MyProject
force: true
suppressOpeningDirectory: true
Mintfile をどうにかしたい
outputPath は動作していることがわかったので、プロジェクトルートに置いてある Mintfile を次のように書き換えてみる。
options:
mintfilePath: "./Mintfile"
GenerateAcknowledgementsCommand を実行。
mitfilePath: "./" だと次のエラーが出ていた。
LicensePlistCore/LicensePlist.swift:79: Fatal error: Invalid MintFile name: MyProject
mitfilePath: "./Mintfile" だと実行できたが、次のエラーが出る。
[2026-01-15T23:43:33.035+09:00] [ERROR] Error Domain=NSCocoaErrorDomain Code=260 "The file “SwiftLint” couldn’t be opened because there is no such file." UserInfo={NSURL=file:///Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmpuzohamytunr/Build/Intermediates.noindex/checkouts/SwiftLint, NSFilePath=/Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmpuzohamytunr/Build/Intermediates.noindex/checkouts/SwiftLint, NSUnderlyingError=0x7490150b0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
これは mintfilePath: Mintfile と書いた時と同様のエラーである。
ふむ…そもそもCLIツールとしてmintを使ってSwiftLint を使っていてアプリ内に同梱されるわけではないからライセンス表記もなくても問題ないのかな?
とはいえ以前はこのやり方でもライセンス情報に含まれていた気がする。Build Tool Plug-in 以前かも?
githubToken が足りていないのが原因かと思ったが、追加してみても変わらず。
mintfilePath で指定した場所に Mintfile 自体がないと言われているわけではなく、その後 Mintfile で取得したライブラリ情報が DerivedData 以下にないことが問題なのよね。
現状はもしかして Build Tool Plug-in では Mint のファイルを取得できないんじゃなかろうか。今 mint自体を使っている人って多くないのかもな…
Swift Package をどうにかしたい
次のイシューを見てみた。
サンドボックス化を無効にしないとダメなのかもしれない。
先ほどのイシューに書いてあった次の記事を読んで見る。
How to use LicensePlist with Swift Packages
そもそも既にサンドボックス化は無効にしてある。
一旦どシンプルにこれだけにしてみるか。
options:
xcodeprojPath: "*.xcodeproj"
prefix: Acknowledgements
singlePage: true
一旦ここまでだけで実行。設定アプリでみて Acknowledements は空。
ほいで Settings.bundle の場所も示してみる。
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}"
これを Run Script に書いて実行すると、Pods のライブラリだけが表示された。何も変わっていない。
Swift Package に関しては次が問題になっている。
[2026-01-15T17:19:48.699+09:00] [ERROR] Error Domain=NSCocoaErrorDomain Code=260 "The file “abseil-cpp-binary” couldn’t be opened because there is no such file." UserInfo={NSURL=file:///Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmytunr/Build/Intermediates.noindex/checkouts/abseil-cpp-binary, NSFilePath=/Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkmytunr/Build/Intermediates.noindex/checkouts/abseil-cpp-binary, NSUnderlyingError=0xbe90155c0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
実際にUsers/user/Library/Developer/Xcode/DerivedData をのぞいてみたところ
Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmytunr/Build/Intermediates.noindex/checkouts の
checkouts というフォルダは存在していない。
XcodeBuildToolPlugin not working in Xcode 16.3 RC #240を読む感じ、やっぱり Xcode ごとに差があるっぽい。
該当の箇所はここか?PlistInfo.swift#L53
結構前からそうみたいだけど… checkouts ができない方がおかしいのか?
Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmytunr/SourcePackages/checkouts の方からとってきてくれればいい。
とはいえ README.md には次のように packageSourcesPath は無視されると書いてある。
Note:
outputPathandpackageSourcesPathconfig parameters are ignored by the build tool plugin.
う〜〜〜〜ん
代替
LicenseListというものがあるらしい。比較的新しい。
これは Swift Packageライブラリ群のライセンスを生成する。
全部を SwiftPMにまとめられたら、LicenseList でいいかもしれないが、LicenseList はアプリ内配置を基本としたもので、LicensePlistは settings.bundle に含める前提のもので、少し構成も違う。
また、広告メディエーションの関係でCocoaPodsは外せないので微妙。
もう少し頑張る
LicensePlistBuildTool.swiftのコードを見る感じ、 SourcePackages の方から取ってきてくれそうじゃない?
やっぱりさっきのXcodeBuildToolPlugin not working in Xcode 16.3 RC #240が関係あるみたい。
よくよくみてみると、自分がさっきから実行しているのはGenerateAcknowledgementsCommand.swiftの方だ。
では LicensePlistBuildTool.swift の方はどうやって実行する?これはビルドした時に毎回実行されている。
そもそもじゃあ手動でやるコマンドいらないじゃん?って気もするが、故に誰も使っていないのだろう。
LicensePlist のビルドツール実行ログ(2026年1月16日)
ログを見る。
まずここは変わっていない。
[2026-01-16T02:08:37.983+09:00] [WARNING] Not found: Package.resolved -- file:///Users/user/MyProject/.
[2026-01-16T02:08:37.983+09:00] [WARNING] Not found: Package.swift -- file:///Users/user/MyProject
続いて途中。
[2026-01-16T02:08:37.993+09:00] [INFO] license reading from disk start(owner: google, name: abseil-cpp-binary)
[2026-01-16T02:08:37.993+09:00] [INFO] license reading from disk start(owner: ishkawa, name: APIKit)
[2026-01-16T02:08:37.993+09:00] [INFO] license reading from disk start(owner: google, name: app-check)
[2026-01-16T02:08:37.994+09:00] [INFO] license reading from disk start(owner: firebase, name: firebase-ios-sdk)
GenerateAcknowledgementsCommand と違って、Swift Packageライブラリ群はエラーになっていない。
最終的に Mintfile でいれている SwiftLintのみが Missing として表示された。
[2026-01-16T02:08:38.012+09:00] [INFO] End
[2026-01-16T02:08:38.012+09:00] [INFO] ----------Result-----------
[2026-01-16T02:08:38.012+09:00] [INFO] # Missing license:
[2026-01-16T02:08:38.012+09:00] [WARNING] SwiftLint
だがしかし、今度は Pods が含まれていない。 コレは気のせいだった
[2026-01-16T02:08:38.002+09:00] [INFO] Deleted exiting plist within xxx.xxxxx.MyProject
[2026-01-16T02:08:38.002+09:00] [INFO] Directory created: file:///Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkhamytunr/Build/Intermediates.noindex/BuildToolPluginIntermediates/MyProject.output/MyProject/LicensePlistBuildTool/com.mono0926.LicensePlist.Output
ふむふむ。ok わかってきたよ。
これらをうまいことマージすればいいんだわさ。
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/
echo "ACKNOWLEDGEMENTS_DIR $ACKNOWLEDGEMENTS_DIR"
echo "DESTINATION_PATH $DESTINATION_PATH"
cp -r "${ACKNOWLEDGEMENTS_DIR}"/* "${DESTINATION_PATH}"
rm -rf "${ACKNOWLEDGEMENTS_DIR}"
おけおけ。DESTINATION_PATH すらもいじる必要はないのね。
この時点で 設定アプリからみてみると、CocoaPods のライブラリ群と Swift Package のライブラリ群の両方がリストに乗っていることが確認できた。
Firebase はSwift Packageで、Google-Mible-Ads-SDKは CocoaPodsで入れたライブラリになる。
ということで、ここまででわかったことは
- ビルドをした時に LicensePlist の BuildToolPlugin 本体で Swift Package のライセンスを収集する
Build PhasesのRun Build Tool Plug-insの箇所- これは収集しただけの状態
file:///Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkhamytunr/Build/Intermediates.noindex/BuildToolPluginIntermediates/MyProject.output/MyProject/LicensePlistBuildTool/com.mono0926.LicensePlist.Outputに置かれている。
- 次に
Build PhasesのCopy Acknowledgementsで先ほど収集したライセンス情報をSettings.bundleに配置するGenerateAcknowledgementsCommandを実行するとBuild Phasesにスクリプトを追加できる。- このスクリプトは一切いじる必要はない
Settings.bundleにcpでコピーしない限り、設定アプリでは表示されない。
- これらは既にプロジェクト内に配置している
Settings.bundleの中身とマージされる この BuildToolPlugin 本体の実行では、Swift Package のライブラリが対象で CocoaPodsのライブラリは含まれない。コレは勘違いGenerateAcknowledgementsCommandではCocoaPodsのライブラリを対象に実行できる。- Swift Packageのライブラリ群はエラーになる(対象外なわけではない)
license_plist.ymlのoutputPathの影響を受ける
何を言っているんだRun Build Tool Plugin-ins の順番は変えられないので、ビルド時にCocoaPodsのライブラリを含むのは難しそうだ。
ちなみに LicensePlist の 3.27.2 では Swift Package のライブラリが正しく出力されたが、 3.25.1 ではダメだった。消えていった。
3.27.1 で先ほどのXcodeBuildToolPlugin not working in Xcode 16.3 RC #240の問題が解決されているため、それ以前ではうまく動作しない。
CocoaPodsのライブラリのライセンスの中身がない
さて続いて問題が発生。
GenerateAcknowledgementsCommand を使った CocoaPodsのライブラリ群のライセンスの中身が空である。
GenerateAcknowledgementsCommand では license_plist.yml の outputPath が有効なので、生成物を見てみる。
全部が全部空なわけではないね。
ログを見てみる。
[2026-01-16T03:03:33.909+09:00] [INFO] Pod acknowledgements found: Pods-MyProject-acknowledgements.plist
これは次の場所にある。
Pods/Target Support Files/Pods-MyProject/Pods-MyProject-acknowledgements.plist
で、この中身を見てみると、この時点で中身がない。
Google-Mobile-Ads-SDK.podspec.jsonの以下の部分が表示されているっぽい。
"license": {
"text": "Copyright 2025 Google LLC",
"type": "Copyright"
},
この部分が textではなく file になっている場合は全文が正しく表示されている。
"license": {
"type": "MIT",
"file": "SDK/LICENSE"
},
この件はLicensePlist側ではなくCocoaPods側の仕様で、わりと仕方がない。
手動で追加
最後に Mintfile だけうまくいっていない問題。
大変なのでもう手動で入れる。
license_plist.yml に追加。
github:
- owner: realm
name: SwiftLint
version: 0.63.0
GenerateAcknowledgementsCommandを実行してみる。
差分なし。実行ログは失敗している。
Showing All Messages
[2026-01-16T03:58:24.444+09:00] [WARNING] SwiftLint was loaded from config YAML.
[2026-01-16T03:58:24.444+09:00] [INFO] Manual License start
[2026-01-16T03:58:24.444+09:00] [INFO] license reading from disk start(owner: realm, name: SwiftLint)
[2026-01-16T03:58:24.445+09:00] [ERROR] Error Domain=NSCocoaErrorDomain Code=260 "The file “SwiftLint” couldn’t be opened because there is no such file." UserInfo={NSURL=file:///Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmpuzohamytunr/Build/Intermediates.noindex/checkouts/SwiftLint, NSFilePath=/Users/user/Library/Developer/Xcode/DerivedData/MyProject-evuxagfsdccapkfmpuzohamytunr/Build/Intermediates.noindex/checkouts/SwiftLint, NSUnderlyingError=0x7df1e4030 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
[2026-01-16T03:58:24.445+09:00] [WARNING] Failed to read from disk SwiftLint
ビルドしてみる。(Build Tool Plugin を実行)
ないね…
Build Tool Plugin で GitHub 経由っていうのがそもそも無理っぽい。
全てを諦めた結果こうなった。(手動も手動)
manual:
- name: SwiftLint
source: https://github.com/realm/SwiftLint
body: |-
The MIT License (MIT)
このライセンスは BuildToolPlugin でも GenerateAcknowledgementsCommand でも生成された。
本当にBuildToolPluginでPodsライセンスは書き出されていない?
これも確認しておきたい。
既に GenerateAcknowledgementsCommand で生成されているものを Settings.bundle 内から削除しておく。
この状態でビルドして Build Tool Plugin を実行。
CocoaPodsのライブラリのライセンスも生成されている!!
ということで GenerateAcknowledgementsCommand で生成された分は全部消して良いのだ。okok〜
license_plist.yml を調整
license_plist.yml を調整しよう。
podsPath はデフォルトが Pods なので書かなくてok。その他デフォルト値のものと BuildToolPlugin 上で動作しているかよくわからないものたちは排除。
options:
xcodeprojPath: "*.xcodeproj"
xcworkspacePath: "*.xcworkspace"
prefix: xxx.xxxxx.MyProject
# Mintfile が正しく動作しないため手動で入れる
manual:
- name: SwiftLint
source: https://github.com/realm/SwiftLint
body: |-
The MIT License (MIT)
これだけでok。ビルドすると、CocoaPodsとSwift Package、手動で書いたSwiftLintのライセンスも生成されている。
確認は設定アプリで。
まとめ
XcodeのバージョンとLicensePlistのバージョンに合わせが大切である。
今回正しく動作したのは次の環境だった。
- Xcode 26.0.1
- LicensePlist 3.27.2(3.25.1では正しく動作しない)
Xcode 16.3 以降の環境では、 3.27.1 以上を使っていないと正しく動作しない。
反対にそれ以前のXcodeバージョンでは 3.27.0 を使わないと動作しない。
自分の環境では、最後に使ったのが Xcode 16.2 環境だったのでそれまでは正しく動作しており、Xcode 26.0.1に変えた時に問題が発生したようだ。
また GenerateAcknowledgementsCommand の方は2026年1月16日現在で2年ほど更新されていない状態であり、正しくパスが解決されていないようでうまく動作しないので注意が必要。(おそらく Xcode 16.2環境時点では正しく動作していた)
mintのライブラリは現状では Build Tool Plug-in を用いた方法ではライセンス取得ができない。
Build Tool Plug-in を用いた方法ではローカルからライセンス取得をしており、GitHub から取得する方法は利用できないと思われる。
おわりに
Build Tool Plug-ins というものを理解していないことを露呈してしまった。
何年もお世話になっているツールだし、何かできることがあればと思うが…とりあえず GenerateAcknowledgementsCommand についてわかったことに対してイシューを出してみるか。
とはいえここまで終わって GenerateAcknowledgementsCommand の需要ってなんだろうっていう気もする。いや、Build Tool Plug-in を組み込まないで直接 Settings.bundle に配置するというこれまで通りの用途かな。用意されているということは使う人もいるということのはず。
ビルド時に自動でやってくれると、逆に正しく生成されているかどうかが設定アプリで直接確認することになり、差分なども確認しづらいというデメリットもあるか。
GenerateAcknowledgementsCommand does not generate Swift Package licenses on Xcode 26 #251
イシュー立てておいた。自分でPRも出せればいいんだが、プラグインにもっと精通してないと厳しい…丸投げですまんです…
今回の一番ハマった原因は Build Tool Plugin と Command Plugin の違いを理解していなかったことだと思う。Run Build Tool Plug-ins のところに登録することで Command Plugin が使えるようになると勘違いをしていたことが問題だった。これらは別物で、Command Plugin は SwiftPMから導入した時点で利用できるもので、Run Build Tool Plug-ins に追加しなくても利用できるのである。
改めて LicensePlist の使い方についてまとめた記事も投稿することにする。
