How to include git revision into angular-cli application?

前端 未结 9 2177
甜味超标
甜味超标 2021-01-31 16:40

I need to display git revision on my angular2 application\'s about page. The project is based on angular-cli.

How can build be extended so git revision is put for exampl

9条回答
  •  抹茶落季
    2021-01-31 16:59

    As suggested by @Yuri, I was able to solve this by using npm scripting.

    1. Defined git.version.ts in the root of the angular-cli project:
    import { Observable, combineLatest } from 'rxjs'
    
    declare var require: any;
    declare var process: any;
    
    const fs = require('fs');
    const exec = require('child_process').exec;
    
    const revision = new Observable(s => {
        exec('git rev-parse --short HEAD',
            (error: Error, stdout, stderr) => {
                if (error !== null) {
                    console.log('git error: ' + error + stderr);
                }
                s.next(stdout.toString().trim());
                s.complete();
            });
    });
    
    const branch = new Observable(s => {
        exec('git rev-parse --abbrev-ref HEAD',
            (error: Error, stdout, stderr) => {
                if (error !== null) {
                    console.log('git error: ' + error + stderr);
                }
                s.next(stdout.toString().trim());
                s.complete();
            });
    });
    
    combineLatest(revision, branch)
        .subscribe(([revision, branch]) => {
            console.log(`version: '${process.env.npm_package_version}', revision: '${revision}', branch: '${branch}'`);
    
            const content = '// this file is automatically generated by git.version.ts script\n' +
                `export const versions = {version: '${process.env.npm_package_version}', revision: '${revision}', branch: '${branch}'};`;
    
            fs.writeFileSync(
                'src/environments/versions.ts',
                content,
                {encoding: 'utf8'}
            );
        });
    
    
    1. Added pre-build hook in package.json:
    "scripts": {
        "ng": "ng",
        ...
        "start": "ng serve --proxy proxy-config.json",
        "prebuild.prod": "ts-node -O \"{\\\"module\\\":\\\"commonjs\\\"}\" git.version.ts",
        "build.prod": "ng build -prod",
        ...
    }
    
    1. Use the generated src/environments/versions.ts in the application.

      UPDATE 10/2018: Here is the more-readable version of the script, rxjs-version-agnostic:

    import { writeFileSync } from 'fs';
    import { dedent } from 'tslint/lib/utils';
    import { promisify } from 'util';
    import * as child from 'child_process';
    const exec = promisify(child.exec);
    
    async function createVersionsFile(filename: string) {
      const revision = (await exec('git rev-parse --short HEAD')).stdout.toString().trim();
      const branch = (await exec('git rev-parse --abbrev-ref HEAD')).stdout.toString().trim();
    
      console.log(`version: '${process.env.npm_package_version}', revision: '${revision}', branch: '${branch}'`);
    
      const content = dedent`
          // this file is automatically generated by git.version.ts script
          export const versions = {
            version: '${process.env.npm_package_version}',
            revision: '${revision}',
            branch: '${branch}'
          };`;
    
      writeFileSync(filename, content, {encoding: 'utf8'});
    }
    
    createVersionsFile('src/environments/versions.ts');
    
    
    

    Note, when using angular-cli v7.0.6, I also had to change script invocation in the package.json:

    "scripts": {
        ...
        "prebuild.prod": "ts-node -O '{\"module\": \"commonjs\"}' git.version.ts",
        ...
    }
    

提交回复
热议问题