如果我有一个像这样的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等。等等。而不是只在根目录中键入一行。
7条答案
按热度按时间snvhrwxg1#
npm v7.14.0中增加了对
npm install
和npm uninstall
的工作区支持。现在你可以做:卸载模块一直是最大的痛苦,所以这真的很令人兴奋。npm团队似乎正在慢慢地一个接一个地添加对命令的支持。在这里关注更新:https://github.com/npm/cli/blob/latest/CHANGELOG.md .
ki1q1bka2#
我也很困惑为什么npm workspaces没有这个功能。
我目前的解决方案使用add-dependencies包,它将依赖项添加到声明的package.json文件中,同时跳过安装过程。
然后,从monorepo的顶层,您可以运行:
希望
--workspace
参数很快会被添加到npm i
中,以避免这种麻烦。jm2pwxwz3#
如果你有NPM v7.14.0或以上版本,请参考上面mattwad的回答
原答复
我对这些建议不太满意,但将它们组合在一起,在没有任何依赖关系的npm脚本中使用它:
这可以像下面这样使用:
npm run add -- submodule0 somepackage
tjjdgumg4#
只添加到package.json
你可以使用它来安装package到package.json中(你不需要外部依赖)
然后是
npm i
,将指定的依赖项安装到mono存储库根node_modules蕾娜
也可以使用lerna来使用工作区名称来安装依赖项到
package.json
lerna.json
一个二个一个一个
wsi脚本只修改提供的工作空间名称的package.json,要实际安装依赖项,必须运行
npm i
g52tjvyc5#
在我的例子中,这与你的情况类似,我删除了所有内部项目的所有依赖项,也删除了package-lock.json,并将所有内容安装在根目录中。
这样,node_modules文件夹只驻留在根目录下,package-lock.json文件也在根目录下。
如果我允许每个项目都有自己的package-lock.json,我开始看到安装和运行时错误(因为每个项目都可以有自己的node_modules和自己的依赖版本)。
这是我认为最好的方法。
irlmq6kh6#
在尝试使用
npm install
和--prefix --save --package-lock-only --no-package-lock
选项后,npm总是为我自己的monorepo软件包给予错误E404 - Not Found
,这些软件包尚未发布到注册表。因此,即使尝试安装外部软件包也会失败,因为我当前依赖于package.json。为了解决这个问题,我最后提出了前面的建议:
然后我可以做:
这对于安装外部包很好。要安装我自己的位于monorepo内部的包,我仍然需要手动编辑package.json,否则我会得到
package not found error
。2eafrhcq7#
我相信这个问题已经在npm 8.5.0中解决了。
我能够从
submodule0/
目录在submodule0
工作区中安装一个包,而不会在同一目录中创建package-lock.json
和node_modules/
。