yarn.lockに記載されているパッケージバージョン一覧を取得する
はじめに
プロジェクトで使用しているパッケージの正確なバージョンを一覧化したい時ってありますよね(?)
そういうことがあったので備忘録的に記事にします。
ついつい package.json
に記載されてるバージョンがパッケージのバージョンと思ってしまいがちですが、package.json
に記載されているバージョンは範囲を示しているだけで、実際に使用しているバージョンとは異なります。
正確なバージョンは yarn.lock
や package-lock.json
に記載されているのでそこを参照する必要がありますが依存関係も記載されており 1 つ 1 つ確認するのは大変です。
パッケージのライセンスを確認する license-checker-rseidelsohn
を使えば比較的簡単に一覧かできました。
とりあえず結果から
license-checker-rseidelsohn をインストール
(global に追加してますが、yarn 2 系であれば dlx で追加したいです)
yarn global add license-checker-rseidelsohn
jq が入っていない場合はインストール
brew install jq
コマンド実行
yarn license-checker-rseidelsohn --production --direct 0 --json | awk '/^{/,/^}/' | jq 'keys'
出力結果
[
"-@0.0.1",
"D@1.0.0",
"O@0.0.9",
"exact@0.8.0",
"g@2.0.1",
"i@0.3.7",
"optional@0.1.4",
"tag@0.4.17",
"tilde@0.1.1",
"version@0.1.2",
"zenn-cli@0.1.150"
]
コマンド内でやってること
オプションについては license-checker-rseidelsohn のREADMEに記載されてますが簡単に書いていきます。
--production
--production
は devDependencies に記載されているパッケージを除外するオプションです。
--production
を指定しないと devDependencies に記載されているパッケージも一覧に含まれます。
逆に devDependencies に記載されているパッケージが欲しい場合は --development
を指定します。
--direct 0
--direct [boolean|number]
というオプションで、どこまでの依存関係を含めるかを指定しています。
README には--direct true
の指定で直接の依存関係を出力すると記載されていますが、実際には、このオプションを使うと依存関係を含んだ出力になるので注意です。
なのでここでは --direct 0
として、0階層(実質的に直接的な依存関係)に該当するパッケージのみを出力するようにしています。
--json
そのままです。json 形式で出力するオプションです。
awk '/^{/,/^}/'
awk コマンド で 正規表現を用いて json 形式の出力の {
から }
までの部分を抽出しています。
yarn
の設定で yarn run
のログなどが出力される設定だと、以下のように余分なログが出力されてしまうので、それを除外するために使用しています。
yarn run v1.22.19
$ {path}/node_modules/.bin/license-checker-rseidelsohn --production --direct 0 --json
{
"hoge": {
"fuga": "piyo"
}
}
✨ Done in 0.64s.
一応 yarn 自体の設定でログを出力しないようにもできます。
参考: https://sunday-morning.app/posts/2021-05-11-yarn-run-silent
jq 'keys'
jq 'keys'
コマンドで json 形式の出力からキーの一覧を取得しています。
今回の場合、キーの パッケージ名@バージョン
の情報だけが欲しかったので他の情報を除外するために使用しました。
"zenn-cli@0.1.150": {
"licenses": "MIT",
"repository": "https://github.com/zenn-dev/zenn-editor",
"path": "/Users/yamamotonaoyuki/private/zenn-docs/node_modules/zenn-cli",
"licenseFile": "/Users/yamamotonaoyuki/private/zenn-docs/node_modules/zenn-cli/LICENSE"
},
余談
license-checker ではなくて license-checker-rseidelsohn を使った理由
できれば license-checker を使いたかったですが、直接の依存関係があるものだけを出力する--direct
オプションが動作しない問題がありました。(issue に挙げられているものの解決しないまま)
参考: https://github.com/davglass/license-checker/issues/191
なのでlicense-checker
の代用として license-checker からフォークして作られた license-checker-rseidelsohn を使用しました。
yarn 2 系であれば license-checker-rseidelsohn は yarn dlx で実行したい
license-checker-rseidelsohn
はパッケージバージョンを出力するためだけに使用したいので、プロジェクトに依存しないyarn dlx
でインストールしたいです。
1 系であれば global でインストールできますが、yarn の思想的に今後は推奨されなくなるようです。
Use yarn dlx instead of yarn global
Yarn focuses on project management, and managing system-wide packages was deemed to be outside of our scope. As a result, yarn global got removed and needs to be replaced by yarn dlx to run one off scripts.
参考: https://yarnpkg.com/migration/guide#use-yarn-dlx-instead-of-yarn-global
おわりに
もっと簡単に一覧取得できる方法ある気がしますが、今回は license-checker-rseidelsohn を使って一覧化しました。
json 形式で出力できればどうにでもなりそうですが、こういうのパッとできるようになりたいです。
参考記事
Discussion