Angular SSR开发环境下dev:ssr命令无法复制.pem文件至dist/server目录的解决方案咨询
解决方案:Angular SSR dev:ssr 中.pem文件复制被覆盖的问题
针对你遇到的dev:ssr命令中提前执行cp脚本会被Angular重新生成的dist目录覆盖的问题,这里有几个不用nodemon的可行方案:
方案1:利用Angular CLI的Server端Assets配置(最推荐)
Angular Universal的server端构建支持通过angular.json配置自动复制静态资源,完全不需要手动写cp脚本。
- 打开你的
angular.json文件,找到projects -> [你的项目名] -> architect -> server -> options -> assets节点 - 添加如下配置,指定要复制的.pem文件路径:
{ "glob": "*.pem", "input": "./backend/keys", "output": "./keys" }
修改后的server assets配置大概长这样:
"server": { "builder": "@angular-devkit/build-angular:server", "options": { "outputPath": "dist/[你的项目名]/server", "main": "server.ts", "tsConfig": "tsconfig.server.json", "assets": [ "src/favicon.ico", "src/assets", { "glob": "*.pem", "input": "./backend/keys", "output": "./keys" } ] }, // ...其他配置 }
这样不管是执行build:ssr还是dev:ssr,Angular CLI都会自动把./backend/keys下的所有.pem文件复制到dist/[你的项目名]/server/keys目录,完全避免了手动复制的时机问题,这也是Angular官方推荐的静态资源管理方式。
方案2:使用wait-on + cpx监听文件变化
如果不想修改Angular配置,可以通过工具来控制复制时机,确保在dist目录生成后再执行复制,同时监听文件变化自动同步:
- 先安装依赖:
npm install wait-on cpx --save-dev
- 修改
package.json中的dev:ssr脚本:
"dev:ssr": "ng run projectName:serve-ssr & wait-on dist/projectName/server/main.js && npm run cp && cpx \"./backend/keys/*.pem\" dist/projectName/server/keys --watch"
&让serve-ssr在后台运行wait-on等待server端的main.js生成(说明dist目录已构建完成)- 执行初始的
cp复制文件 cpx --watch持续监听./backend/keys下的.pem文件变化,有修改就自动同步到dist目录
方案3:用npm-run-all优化脚本可读性
如果觉得方案2的命令行太复杂,可以用npm-run-all来拆分并行/串行任务,让脚本更清晰:
- 安装依赖:
npm install npm-run-all cpx wait-on --save-dev
- 修改
package.json的scripts:
"scripts": { // ...其他原有脚本 "dev:ssr:serve": "ng run projectName:serve-ssr", "dev:ssr:sync-keys": "wait-on dist/projectName/server/main.js && cpx \"./backend/keys/*.pem\" dist/projectName/server/keys --watch", "dev:ssr": "run-p dev:ssr:serve dev:ssr:sync-keys" }
run-p是npm-run-all的并行执行命令,同时启动serve-ssr和同步任务dev:ssr:sync-keys先等待dist生成,再执行初始复制,最后监听文件变化
这几个方案都能解决你遇到的问题,其中方案1是最简洁且符合Angular生态的方式,优先推荐使用。
内容的提问来源于stack exchange,提问作者Luckyy
相关产品推荐
相关产品推荐

