我有以下情况:
前端的
package.json
{ "dependencies": { "lib" : "1.0.0", "foo" : "1.0.0" } }
lib的
package.json
{ "devDependencies": { "foo" : "1.0.0" }, peerDependencies": { "foo" : "1.0.0" } }
虽然我正在使用webpack-dev-server
进行一些前端开发,但我正在将模块foo
与npm link
链接到 Frontend的依赖树中:
├── foo@1.0.0
└─┬ lib@1.0.0
└── foo@1.0.0
而不是像这样:
├── foo@1.0.0
└── lib@1.0.0
我已经发现webpack
在我的foo
的{{1}}文件夹中的lib
中找到了模块node_modules
,因为我将此包定义为devDependencies
我的单元测试。现在,捆绑源中有两次该软件包,这会导致一些错误。
问题:如何强制 webpack
或npm
使用我父母的模块foo
(lib一样在我的peerDependencies
中使用> Frontend )?
答案 0 :(得分:0)
我假设您已经在两个不同的文件夹中本地检出了frontend和lib,并使用cd frontend && npm link lib
之类的东西将lib链接到了前端。因此,您的目标是在两个软件包上同时工作(在两个编辑器中更改代码),但同时也希望能够分别在前端和lib中运行编译器和单元测试。
答案是:不可能(那么容易)。这是因为依赖关系始终始终首先解析到程序包的文件夹中。这意味着,如果在lib中安装了foo,它将始终选择lib:foo,而不是root:foo。
最简单的解决方案是根本不安装lib:foo或将其删除。您可以根据需要使用root:foo。但是,如果您使用npm link
,它将首先安装所有lib的依赖项。
因此,对于在前端中进行一次构建,您只需删除该lib:foo软件包,然后进行构建。但是,从lib软件包的角度来看,由于其依赖关系被搞砸,因此没有任何作用。
更强大的解决方案是将lib安装在root中,并且只安装foo的实际依赖项,而这些依赖项不在peer / devDependencies中
为此,您可以在https://github.com/marcj/npm-local-development上使用npm-local-development
它与npm link
基本上具有相同的作用,但是通过设置文件观察程序并在后台自动同步文件更改(不包括所有devDependencies / peerDependencies)来解决devDependency限制。
.links.json
的文件。您像这样将每个程序包名称及其本地相对文件夹路径写入其中
{ “ @ shared / core”:“ ../../my-library-repo/packages/core” }
npm-local-development
。让它在后台运行。免责声明:我是这个免费的开源项目的作者。