I mine projekter viser jeg altid et versionsnummer et sted i app’en, så folk kan tjekke om de har seneste version. Det er derfor ekstremt vigtigt at jeg husker at ændre det versionsnummer hver gang jeg bygger projektet.
Derfor at jeg lavet byggeproceduren således at den automatisk beder om version som det første. Herefter skrives versionsnummeret til environment.*.ts filerne og herfra kan versionen hentes og vises hvor som helst i app’en.
Til det formål skal vi bruge ‘replace-in-file’ og ‘inquirer’. Førstnævnte bruges til at overskrive indhold i filer og sidstnævnte beder om input fra kommandolinien:
1 2 |
npm install replace-in-file --save-dev npm install inquirer --save-dev |
Herefter oprettes et script. Jeg har placeret det i projektets rod (samme sted som package.json og angular.json). Jeg har kaldt scriptet prebuild.js
da det skal afvikles som det første i byggeproceduren. Det kommer vi tilbage til.
Her er scriptet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
const replace = require('replace-in-file'); const inquirer = require('inquirer'); var buildVersion = ''; //Prompt for version (options) var questions = [{ type: 'input', name: 'version', message: "Type the version for this build (e.g. 1.3.7):", }] //Prompt for version (execute) inquirer.prompt(questions).then( answers => { let v = answers['version']; //Validate the answer if (/^[1-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}/.test(v)) { buildVersion = v; registerVersion(); } else { throw "Please provide a valid version number"; } } ).catch(err => { throw err; }); //Function to register version in files function registerVersion() { let optionsObj = {}; //Replacement for version.json (for the backend - skip this if not needed) optionsObj['version'] = { files: 'src/assets/version.json', from: [/"version": "(.*)"/g,/"released": "(.*)"/g], to: ["\"version\": \""+ buildVersion + "\"","\"released\": \""+(new Date).getTime()+"\""], allowEmptyPaths: false, }; //Replacement for environment.prod.ts optionsObj['optionsProd'] = { files: 'src/environments/environment.prod.ts', from: /version: "(.*)"/g, to: "version: \""+ buildVersion + "\"", allowEmptyPaths: false, }; //Replacement for environment.ts optionsObj['optionsTest'] = { files: 'src/environments/environment.ts', from: /version: "(.*)"/g, to: "version: \""+ buildVersion + "\"", allowEmptyPaths: false, }; //Execute the replacement Object.keys(optionsObj).forEach(opt => { let file = optionsObj[opt].files; try { let changedFiles = 0; changedFiles = replace.sync(optionsObj[opt]); if (changedFiles == 0) { throw "Please make sure that file '" + file + "' has 'version: \"\"'"; } console.log('Build version ' + buildVersion + ' set in '+file); } catch (err) { throw err; }; }); } |
I package.json under “scripts” indsætter du nu denne linie:
1 |
"before-build": "node prebuild.js" |
Du har sikkert allerede konfigureret en eller flere jobs til bygning af dit projekt med. F.eks.:
1 |
"build-prod": "ng build --prod --configuration=my-config" |
Du indsætter nu et nyt job, som du navngiver på samme måde, blot med “pre” foran:
1 |
"prebuild-prod": "npm run before-build" |
Dvs når du kører
npm run build-prod
vil npm sørge for at afvikle prebuild-prod
først og i umiddelbar forlængelse heraf build-prod
.
I prebuild-prod
henvises til jobbet before-build
hvor vi har angivet det script der beder om versionsnummer og skriver det til de nødvendige filer.