◆ corepack が有効なら yarn dlx というコマンドのときは yarn3 が使われるので使える

yarn dlx を使いたい

パッケージをインストールせず一回限りのコマンドを実行したいとき npx コマンドが使えます
ただ 普段使いが yarn ですし キャッシュ的な意味でも できれば npm 系コマンドの npx ではなく yarn にしておきたいです

ですが yarn の 「yarn run」 は package.json の scripts コマンドやインストール済みのコマンドの bin に指定されたものを実行できるだけです
未インストールパッケージのコマンドは実行できません

V2 以降の yarn (berry) なら 「yarn dlx」 というコマンドが用意されていますが V1 の yarn (classic) には dlx コマンドは無いはずです
ドキュメントを見ても dlx は見当たらないです

未だに yarn classic をメインに使ってるので これは不便です
でも yarn って classic がグローバルにインストールするもので berry はプロジェクト内にインストールするものって区分だったはずです
「yarn dlx」 ってプロジェクトを作成するなど プロジェクト外で実行することも多いはずです
berry に切り替えてどうにかなるというわけではなさそうです

使えた

yarn って init の -2 オプションなど ドキュメントのコマンド説明に記載されてない隠しコマンドみたいのがあります
もしかしたら使えたり?と思って試してみました

[root@045070769ee0 opt]# yarn -v
1.22.19
[root@045070769ee0 opt]# yarn dlx
Unknown Syntax Error: Not enough positional arguments.

$ yarn dlx [-p,--package #0] [-q,--quiet] <command> ...

使えてそうですね
説明に dlx と書かれてますし解釈されてそうです

実際にパッケージを指定してみるとちゃんと動きました

なぜ?

動いたものの気になるところがあります
メッセージの表示などが yarn classic とは違って浮いてます
berry の機能なので berry から持ってきたにしても 中で berry を呼び出してるという感じです

「yarn dlx --help」 を実行してみると表示されるヘルプも classic とは大きく違って berry で使われてる cli のライブラリが出す形式です

この環境は corepack で yarn を入れてるのでもしかするとそれが関係してるかもしれません

一旦全部アンインストールして 「npm -g install yarn」 で yarn を入れて試してみました

[root@045070769ee0 /]# yarn dlx
yarn run v1.22.19
error Couldn't find a package.json file in "/"
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

さっきとは違うエラーになっています
dlx が見つからないので yarn run で dlx というコマンドを実行しようとして package.json を探してエラーという感じです
package.json を作って scripts に dlx というコマンドを用意すれば実行されます

yarn のバージョンはどちらも 1.22.19 でした
corepack で入れた yarn かどうかで動作が変わっています

corepack

corepack のソースコードを見てると特定コマンドに一致したときだけバージョンを切り替える仕組みがありました

https://github.com/nodejs/corepack/blob/v0.20.0/sources/main.ts#L56-L66
https://github.com/nodejs/corepack/blob/v0.20.0/config.json

    (略)
"yarn": {
"default": "1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447",
"fetchLatestFrom": {
"type": "npm",
"package": "yarn"
},
"transparent": {
"default": "3.6.3+sha224.524038cfca4ec8b2d45164c9c13f05e57a7d762f30542a8d647f69e3",
"commands": [
[
"yarn",
"dlx"
]
]
},
(略)

「yarn dlx」 コマンドなら 3.6.3 を使うようになっています
「yarn --version」 では 1.22.19 なのに 中では 3.6.3 って罠というかなんというかやめてほしい挙動です
実行時の最初の出力として yarn@3.6.3 というのが出てればいいんですけど

でもまぁ dlx だけは使えるということがわかったので 「yarn dlx」 を使ってインストールなしでの実行を使っていけますね