swift package show-dependenciesは、Package.swiftに書いた依存パッケージと、依存パッケージが依存するパッケージ(推移的依存)を、解決したバージョンつきの依存ツリーで表示する。
$ swift package show-dependencies
.
├── yams<https://github.com/jpsim/Yams@6.2.2>(traits: default)
└── swift-markdown<https://github.com/swiftlang/swift-markdown@0.9.0>(traits: default)
└── swift-cmark<https://github.com/swiftlang/swift-cmark.git@0.9.0>(traits: default)
Package.swiftに書いたのはYamsとswift-markdownの2つだけだが、swift-markdownが依存するswift-cmarkも表示される。使っているパッケージのバージョンや、意図しないパッケージが入っていないかの確認に使える。
実行例はSwift 6.4、macOS 27.0.1のもの。
依存関係の解決も実行される
show-dependenciesは、表示の前に依存関係を解決する。Package.resolvedがない状態で実行すると、パッケージの取得とPackage.resolvedの作成も実行される。
$ ls -A
Package.swift
Sources
$ swift package show-dependencies
Fetching https://github.com/jpsim/Yams from cache
...
Working copy of https://github.com/swiftlang/swift-cmark.git resolved at 0.9.0
.
├── yams<https://github.com/jpsim/Yams@6.2.2>(traits: default)
...
$ ls -A
.build
Package.resolved
Package.swift
Sources
取得の進捗は標準エラー出力、依存ツリーは標準出力に出力される。標準出力だけをファイルに保存したいときは、標準エラー出力を捨てる。
$ swift package show-dependencies 2>/dev/null > dependencies.txt
参考: 【swift package】Package.swiftの依存関係の解決だけを先に実行する (resolve)
Package.resolvedのバージョンが表示される
Package.resolvedのバージョンがPackage.swiftの要件を満たしているときは、Package.resolvedのバージョンで表示される。要件が6.0.0以上のパッケージで、Package.resolvedを6.0.0に書き換えると、6.0.0が表示された。
$ swift package show-dependencies
.
├── yams<https://github.com/jpsim/Yams@6.0.0>(traits: default)
...
Package.swiftの要件をfrom: "6.1.0"に変更すると、Package.resolvedのバージョンが要件を満たさなくなる。この状態でshow-dependenciesを実行すると、Package.resolvedが書き換えられて、6.2.2が表示された。
Package.resolvedを書き換えたくないときは、--disable-automatic-resolutionを付ける。Package.resolvedが古いと、依存ツリーは表示されずに、終了コード1で失敗する。
$ swift package --disable-automatic-resolution show-dependencies
error: an out-of-date resolved file was detected at [パッケージのパス]/Package.resolved, which is not allowed when automatic dependency resolution is disabled; please make sure to update the file to reflect the changes in dependencies. ...
$ echo $?
1
--disable-automatic-resolutionは、show-dependenciesの後ろに指定しても、同じように動作する。
出力の見方
テキストの各行は、[パッケージ名]<[取得元]@[バージョン]>(traits: default)の形式である。ルートの.の直下がPackage.swiftに書いた依存パッケージで、字下げした行が、そのパッケージの依存パッケージである。
traits: defaultは、パッケージのトレイト(機能の切り替え)が、既定の設定であることを表す。
取得元とバージョンは、依存の指定方法で変わる。
| 指定方法 | 表示 |
|---|---|
from: "6.0.0"などのバージョン指定 | <URL@6.2.2>のようにバージョンを表示 |
branch: "2.x"などのブランチ指定 | <URL@unspecified>と表示 |
path: "../Local"のローカルパッケージ | <[ローカルパッケージの絶対パス]@unspecified>と表示 |
ブランチを指定したパッケージは、解決したコミットがWorking copy of ... resolved at 2.x (b41aa91)のように取得時のログに出力されるだけで、依存ツリーには表示されない。
ローカルパッケージが依存するパッケージも、推移的依存として表示される。
$ swift package show-dependencies
.
├── local<[Localパッケージの絶対パス]@unspecified>(traits: default)
│ └── yams<https://github.com/jpsim/Yams@6.2.2>(traits: default)
└── swift-markdown<https://github.com/swiftlang/swift-markdown@0.9.0>(traits: default)
└── swift-cmark<https://github.com/swiftlang/swift-cmark.git@0.9.0>(traits: default)
出力形式を変更する
--formatで、出力形式をtext、dot、json、flatlistから選ぶ。既定はtextである。
flatlist
パッケージ名だけを1行ずつ表示する。依存関係の階層は表示されない。
$ swift package show-dependencies --format flatlist
yams
swift-markdown
swift-cmark
json
パッケージの名前、取得元、バージョン、ローカルのチェックアウトのパスを、入れ子のJSONで表示する。
$ swift package show-dependencies --format json
{
"identity": "demo",
"name": "Demo",
"url": "[パッケージのパス]",
"version": "unspecified",
"path": "[パッケージのパス]",
"traits": [
"default"
],
"dependencies": [
{
"identity": "yams",
"name": "Yams",
"url": "https://github.com/jpsim/Yams",
"version": "6.2.2",
"path": "[パッケージのパス]/.build/checkouts/Yams",
"traits": [
"default"
],
"dependencies": [
]
},
...
]
}
jqを使うと、推移的依存を含むパッケージ名の一覧を取り出せる。
$ swift package show-dependencies --format json 2>/dev/null | jq -r '[.. | objects | select(has("identity")) | .identity] | unique[]'
demo
swift-cmark
swift-markdown
yams
ルートのパッケージ(demo)も含まれる。
dot
Graphvizのdot言語で、依存関係を有向グラフとして出力する。
$ swift package show-dependencies --format dot
digraph DependenciesGraph {
node [shape = box]
"[パッケージのパス]" [label="demo\n[パッケージのパス]\nunspecified"]
"https://github.com/jpsim/Yams" [label="yams\nhttps://github.com/jpsim/Yams\n6.2.2"]
"[パッケージのパス]" -> "https://github.com/jpsim/Yams"
"https://github.com/swiftlang/swift-markdown" [label="swift-markdown\nhttps://github.com/swiftlang/swift-markdown\n0.9.0"]
"[パッケージのパス]" -> "https://github.com/swiftlang/swift-markdown"
"https://github.com/swiftlang/swift-cmark.git" [label="swift-cmark\nhttps://github.com/swiftlang/swift-cmark.git\n0.9.0"]
"https://github.com/swiftlang/swift-markdown" -> "https://github.com/swiftlang/swift-cmark.git"
}
出力をファイルに保存する
-o(--output-path)にパスを指定すると、依存ツリーをファイルに保存する。保存するときは、標準出力に何も出力されない。
$ swift package show-dependencies --format json -o dependencies.json
$ ls
dependencies.json Package.resolved Package.swift Sources
同じパッケージが複数の場所に表示される
同じパッケージを、Package.swiftと推移的依存の両方で参照していると、パッケージは参照している場所の数だけ表示される。swift-markdownが依存するswift-cmarkを、Package.swiftにも追加して試した。
$ swift package show-dependencies
.
├── yams<https://github.com/jpsim/Yams@6.2.2>(traits: default)
├── swift-markdown<https://github.com/swiftlang/swift-markdown@0.9.0>(traits: default)
│ └── swift-cmark<https://github.com/swiftlang/swift-cmark.git@0.9.0>(traits: default)
└── swift-cmark<https://github.com/swiftlang/swift-cmark.git@0.9.0>(traits: default)
flatlistも重複を取り除かない。
$ swift package show-dependencies --format flatlist
yams
swift-markdown
swift-cmark
swift-cmark
パッケージの一覧を重複なしで取り出すときは、sort -uを使う。
$ swift package show-dependencies --format flatlist 2>/dev/null | sort -u
swift-cmark
swift-markdown
yams
別のフォルダのパッケージを指定する
Package.swiftのあるフォルダ以外で実行するときは、--package-pathでパッケージのフォルダを指定する。
$ swift package --package-path [パッケージのフォルダ] show-dependencies --format flatlist
Package.swiftがないフォルダで実行すると、エラーで終了コード1になる。Package.swiftのないフォルダでは、.xcodeprojの依存関係も表示できない。
$ swift package show-dependencies
error: Could not find Package.swift in this directory or any of its parent directories.
$ echo $?
1
どちらの方法を選ぶか
| やりたいこと | 方法 |
|---|---|
| 推移的依存を階層で確認する | swift package show-dependencies |
| パッケージ名だけの一覧が欲しい | --format flatlist(重複はsort -uで取り除く) |
| スクリプトで処理する | --format jsonとjq |
| 依存関係をグラフで描く | --format dot |
| ファイルに保存する | -o [ファイル名] |
Package.resolvedを書き換えずに表示する | --disable-automatic-resolution |
show-dependenciesは、依存関係の解決も実行する。Package.resolvedを書き換えたくないCIでは、--disable-automatic-resolutionを付ける。
