如何修改ng-packagr工作流以在Angular库中嵌入编译时动态版本信息
可以实现,无需修改ng-packagr的核心工作流程,通过构建前置钩子自动生成版本常量文件的方式即可完成需求,具体实现方案如下:
核心思路
利用Node脚本在打包前自动生成包含版本信息的TypeScript常量文件,纳入Angular库的源码体系后导出服务,最终会被ng-packagr正常编译进打包产物,使用者可直接调用。
具体实现步骤
步骤1:确定版本信息来源
通常版本信息直接从库根目录的package.json读取,CI环境下的构建哈希、构建时间等信息可以从环境变量中获取。步骤2:编写版本常量自动生成脚本
在项目根目录新建scripts/generate-version.js脚本,内容参考如下:const fs = require('fs'); const path = require('path'); // 读取package.json版本信息 const packageJson = require('../package.json'); // 读取环境变量中的构建信息,本地开发默认取local标识 const buildHash = process.env.COMMIT_HASH || 'local-build'; const buildTime = new Date().toISOString(); const versionFileContent = `
// 此文件为构建自动生成,请勿手动修改
export const LIB_VERSION = {
coreVersion: '${packageJson.version}',
prereleaseTag: '${packageJson.version.includes('-') ? packageJson.version.split('-')[1].split('.')[0] : 'stable'}',
buildHash: '${buildHash}',
buildTime: '${buildTime}'
};
`;
// 将生成的常量文件写入库的源码目录
fs.writeFileSync(path.resolve(__dirname, '../projects/你的库名称/src/lib/version.ts'), versionFileContent.trim());
- 步骤3:配置构建钩子自动执行脚本 修改项目根目录`package.json`的打包脚本,在ng-packagr执行前先运行生成脚本: ```json { "scripts": { "build:lib": "node scripts/generate-version.js && ng build 你的库名称 --configuration production" } }
- 步骤4:实现VersionService并对外导出
在库的源码中实现版本服务,引入自动生成的常量:
最后在库的import { Injectable } from '@angular/core'; import { LIB_VERSION } from './version'; @Injectable({ providedIn: 'root' }) export class VersionService { getCoreVersion(): string { return LIB_VERSION.coreVersion; } getPrereleaseTag(): string { return LIB_VERSION.prereleaseTag; } getFullBuildInfo() { return { hash: LIB_VERSION.buildHash, time: LIB_VERSION.buildTime }; } }public-api.ts中导出服务和常量,供使用者导入使用:export * from './lib/version.service'; export * from './lib/version';
注意事项
- 自动生成的
version.ts文件建议加入.gitignore,避免提交到代码仓库 - CI环境构建时提前把构建哈希、构建号等信息注入到环境变量,脚本即可自动读取到对应值
- 该方案兼容所有主流ng-packagr版本,无需修改ng-packagr本身的逻辑
内容的提问来源于stack exchange,提问作者lanoxx

