yarn v1 でも yarn dlx が使える?
◆ 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」 を使ってインストールなしでの実行を使っていけますね