buildTag.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * 在外部配置文件追加用于追踪版本的信息
  3. */
  4. import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';
  5. import fs, { appendFileSync } from 'fs-extra';
  6. import { execSync } from 'node:child_process';
  7. import colors from 'picocolors';
  8. import { getRootPath } from '../utils';
  9. import pkg from '../../package.json';
  10. import dayjs from 'dayjs';
  11. interface CreateTagParams {
  12. configFileName?: string;
  13. }
  14. function createTag(params: CreateTagParams) {
  15. const { configFileName } = params;
  16. try {
  17. const prop = '__LAST_PRODUCTION_TAG__';
  18. const path = `window.${prop}`;
  19. const tag = {
  20. // last commit's SHA
  21. commit: execSync('git rev-parse --short HEAD').toString().replace('\n', ''),
  22. buildtime: dayjs().format('YYYY-MM-DD_HH:mm:ss'),
  23. version: execSync('npm pkg get projectVersion').toString().replace('\n', ''),
  24. };
  25. // Ensure that the variable will not be modified
  26. const evalExp = `
  27. ${path}=${JSON.stringify(tag)};
  28. Object.freeze(${path});
  29. Object.defineProperty(window, "${prop}", {
  30. configurable: false,
  31. writable: false,
  32. });`.replace(/\s/g, '');
  33. fs.mkdirp(getRootPath(OUTPUT_DIR));
  34. appendFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), evalExp);
  35. console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - tag infomation generate successfully:`);
  36. console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n');
  37. } catch (error) {
  38. console.log(colors.red('tag infomation generation failed to package:\n' + error));
  39. }
  40. }
  41. export function runBuildTag() {
  42. createTag({
  43. configFileName: GLOB_CONFIG_FILE_NAME,
  44. });
  45. }