💼

npm workspaceとCIを使ったときはnpm ciをパッケージルートでやる必要がある

2024/09/14に公開

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 の中にはそのパッケージ内依存関係が入っているが、ワークスペースを用いた依存関係はワークスペースのルートに入っている(というかワークスペース情報はワークスペースのルートしか持ってない)ため起こる

解決するためには

  1. ./root で npm ci
  2. ./root で npm -w packages/worker1 build

とやったらたぶん通る。わかってしまえば簡単


こんなやらかしをするのは私だけかもしれないが

Discussion