💼
npm workspaceとCIを使ったときはnpm ciをパッケージルートでやる必要がある
npm workspaceを使ってワークスペースを切り分け、一部の処理や型定義を使い回す場合にハマった穴
こんな感じのディレクトリ構成とする
root
|-packages
|-api-types
|-wokrer1
|-worker2
Worker1とWorker2が、ともにapi-typesパッケージを参照し型定義を行っているTypeScript環境を想定している
package.json
{
"others": "...",
"workspaces": [
"packages/api-types",
"pakcages/worker1",
"packages/worker2"
]
}
こんなとする
で、何も考えずCIで、例えば packages/worker1
のディレクトリ下で普通に npm build
とかでビルドさせようとすると、おそらくこんな感じのエラーが出る
Type error: Cannot find module 'api-types' or its corresponding type declarations.
1 | import { APIResult } from 'api-types'
^
これは、当然ながらパッケージが解決できていない状態のエラーである。じゃあ npm ci してあげようねーとなるが、これは親(root)で行う必要がある
各ワークスペースの環境下の package.json/package-lock.json の中にはそのパッケージ内依存関係が入っているが、ワークスペースを用いた依存関係はワークスペースのルートに入っている(というかワークスペース情報はワークスペースのルートしか持ってない)ため起こる
解決するためには
- ./root で npm ci
- ./root で npm -w packages/worker1 build
とやったらたぶん通る。わかってしまえば簡単
こんなやらかしをするのは私だけかもしれないが
Discussion