NodeJS 节点工作区-需要本地包

uubf1zoe  于 2023-06-22  发布在  Node.js
关注(0)|答案(3)|浏览(114)

我使用node/npmworkspaces特性,布局如下:

.
+-- package.json
`-- packages
   `-- p1
      `-- package.json
   `-- p2
      `-- package.json
./package.json

{
  …
  "workspaces": [
    "./packages/*"
  ],
  …
  "dependcies": { … }
  …
}

npm install和一切都工作到目前为止。但是现在我想将p1作为依赖项添加到p2。但我该怎么做?我曾天真地尝试过:

./packages/p2/package.json

{
  …
  "dependencies": {
    "p1": "*"
  }
  …
}

但是这在安装时会产生一个错误,告诉我在注册表中找不到p1

9rygscc1

9rygscc11#

UPDATE -使用npm cli

从项目根目录运行

npm i ./packages/p1 -w packages/p2

./必须的,否则npm会混淆从npm注册表安装包和从本地目录安装包。

手动解决方法

通过在p2package.json中提供p1的相对路径,手动添加p1作为本地依赖,因此在您的示例中:

./packages/p2/package.json

{
  …
  "dependencies": {
    "p1": "file:../p1"
  }
  …
}

然后需要运行p2包中的npm install
我从LinkedIn的一篇文章Things I wish I had known when I started JavaScript monorepo with Lerna中找到了这个解决方案。

icnyk63a

icnyk63a2#

这种天真的方法应该有效,这让我怀疑你的设置可能有问题。有几件事你可以仔细检查一下:

  • ./p1/package.json中的"name"字段是否正好是p1?(例如,如果您正在使用范围名称,则可能需要在./p2/package.json"dependencies"中使用@scopename/p1
  • 你有最新版本的npm cli吗?npm -v(当前为v7.23.0)
  • 确保p1软件包在./node_modules文件夹中正确地符号链接,例如:ls -l ./node_modules/p1

但我该怎么做?
假设一切都正确设置,您可以使用-w <workspace-name>参数将包添加为工作区(包括另一个工作区)的依赖项,例如:(添加p1作为p2的dep)npm install p1 -w p2,参考:https://docs.npmjs.com/cli/v7/using-npm/workspaces#adding-dependencies-to-a-workspace

ncecgwcz

ncecgwcz3#

.
+-- package.json
`-- packages
   `-- p1
      `-- package.json
   `-- p2
      `-- package.json

对于NPM工作区,不要在./packages/p2/package.json中指定对p1的依赖。
NPM会自动计算出你的本地依赖项。
如果在依赖项中指定p1,它将在项目P2 node_modules下安装一个过时版本。要在发生这种情况时修复此问题,请执行以下操作:
1.删除P2的node_modules下的旧版本P1
1.删除./packages/p2/package.json中的P1依赖项。
1.重建一切。
希望他们能在文档中更好地解释这一点:docs.npmjs.com/cli/v9/using-npm/workspaces?v=true

相关问题