CLIツールでworkspaceが有効かを確認するために各パッケージマネージャーごとのworkspace仕様概説
札幌のフロントエンドエンジニア**n13u**です。
皆さんはJavaScriptランタイム・Node.jsでのパッケージマネージャーは何を使われていますか?
npm,yarn,pnpm,deno,bun etc...
それぞれにモノレポ管理用のworkspaces機能がありますが、それぞれ設定が若干異なり挙動が異なるためパッケージマネージャーを複数併用していると時々わからなくなります.
特にNode.js環境向けCLIツール開発では、パッケージマネージャーに依存環境をインストールさせる際など同じワークスペース認識方法を使わないと正しく機能しません.
今回の記事では各パッケージマネージャーの以下の機能・特性をそれぞれまとめてみます.
- workspaceの認識方法
- scriptの動かし方
- 依存環境の追加方法
workspaceに対応しているパッケージマネージャー抜粋
今回workspaceに対応しているパッケージマネージャーのうち、以下のパッケージマネージャーを対象にします.
- npm
- yarn(classic)
- yarn(berry)
- pnpm
- bun
npm
一番標準的なパッケージマネージャーです.
workspace認識方法
Workspaces are usually defined via the workspaces property of the package.json file
npmのworkspace認識方法は基本的でpackage.json
のworkspaces
にフォルダを指定することでworkspace機能有効化できます.
{
"name": "my-workspaces-powered-project",
"workspaces": ["packages/a"]
}
scriptの動かし方
scriptやコマンドを実行するときは--workspace
オプションを利用します.
--workspace=a
をつけてnpm run <command>
することで可能になります.
全てのworkspaceのコマンドを一括して実行したい場合は--workspaces
をオプションにつけるだけで良いです.
依存環境の追加方法
npm install <dependency-name>
にオプション-w <workspace name>
で特定のワークスペースにインストールするか、ルートならルート、パッケージのフォルダでinstall
することで実現可能です.
workspace関連公式ドキュメント
yarn(classic)
yarnの主にv1の話になります.
同様にworkspaces
をpackage.json
ファイルに追加することでworkspaceが認識することができます.
workspace認識方法
{
"private": true,
"workspaces": [
"workspace-a",
"workspace-b"
]
}
scriptの動かし方 / 依存環境の追加方法
yarn(classic)はnpmとは異なり、全てのコマンドをworkspace
サブコマンドを利用して実行します. 以下のようにworkspace_nameを指定しコマンドを実行することでパッケージの追加などが行えます. もしくはパッケージフォルダに移動して実行でも可能です.
yarn workspace <workspace_name> <command>
各workspaceに対して一括してスクリプトを実行したい場合は以下のコマンドが利用可能です
yarn workspaces run <command>
workspace関連公式ドキュメント
- https://classic.yarnpkg.com/lang/en/docs/workspaces/
- https://classic.yarnpkg.com/lang/en/docs/cli/workspace/
- https://classic.yarnpkg.com/en/docs/cli/workspaces
yarn(berry)
yarnはv2以降に大きく変更が入っています.
ここではv2以降の仕様で動くyarnをyarn(berry)と呼びます.
workspace認識方法
yarn(berry)でも基本的なworkspace認識方法は変わりません.
{
"workspaces": [
"packages/*"
]
}
scriptの動かし方 / 依存環境の追加方法
yarn(berry)でも基本的にはパッケージ追加とコマンドの実行はサブコマンドworkspace
を利用可能です.もしくはパッケージフォルダに移動して実行でも可能です.
yarn workspace <workspaceName> <commandName> ...
ただし一括して行う場合のコマンドは同じくworkspaces
ですがrun
ではなくforeach
を加える必要があります.
yarn workspaces foreach <commandName> ...
ただし特定のワークスペースにだけ依存環境を追加したい場合は、以下のyarn workspaces focus
が利用可能です. そしてこのコマンドは-A / --all
オプションと組み合わせてclassicまでのyarn install --production
を代替します.
yarn workspaces focus ...
workspace関連公式ドキュメント
pnpm
pnpmはnpm, yarnに続く新たなパッケージマネージャーです.
workspace認識方法
pnpmは他のパッケージマネージャーと大きく異なり、pnpm-workspace.yaml
という設定ファイルにworkspaceフォルダを記述することでworkspaceを認識します.
packages:
- 'my-app'
- 'packages/*'
- 'components/**'
- '!**/test/**'
scriptの動かし方 / 依存環境の追加方法
pnpmでは--filter
オプションを指定することで依存環境の追加やスクリプトの実行をワークスペースごとに行えます.
pnpm add --filter=<workspace_name>
もしくはパッケージフォルダに移動して実行でも可能です.
ただしパッケージルートに依存環境を追加する際は--ignore-workspace-root-check / -w
オプションを明示的に付与する必要があります.
pnpm add -w -D typescript
workspace関連公式ドキュメント
bun
bunは実行環境でもあり、パッケージマネジャーの役割もはたします.
workspace認識方法
こちらはnpm等と同じようにpackage.json
のworkspaces
に記述することで、workspaceとして認識します.
{
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}
scriptの動かし方 / 依存環境の追加方法
こちらも同様に--filter
オプションを利用してスクリプトの実行や依存環境の追加を制限できます.もしくはパッケージフォルダに移動して実行でも可能です.
bun add --filter=<workspace_name>
workspace関連公式ドキュメント
終わりに
各パッケージマネージャーごとの特性と機能を理解することで少しでもworkspaceへの理解が深まればと思います.
Discussion