Closed7
npm workspaces について調べる
フォルダー構造について
フォルダー構造は以下のような感じになります👇
.
├── packgages/
│ ├── a-lib/
│ │ ├── index.js
│ │ └── package.json
│ └── b-lib/
│ ├── index.js
│ └── package.json
└── package.json
ルートにパッケージをインストール
実行したコマンド
$> npm install -D typescript
node_modules は以下のようになりました👇
./node_modules
node_modules/
├── .bin
├── a-lib ⏎
├── b-lib ⏎
├── typescript
└── .package-lock.json
typescript は普通にインストールされているが、
注目すべき点は、この時点で workspace 内のシンボリックリンクが作成されている👀
これはつまり、デフォルトで巻き上げが発生する感じかな?
workspace にパッケージをインストール
$> cd ./packages/a-lib
$> npm install -D typescript
結果、node_modules は作成されなかった。
これは巻き上げ ( hoisting ) が発生したため。ルートにインストールされている typescript にまとめられてしまっている。
yarn とかでは nohoist
みたいなのがあるが、npm ではないかも?
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 は作成されずに、ルートの方へインストールされる。
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!
全ての 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にクローズされました