🔏

yarn.lockに記載されているパッケージバージョン一覧を取得する

に公開

はじめに

プロジェクトで使用しているパッケージの正確なバージョンを一覧化したい時ってありますよね(?)
そういうことがあったので備忘録的に記事にします。

ついつい package.json に記載されてるバージョンがパッケージのバージョンと思ってしまいがちですが、package.json に記載されているバージョンは範囲を示しているだけで、実際に使用しているバージョンとは異なります。
正確なバージョンは yarn.lockpackage-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形式で出力できればどうにでもなりそうですが、こういうのパッとできるようになりたいです。

参考記事

https://zenn.dev/luvmini511/articles/56bf98f0d398a5
https://qiita.com/ssc-ynakamura/items/90c6fe31b5f6fe0989ac

Discussion