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