我有一个项目,其中几个前端共享一个公共库。
这些项目的模块依赖关系由npm管理。
所以,在我所拥有的每个项目的package.json中:
"dependencies": {
"mylib": "file:../<...path...>/mylib",
...other deps...
},
我使用“mylib”有两个目的:
到目前为止,我正在使用npm 3.3.12并在运行npm install
之后,mylib的角度依赖关系位于我的顶级项目的node_modules目录下。
所以,我有例如
node_modules
@angular
core
common
....
mylib
现在,使用npm 5.4.2,我有:
node_modules
mylib
node_modules
@angular
core
common
这会在我的构建过程中引起很多问题。它需要通过添加指令来进行额外的typescript配置:
"baseUrl": "",
"paths": {
"@angular/common": ["node_modules/mylib/node_modules/@angular/common/"],
"@angular/core": ["node_modules/mylib/node_modules/@angular/core/"],
"@angular/compiler": ["node_modules/mylib/node_modules/@angular/compiler/"],
"@angular/compiler-cli": ["node_modules/mylib/node_modules/@angular/compiler-cli/"],
"@angular/forms": ["node_modules/mylib/node_modules/@angular/forms/"],
"@angular/http": ["node_modules/mylib/node_modules/@angular/http/"],
"@angular/platform-browser": ["node_modules/mylib/node_modules/@angular/platform-browser/"],
"@angular/platform-browser/animations": ["node_modules/mylib/node_modules/@angular/platform-browser/animations/"],
"@angular/platform-browser-dynamic": ["node_modules/mylib/node_modules/@angular/platform-browser-dynamic/"],
"@angular/router": ["node_modules/mylib/node_modules/@angular/router/"],
"primeng/primeng": ["node_modules/mylib/node_modules/primeng/primeng"],
"rxjs/Rx": ["node_modules/mylib/node_modules/rxjs/Rx"]
}
tsconfig.json中的
当您必须为AOT,汇总等进行类似的配置时,它变得非常烦人......
我尝试使用npm重复数据删除来简化这一点。由于项目有很多依赖项,因此只需要其中一项就需要超过1000万:
npm dedupe
...
...
removed 824 packages and moved 1020 packages in 623.196s
是否有一种标准的,高效的方式可以像以前一样扁平化相同类型的依赖关系? npm重复数据删除完成了这项工作,但需要花费很多时间,以至于它不是一个可接受的选择。
答案 0 :(得分:3)
作为npm
的替代方案,您可能希望切换为使用yarn
。这应该默认重复数据删除模块。首先删除现有的node_modules
文件夹,然后执行yarn install
。
您也可以强制yarn
进行平面安装(yarn install --flat
),但在这种情况下,仅进行普通安装就足够了。
将yarn.lock
文件添加到版本控制中,然后任何其他结帐将被锁定到相同的模块版本(除非他们执行yarn upgrade
)。