typescript - Hvordan vise app-versjonen i Angular?
Hvordan viser jeg appversjonen i en Angular-applikasjon? Versjonen skal hentes fra package.json-filen.
{
"name": "angular-app",
"version": "0.0.1",
...
}
I Angular 1.x har jeg denne HTML-en:
<p><%=version %></p>
I Angular blir dette ikke vist som versjonsnummer, men bare skrevet ut som det er (<%=version %> i stedet for 0.0.1).
Svar #1
Hvis du vil bruke/vis versjonsnummeret i din Angular-app, vennligst gjør følgende:
Forutsetninger:
- Angular-fil- og mappestruktur opprettet via Angular CLI
Trinn for Angular 6.1 (TS 2.9+) til Angular 11
- I din
/tsconfig.json(noen ganger også nødvendig i/src/tsconfig.app.json) aktiver følgende alternativ (webpack dev server må startes på nytt etterpå):
"compilerOptions": {
...
"resolveJsonModule": true,
...
- Så i komponenten din, for eksempel
/src/app/app.component.ts, bruk versjonsinformasjonen slik:
import { version } from '../../package.json';
...
export class AppComponent {
public version: string = version;
}
Når du bruker denne koden med Angular 12+ vil du sannsynligvis få: Error: Should not import the named export 'version' (imported as 'version') from default-exporting module (only default export is available soon). I så fall vennligst bruk følgende kode:
Trinn for Angular 12+
- I din
/tsconfig.json(noen ganger også nødvendig i/src/tsconfig.app.json) aktiver følgende alternativer (krever omstart av webpack dev server etterpå):
"compilerOptions": {
...
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
...
- Så i komponenten din, for eksempel
/src/app/app.component.ts, bruk versjonsinformasjonen slik:
import packageJson from '../../package.json';
...
export class AppComponent {
public version: string = packageJson.version;
}
Det er også mulig å gjøre trinn 2 i filen din environment.ts, slik at versjonsinformasjonen blir tilgjengelig derfra.
Takk @Ionaru og @MarcoRinck for hjelpen.
Denne løsningen bør ikke inkludere innholdet i package.json ved produksjonsbygg - bare versjonsnummeret (testet med Angular 8 og 13).
For å være sikker, vennligst sjekk også den genererte main.#hash#.js-filen din!
Svar #2
Hvis du bruker webpack eller angular-cli (som bruker webpack), kan du bare kreve package.json i komponenten din og vise den egenskapen.
const { version: appVersion } = require('../../package.json')
// this loads package.json
// then you destructure that object and take out the 'version' property from it
// and finally with ': appVersion' you rename it to const appVersion
Og så har du komponenten din
@Component({
selector: 'stack-overflow',
templateUrl: './stack-overflow.component.html'
})
export class StackOverflowComponent {
public appVersion
constructor() {
this.appVersion = appVersion
}
}
Svar #3
Ved å bruke tsconfig-alternativet --resolveJsonModule kan du importere json-filer i TypeScript.
I filen environment.ts:
import { version } from '../../package.json';
export const environment = {
VERSION: version,
};
Du kan nå bruke environment.VERSION i applikasjonen din.
Svar #4
Å prøve DyslexicDcuks svar resulterte i kan ikke finne navnet require
Deretter hjalp det meg å løse dette ved å lese seksjonen 'Optional Module Loading and Other Advanced Loading Scenarios' på https://www.typescriptlang.org/docs/handbook/modules.html. (Nevnt av Gary her https://stackoverflow.com/a/41767479/7047595)
Bruk utsagnet nedenfor for å kreve package.json.
declare function require(moduleName: string): any;
const {version : appVersion} = require('path-to-package.json');
Svar #5
Det er en god idé å deklarere version som en miljøvariabel, slik at du kan bruke den overalt i prosjektet ditt. (spesielt i tilfelle du laster filer som skal cachebaseres på versjon f.eks. yourCustomjsonFile.json?version=1.0.0)
For å forhindre sikkerhetsproblemer (som @ZetaPR nevnte) kan vi bruke denne tilnærmingen (på @sgwatgit 's kommentar)
Kort sagt: vi oppretter en yourProjectPath\PreBuild.js fil. Slik:
const path = require('path');
const colors = require('colors/safe');
const fs = require('fs');
const dada = require.resolve('./package.json');
const appVersion = require('./package.json').version;
console.log(colors.cyan('\nRunning pre-build tasks'));
const versionFilePath = path.join(__dirname + '/src/environments/version.ts');
const src = `export const version = '${appVersion}';
`;
console.log(colors.green(`Dada ${colors.yellow(dada)}`));
// ensure version module pulls value from package.json
fs.writeFile(versionFilePath, src, { flag: 'w' }, function (err) {
if (err) {
return console.log(colors.red(err));
}
console.log(colors.green(`Updating application version
${colors.yellow(appVersion)}`));
console.log(`${colors.green('Writing version module to
')}${colors.yellow(versionFilePath)}\n`);
});
Ovenstående utdrag vil opprette en ny fil /src/environments/version.ts som inneholder en konstant kalt version og setter den til verdien hentet fra package.json-filen.
For å kjøre innholdet i PreBuild.json ved bygging, legger vi denne filen inn i Package.json -> "scripts": { ... }"-delen som følger. Så kan vi kjøre prosjektet ved å bruke denne koden: npm start:
{
"name": "YourProject",
"version": "1.0.0",
"license": "...",
"scripts": {
"ng": "...",
"start": "node PreBuild.js & ng serve",
},...
}
Nå kan vi enkelt importere version og bruke den hvor som helst:
import { version } from '../../../../environments/version';
...
export class MyComponent{
...
public versionUseCase: string = version;
}
Svar #6
Typescript
import { Component, OnInit } from '@angular/core';
declare var require: any;
@Component({
selector: 'app-version',
templateUrl: './version.component.html',
styleUrls: ['./version.component.scss']
})
export class VersionComponent implements OnInit {
version: string = require( '../../../../package.json').version;
constructor() {}
ngOnInit() {
}
}
HTML
<div class="row">
<p class="version">{{'general.version' | translate}}: {{version}}</p>
</div>
Svar #7
Enkleste løsning for Angular CLI-brukere.
Legg til declare module '*.json'; i src/typings.d.ts
Og så på src/environments/environment.ts:
import * as npm from '../../package.json';
export const environment = {
version: npm.version
};
Ferdig :)
Svar #8
I Angular 12 import { version } from '../../package.json'; gir en feil:
./src/environments/environment.ts:10:13-20 - Feil: Skal ikke importere den navngitte eksporten 'version' (importert som 'version') fra modul som eksporterer default (bare standardeksport vil snart være tilgjengelig)
For å fortsette å importere versjonen uten sikkerhetsimplikasjonene ved å bringe hele innholdet i package.json inn i bygget, kan du gjøre:
export const environment = {
...
VERSION: require('../../package.json').version,
};
Fra https://github.com/angular/angular-cli/issues/3770#issuecomment-269822722
Hvis du støter på en Cannot find name 'require'-feil, se https://stackoverflow.com/a/43129815/418819 og https://stackoverflow.com/a/54004979/418819
