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を付ける。