正确configuration依赖本地软件包的NPM软件包

我有三个本地npm包: C:\projects\AC:\projects\BC:\projects\mainMain是使用Webpack构build的React应用程序。 Main取决于AB ,也取决于B 我们有我们自己的“全球”包pipe理器,它保证包将位于同一个父文件夹中。

我想适应这些:

  1. 节点(和webpack的) require将解决本地包

  2. 每当我改变AB时,我不需要在Main npm install

我在Mainpackage.json做了这个:

 .... "dependencies": { "A": "file:../A", "B": "file:../B", "react": ... ......... 

但遇到了一个奇怪的问题: npm不会安装AB的node_modules中的所有包,所以Webpack构build失败。 而且我需要每次运行npm install

我GOOGLE了 ,发现linklocal ,它将所有本地包replace为符号链接。 但遇到另一个问题:

linklocal不会安装链接依赖项的依赖关系,因此通常最终会安装链接依赖项的依赖关系两次:在npm安装期间,然后在linklocal

所以我跑了linklocal ,然后npm installpostinstall脚本。 但是npm @ 3没有对符号链接的文件夹做任何事情:

 npm WARN update-linked node_modules/A needs updating to 1.0.0 from 1.0.0 but we can't, as it's a symlink 

然后,我决定修改postinstall以转到每个符号链接的模块,然后从那里运行npm install 。 它一见钟情:安装运行良好,以及webpack补丁。 但Webpack开始捆绑两个React(这是禁止的)副本。

如何正确configuration我的包?

在程序包A和程序包B中,您可以使用执行webpack预安装脚本。 这应该解决所有的依赖关系。
在你的主包上,你应该链接到包A和B的dist (build)文件夹。
另外检查这个库wml ,它可以帮助你保持同步你的本地依赖。

的package.json:

"scripts": { "preinstall": "webpack" }

如果你不需要在其他机器上构buildMain,你可以在你的project / Main中做类似的事情

 let C = require('C:\projects\A\index.js') 

或者你可以有一个分支

 require('C:\projects\A\index.js') 

另一个与:

 require('C') 

您可以在本地使用npm link来维护到本地开发版本的符号链接。

因此,将Mainpackage.json重置为指向发布的软件包实际存在的位置:

  "dependencies": { "A": "<PUBLISHED_PACKAGE_REPO>", "B": "<PUBLISHED_PACKAGE_LOCATION>", "react": ... 

这确保您的项目将始终build立在CI /其他机器上。

然后,导航到您的“项目A”目录并创build一个链接:

 cd projects\A npm link 

这将创build一个指向C:\projects\A的npm特定符号链接。

然后为B项目做同样的事情:

 cd projects\B npm link 

您现在已经创build了两个项目链接,只需要将它们链接到您的Main项目:

 cd projects\Main npm link A npm link B 

如果A还依赖于B ,则只需链接这些项目即可:

 cd projects\A npm link B 

当你完成开发并想要使用package.json指定的任何东西时,只需取消链接并安装:

 cd projects\Main npm unlink A npm unlink B npm install 

我个人使用npm pack来打包我的依赖,然后使用`npm install ./path/to/pack/result.tgz将它们安装在我的主项目中

它避免发布对A和B所做的每一项更改,但并不妨碍您

每当我改变AB时, npm installMain