NodeJS NPM 7 workspace-如何在workspace中安装新包?

py49o6xq  于 2023-04-05  发布在  Node.js
关注(0)|答案(7)|浏览(358)

如果我有一个像这样的NPM 7 workspace

root
   - submodule0
   - submodule1
   - submodule2

我导航到submodule 0目录并运行npm i somepackage,它似乎通过在submodule 0目录中创建一个新的package-lock.json并在那里安装所有依赖项来“破坏”工作区。换句话说,它只是执行在我创建工作区之前存在的旧行为。我希望使用类似于lerna的命令,在其中我可以从在submodule 0中安装一个新包。root。类似于:

npm i somepackage --scope submodule0

到目前为止,我能找到的唯一解决方法是编辑submodule 0 package.json并手动添加somepackage。然后从根目录运行npm i。显然这并不理想,因为我需要查找@latest版本,导航到子目录,打开package.json等。等等。而不是只在根目录中键入一行。

snvhrwxg

snvhrwxg1#

npm v7.14.0中增加了对npm installnpm uninstall的工作区支持。现在你可以做:

npm i somepackage --workspace=submodule0

卸载模块一直是最大的痛苦,所以这真的很令人兴奋。npm团队似乎正在慢慢地一个接一个地添加对命令的支持。在这里关注更新:https://github.com/npm/cli/blob/latest/CHANGELOG.md .

ki1q1bka

ki1q1bka2#

我也很困惑为什么npm workspaces没有这个功能。
我目前的解决方案使用add-dependencies包,它将依赖项添加到声明的package.json文件中,同时跳过安装过程。

npm i add-dependencies -g

然后,从monorepo的顶层,您可以运行:

npx add-dependencies ./submodule0/package.json somepackage && npm i

希望--workspace参数很快会被添加到npm i中,以避免这种麻烦。

jm2pwxwz

jm2pwxwz3#

如果你有NPM v7.14.0或以上版本,请参考上面mattwad的回答

原答复

我对这些建议不太满意,但将它们组合在一起,在没有任何依赖关系的npm脚本中使用它:

{
   "add": "npm install --package-lock-only --no-package-lock --prefix",
   "postadd": "npm install"
}

这可以像下面这样使用:npm run add -- submodule0 somepackage

tjjdgumg

tjjdgumg4#

只添加到package.json

你可以使用它来安装package到package.json中(你不需要外部依赖)

npm i --prefix packages/test --save --package-lock-only --no-package-lock express

然后是npm i,将指定的依赖项安装到mono存储库根node_modules

蕾娜

也可以使用lerna来使用工作区名称来安装依赖项到
package.json

{
  "name": "mono",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     "wsi": "function workspaceinstall() { ( scope=$1; shift; lerna exec --scope \"$scope\" -- npm install --package-lock-only --no-package-lock \"$@\") }; workspaceinstall"
  },
  "author": "",
  "license": "ISC",
  "workspaces": {
    "packages": [
      "packages/**"
    ]
  }
}

lerna.json
一个二个一个一个
wsi脚本只修改提供的工作空间名称的package.json,要实际安装依赖项,必须运行npm i

g52tjvyc

g52tjvyc5#

在我的例子中,这与你的情况类似,我删除了所有内部项目的所有依赖项,也删除了package-lock.json,并将所有内容安装在根目录中。

/
  node_modules
  package.json >> all dependencies
  package-lock.json >> the only lock file that exists in the repo
  /packages
    /A
      package.json >> no dependencies
      -- no package-lock.json
    /B
      package.json >> no dependencies
      -- no package-lock.json
    /C
      package.json >> no dependencies
      -- no package-lock.json

这样,node_modules文件夹只驻留在根目录下,package-lock.json文件也在根目录下。
如果我允许每个项目都有自己的package-lock.json,我开始看到安装和运行时错误(因为每个项目都可以有自己的node_modules和自己的依赖版本)。
这是我认为最好的方法。

irlmq6kh

irlmq6kh6#

在尝试使用npm install--prefix --save --package-lock-only --no-package-lock选项后,npm总是为我自己的monorepo软件包给予错误E404 - Not Found,这些软件包尚未发布到注册表。因此,即使尝试安装外部软件包也会失败,因为我当前依赖于package.json。
为了解决这个问题,我最后提出了前面的建议:

"scripts": {
    "add": "add-dependencies $npm_config_scope/package.json",
    "postadd": "npm i",
},
"devDependencies": {
    "add-dependencies": "^1.1.0"
},

然后我可以做:

npm run add --scope=packages/app express
npm run add --scope=packages/core eslint jest -D

这对于安装外部包很好。要安装我自己的位于monorepo内部的包,我仍然需要手动编辑package.json,否则我会得到package not found error

2eafrhcq

2eafrhcq7#

我相信这个问题已经在npm 8.5.0中解决了。

我能够从submodule0/目录在submodule0工作区中安装一个包,而不会在同一目录中创建package-lock.jsonnode_modules/

相关问题