正确configuration依赖本地软件包的NPM软件包
我有三个本地npm包: C:\projects\A
, C:\projects\B
和C:\projects\main
。 Main
是使用Webpack构build的React应用程序。 Main
取决于A
和B
,也取决于B
我们有我们自己的“全球”包pipe理器,它保证包将位于同一个父文件夹中。
我想适应这些:
-
节点(和webpack的)
require
将解决本地包 -
每当我改变
A
或B
时,我不需要在Main
npm install
我在Main
的package.json
做了这个:
.... "dependencies": { "A": "file:../A", "B": "file:../B", "react": ... .........
但遇到了一个奇怪的问题: npm
不会安装A
和B
的node_modules中的所有包,所以Webpack构build失败。 而且我需要每次运行npm install
。
我GOOGLE了 ,发现linklocal ,它将所有本地包replace为符号链接。 但遇到另一个问题:
linklocal不会安装链接依赖项的依赖关系,因此通常最终会安装链接依赖项的依赖关系两次:在npm安装期间,然后在linklocal
所以我跑了linklocal
,然后npm install
在postinstall
脚本。 但是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
来维护到本地开发版本的符号链接。
因此,将Main
的package.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所做的每一项更改,但并不妨碍您
每当我改变
A
或B
时,npm install
在Main