如何强制 npm 扁平化依赖关系?
How to force npm to flatten dependencies?
我有一个项目,其中多个前端共享一个公共库。
这些项目的模块依赖由 npm 管理。
因此,在我拥有的每个项目的 package.json 中:
"dependencies": {
"mylib": "file:../<...path...>/mylib",
...other deps...
},
我使用 "mylib" 有两个目的:
- 分享一些 类 ;
- 共享共同的依赖项(主要是 angular)
直到现在,我使用的是 npm 3.3.12,在 运行 npm install
之后,mylib 的 angular 依赖项就在我的 node_modules 目录下水平项目。
例如,我有
node_modules
@angular
core
common
....
mylib
现在,使用 npm 5.4.2,我有:
node_modules
mylib
node_modules
@angular
core
common
这会导致我的构建出现很多问题 process.It 需要通过添加指令来额外配置 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、rollup 等做类似的配置时,这真的很烦人...
我尝试使用 npm dedupe 来简化这个。由于项目有很多依赖项,其中一个项目就需要超过 1000 万 :
npm dedupe
...
...
removed 824 packages and moved 1020 packages in 623.196s
是否有一种标准的、高效的 方法可以像以前一样使依赖关系变平? npm dedupe 可以完成这项工作,但需要花费太多时间,因此它不是一个可接受的替代方案。
作为 npm
的替代方法,您可能想改用 yarn
。默认情况下应该对模块进行重复数据删除。首先删除现有的 node_modules
文件夹,然后执行 yarn install
.
您也可以强制 yarn
进行平面安装 (yarn install --flat
),但在这种情况下,只需进行平面安装就足够了。
将 yarn.lock
文件添加到版本控制,然后任何其他签出将被锁定到相同的模块版本(除非他们 yarn upgrade
)。
我有一个项目,其中多个前端共享一个公共库。
这些项目的模块依赖由 npm 管理。
因此,在我拥有的每个项目的 package.json 中:
"dependencies": {
"mylib": "file:../<...path...>/mylib",
...other deps...
},
我使用 "mylib" 有两个目的:
- 分享一些 类 ;
- 共享共同的依赖项(主要是 angular)
直到现在,我使用的是 npm 3.3.12,在 运行 npm install
之后,mylib 的 angular 依赖项就在我的 node_modules 目录下水平项目。
例如,我有
node_modules
@angular
core
common
....
mylib
现在,使用 npm 5.4.2,我有:
node_modules
mylib
node_modules
@angular
core
common
这会导致我的构建出现很多问题 process.It 需要通过添加指令来额外配置 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、rollup 等做类似的配置时,这真的很烦人...
我尝试使用 npm dedupe 来简化这个。由于项目有很多依赖项,其中一个项目就需要超过 1000 万 :
npm dedupe
...
...
removed 824 packages and moved 1020 packages in 623.196s
是否有一种标准的、高效的 方法可以像以前一样使依赖关系变平? npm dedupe 可以完成这项工作,但需要花费太多时间,因此它不是一个可接受的替代方案。
作为 npm
的替代方法,您可能想改用 yarn
。默认情况下应该对模块进行重复数据删除。首先删除现有的 node_modules
文件夹,然后执行 yarn install
.
您也可以强制 yarn
进行平面安装 (yarn install --flat
),但在这种情况下,只需进行平面安装就足够了。
将 yarn.lock
文件添加到版本控制,然后任何其他签出将被锁定到相同的模块版本(除非他们 yarn upgrade
)。