Angular 6构建库时如何自动将资产复制到dist目录?
Angular 6库构建时资产自动复制的问题解决
我最近在构建Angular 6库的时候碰到了个棘手的问题——没法通过Angular CLI的内置配置,让库的资产文件在每次构建时自动复制到dist目录对应的位置。先给大家看看我的项目结构:
- dist - e2e - node_modules - projects - lib1 - src - lib - assets - icons - src
遇到的具体问题
- 执行
ng build lib1或者ng build lib1 --prod时,projects/lib1/src/assets/icons文件夹完全不会被复制到dist/lib1/assets/icons路径下 - 执行根项目的
ng build命令时,根目录的src/assets能正常复制到dist,但库的projects/lib1/assets依然没动静 - 尝试在
angular.json里给库项目单独添加"assets"配置项,直接触发Schema校验错误:
Schema validation failed with the following errors: Data path "" should NOT have additional properties(assets).
- 想通过根项目的assets配置添加自定义复制规则,把库的资产复制到
dist/lib1,写了如下配置:
"assets": [ "src/favicon.ico", "src/assets", { "glob": "**/*", "input": "src/assets/icons", "output": "../lib1/assets/icons" } ],
结果又报错:
An asset cannot be written to a location outside of the output path.
目前的进展
我已经向Angular CLI提交了相关Issue,但暂时还没收到回复。
可行的替代解决方案
既然CLI内置方式行不通,我们可以用npm脚本配合文件复制工具来实现自动复制:
- 安装依赖工具
先安装copyfiles作为开发依赖,用来复制文件:
npm install copyfiles --save-dev
如果需要每次构建前清理旧的dist目录,可以再安装rimraf:
npm install rimraf --save-dev
- 添加npm构建脚本
在项目根目录的package.json中,修改scripts部分,添加针对库的构建命令:
"scripts": { // 普通构建 "build:lib1": "rimraf dist/lib1 && ng build lib1 && copyfiles -u 3 projects/lib1/src/assets/**/* dist/lib1/assets/", // 生产构建 "build:lib1:prod": "rimraf dist/lib1 && ng build lib1 --prod && copyfiles -u 3 projects/lib1/src/assets/**/* dist/lib1/assets/" }
这里的-u 3参数是用来移除文件路径的前三级(也就是projects/lib1/src/这部分),确保资产文件能被放到dist/lib1/assets的正确路径下。
之后每次构建库的时候,只要执行npm run build:lib1或者npm run build:lib1:prod,就能自动完成构建+资产复制的流程了。
内容的提问来源于stack exchange,提问作者dev7
相关产品推荐
相关产品推荐

