yarn.lock のトップレベルキーの数
コメントの # 行は無視
const lines = fs.readFileSync("./yarn.lock").toString()
.split("\n")
.filter(x => x[0]?.trim() && x[0] !== "#")
console.log(lines.length)
console.log(lines.join("\n"))
42
accepts@^1.3.5:
cache-content-type@^1.0.0:
co@^4.6.0:
content-disposition@~0.5.2:
content-type@^1.0.4:
cookies@~0.9.0:
debug@^4.3.2:
deep-equal@~1.0.1:
delegates@^1.0.0:
depd@^2.0.0, depd@~2.0.0:
depd@~1.1.2:
...
◯ Yarn Berry
2 以降でも基本は同じ
だけど yarn.lock ファイルが YAML として有効なファイルになってるので YAML としてパースしてトップレベルキーの数を数える方法も取れる
2 以降の yarn.lock では自身もエントリとして存在する
「foo@workspace」 みたいなの
さらに __metadata という特殊なキーもあるので これらを除外する必要あり
const data = require("yaml").parse(fs.readFileSync("./yarn.lock").toString())
console.log(Object.keys(data).length - 2)
console.log(Object.keys(data).join("\n"))
42
"accepts@npm:^1.3.5":
"cache-content-type@npm:^1.0.0":
"co@npm:^4.6.0":
"content-disposition@npm:~0.5.2":
"content-type@npm:^1.0.4":
"cookies@npm:~0.9.0":
"debug@npm:^4.3.2":
"deep-equal@npm:~1.0.1":
"delegates@npm:^1.0.0":
"depd@npm:^2.0.0, depd@npm:~2.0.0":
"depd@npm:~1.1.2":
...
YAML ライブラリを入れなくても v1 と同じように行ごとの単純処理でも十分対応できる
YAML として有効なファイルになったことでキーは必ず 「"」 から始まってる
1 文字目が 「"」 という単純なカウントで済むので v1 より楽
この方法だと __metadata は含まれないので 自身のパッケージの数だけ除外すればいい
const lines = fs.readFileSync("./yarn.lock").toString()
.split("\n")
.filter(x => x[0] === '"')
console.log(lines.length - 1)
console.log(lines.join("\n"))
42
"accepts@npm:^1.3.5":
"cache-content-type@npm:^1.0.0":
"co@npm:^4.6.0":
"content-disposition@npm:~0.5.2":
"content-type@npm:^1.0.4":
"cookies@npm:~0.9.0":
"debug@npm:^4.3.2":
"deep-equal@npm:~1.0.1":
"delegates@npm:^1.0.0":
"depd@npm:^2.0.0, depd@npm:~2.0.0":
"depd@npm:~1.1.2":
...
Yarn Berry でゼロインストールにしてる場合は .yarn/cache にパッケージの zip ファイル一覧が並ぶのでこれを数えることもできる
.yarnrc.yml で enableGlobalCache: false になってると .yarn/cache にパッケージファイルが保存されてる
node_modules と違ってネストされないので同じ階層のファイル数で判断できる
ls .yarn/cache/ | wc -l
42
ここの方法だと自身は含まれないし __metadata キーもないので一番楽
一応 .gitignore が cache フォルダにあるけど隠しファイルなので ls に出てこない
◯ npm
package-lock.json の packages オブジェクトのキーの数
lock ファイルが JSON なので一番カンタンかも
トップレベルの packages プロパティにオブジェクトが入っていて このオブジェクトのキーがパッケージ一覧になってる
Yarn Berry 同様で自身(キーは 「""」)が含まれてるので それの除外が必要
const data = require("./package-lock.json")
console.log(Object.keys(data.packages).length - 1)
console.log(Object.keys(data.packages).join("\n"))
42
node_modules/accepts
node_modules/cache-content-type
node_modules/co
node_modules/content-disposition
node_modules/content-type
node_modules/cookies
node_modules/debug
node_modules/deep-equal
node_modules/delegates
node_modules/depd
...◯ pnpm
pnpm-lock.yaml ファイルの packages オブジェクトのキーの数
npm に近いけど YAML なのでパースが面倒
単純な方法でやるなら 「 /」 から始まる行の数
const data = require("yaml").parse(fs.readFileSync("./pnpm-lock.yaml").toString())
console.log(Object.keys(data.packages).length - 1)
console.log(Object.keys(data.packages).join("\n"))
42
/accepts@1.3.8
/cache-content-type@1.0.1
/co@4.6.0
/content-disposition@0.5.4
/content-type@1.0.5
/cookies@0.9.1
/debug@4.3.4
/deep-equal@1.0.1
/delegates@1.0.0
/depd@1.1.2
/depd@2.0.0
/destroy@1.2.0