Closed7

npm workspaces について調べる

uttkuttk

このスクラップについて

npm workspaces について調査します。

検証する npm のバージョン
$> npm -v
8.19.3
uttkuttk

フォルダー構造について

フォルダー構造は以下のような感じになります👇

.
├── packgages/
│   ├── a-lib/
│   │   ├── index.js
│   │   └── package.json
│   └── b-lib/
│       ├── index.js
│       └── package.json    
└── package.json
uttkuttk

ルートにパッケージをインストール

実行したコマンド
$> npm install -D typescript

node_modules は以下のようになりました👇

./node_modules
node_modules/
├── .bin
├── a-lib ⏎
├── b-lib ⏎
├── typescript
└── .package-lock.json

typescript は普通にインストールされているが、
注目すべき点は、この時点で workspace 内のシンボリックリンクが作成されている👀
これはつまり、デフォルトで巻き上げが発生する感じかな?

uttkuttk

workspace にパッケージをインストール

$> cd ./packages/a-lib
$> npm install -D typescript

結果、node_modules は作成されなかった。
これは巻き上げ ( hoisting ) が発生したため。ルートにインストールされている typescript にまとめられてしまっている。

yarn とかでは nohoist みたいなのがあるが、npm ではないかも?

https://github.com/npm/rfcs/issues/287

uttkuttk

workspace に他の workspace をインストール ( ローカルパッケージのインストール )

以下のコマンドを実行

$> cd ./packages/a-lib
$> npm install b-lib

すると、package.json には "b-lib": "^0.0.1" が追記される👇

./packages/a-lib/package.json
{
  // ...
+ "dependencies": {
+   "b-lib": "^0.0.1"
+ }
}

この場合も巻き上げ ( hoisting ) が発生するため、a-lib 内には node_modules は作成されずに、ルートの方へインストールされる。

uttkuttk

workspace の npm scripts を実行する

ルートで workspace の npm scripts を実行したい場合は、-w フラグを付けると指定した workspace の npm scripts を実行できる。

./packages/a-lib/package.json
{
  // ...
  "scripts": {
    "hello": "echo \"hello world!\""
  },
  // ...
}
実行するコマンド
$> npm run hello -w a-lib

>a-lib@0.0.1 hello
>echo "hello world!"

hello world!
uttkuttk

全ての workspace の npm scripts を実行する

-ws, --workspaces フラグを付けるだけで実行できる👇

$> npm run hello -ws

>a-lib@0.0.1 hello
>echo "hello world!"

hello world!

>b-lib@0.0.1 hello
>echo "hello world!"

hello world!

しかし、実行する npm scripts が定義されてない workspace があった場合は、その workspace でエラーが発生するので、定義されている workspace のみ実行したい場合は --if-present フラグを付けて実行する👇

$> npm run hello -ws --if-present

>a-lib@0.0.1 hello
>echo "hello world!"

hello world!
このスクラップは2023/03/02にクローズされました