同名の bin script を持つ package を install するとどうなるのか?

thumbnail

package.json には bin フィールド があり、ここでは package の実行ファイルを実行するコマンドを登録できます。 ここに登録されたコマンドは package の install 時に ./node_modules/.bin/ に保存され、この領域は npx hoge, yarn hoge として実行できます。

同名 bin を持つ package を install する

ここで、同名 bin を持つ package の install を考えます。諸々の実験を same-name-node-bin でしたので、これを例に使います。

いま、same-name-node-bin-for-aaa と same-name-node-bin-for-bbb というパッケージを用意します。

これらはそれぞれ

export const aaa = () => {
  console.log("aaa");
};
export const bbb = () => {
  console.log("bbb");
};

という関数を index.js に持ちます。

そしてそれらを実行する関数として、bin に

// aaa.js
const aaa = require("../src/index").aaa;

aaa();

// bbb.js
const bbb = require("../src/index").bbb;

bbb();

を用意します。

このとき、それぞれの package.json に

{
  "bin": {
    "same-node-bin-for": "bin/aaa.js"
  }
}
{
  "bin": {
    "same-node-bin-for": "bin/bbb.js"
  }
}

と書きます。

このように書くことで、この package の install 時に npx same-node-bin-foryarn same-node-bin-for が実行できるようになります。

ではこのとき、同名の bin を持つこれらの package をnpm i same-name-node-bin-for-aaa same-name-node-bin-for-bbb などとして install した場合、node_modules/.bin の中はどうなるのでしょうか?

答え

  • node_modules/.bin の中に same-node-bin-for というファイルが生まれる。
  • same-node-bin-for の中身は、先に npm i したもの

つまり、npm i same-name-node-bin-for-aaa した後に npm i same-name-node-bin-for-bbbとすると、 same-name-node-bin-for-aaa の bin が same-node-bin-for となります。 なので、bbb を期待すると予想が外れることとなるので注意しましょう!

おわりに

そもそも同名の bin を使わないように package 名を bin 名に付けるなりして工夫しましょう。 ちなみに同名の bin スクリプトが降ってくるライブラリがあります。(ex. @storybook/*)