我有三个本地npm包:C:\projects\A
,C:\projects\B
和C:\projects\main
。 Main
是使用Webpack构建的React应用程序。 Main
取决于A
和B
,A
取决于B
。我们有自己的"全球"包管理器,它保证包将位于同一个父文件夹中。
我想适合这些:
节点(和webpack' s)require
将解析本地包
每次更改npm install
或Main
A
B
醇>
我是在Main
' package.json
....
"dependencies": {
"A": "file:../A",
"B": "file:../B",
"react": ...
.........
但遇到了一个奇怪的问题:npm
并未在A
和B
的node_modules中安装所有软件包,因此Webpack构建失败。我需要每次都运行npm install
。
我用Google搜索并找到了linklocal,它将所有本地包替换为符号链接。但遇到了另一个问题:
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 bunding。但Webpack开始捆绑两份React(禁止使用)。
如何正确配置我的包?
答案 0 :(得分:1)
在包A和包B中,您可以使用预安装脚本执行 webpack 。这应该解决所有依赖项。
在主程序包上,您应该链接到包A和B的 dist (构建)文件夹
另请查看此库wml,它可以帮助您保持本地依赖关系
package.json:
"scripts": {
"preinstall": "webpack"
}
答案 1 :(得分:1)
如果您不需要在其他机器中构建Main,您可以在项目/ Main中执行类似的操作
let C = require('C:\projects\A\index.js')
或者您可以使用
分支require('C:\projects\A\index.js')
还有另一个:
require('C')
答案 2 :(得分:0)
您可以在本地使用npm link
来维护本地开发版本的符号链接。
因此,重置package.json
中的Main
以指向已发布的软件包实际存在的位置:
"dependencies": {
"A": "<PUBLISHED_PACKAGE_REPO>",
"B": "<PUBLISHED_PACKAGE_LOCATION>",
"react": ...
这可确保您的项目始终构建在CI /其他计算机等上。
然后,导航到您的&#34;项目A&#34;目录并创建一个链接:
cd projects\A
npm link
这将创建一个指向C:\projects\A
的npm特定符号链接。
然后为B项目做同样的事情:
cd projects\B
npm link
您现在已经创建了两个项目链接,只需将它们实际链接到您的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
答案 3 :(得分:0)