Como exibir a versão do aplicativo em Angular?

146

Como faço para exibir a versão do aplicativo no aplicativo angular? a versão deve ser retirada do package.jsonarquivo

{
  "name": "angular-app",
  "version": "0.0.1",
  ...
}

No angular 1.x, tenho este html:

<p><%=version %></p>

Em angular, isso não é renderizado como número da versão, mas apenas impresso como é (em <%=version %>vez de 0.0.1).

Zbynek
fonte
você precisa de algum plugin gulp ou grunt, se você tiver um sistema de compilação. atualmente não há nenhum mecanismo no AFIK no Angular para isso
Angular University
Eu uso o programa no aplicativo typescript, uso npm startpara executar a compilação e SystemJSdefinir a configuração. existe uma maneira de definir a versão usando qualquer um desses?
precisa

Respostas:

255

Se você deseja usar / mostrar o número da versão no seu aplicativo angular, faça o seguinte:

Pré-requisitos:

  • Estrutura angular de arquivo e pasta criada via Angular CLI

  • TypeScript 2.9 ou posterior! (Suportado do Angular 6.1 para cima)

Passos:

  1. Na sua /tsconfig.json(às vezes também necessária /src/tsconfig.app.json), ative a opção resolveJsonModule (reinicialização do servidor de webpack dev necessária posteriormente):
    "compilerOptions": {
      ...
      "resolveJsonModule": true
      ...
  1. Em seu componente, por exemplo, /src/app/app.component.tsuse as informações da versão:
    import { version } from '../../package.json';
    ...
    export class AppComponent {
      public version: string = version;
    }

Também é possível executar a etapa 2 no arquivo environment.ts, tornando as informações da versão acessíveis a partir daí.

Thx @Ionaru e @MarcoRinck por ajudarem.

Esta solução não incluirá o conteúdo do package.json, apenas o número da versão.
Testado com Angular8 / Nó10 / TypeScript3.4.3.

Atualize seus aplicativos para usar esta causa da solução, dependendo do conteúdo do seu package.json, a solução original pode implicar problemas de segurança.

radomeit
fonte
18
isso funciona com compilação angular 5 e aot se alguém queria saber
Nikola.Lukovic
5
Nota importante: reinicie o servidor (o serviço serve ou o npm é iniciado novamente) para que isso entre em vigor!
user1884155
2
@MarcoRinck: Thx por apontar isso. Eu poderia reproduzir esse problema. Não sei se ocorreu devido a uma edição da resposta no passado, mas para garantir que ninguém mais use a solução antiga, editei a resposta e removi a chamada problemática require () da mesma.
Radomeit 30/05/19
3
angular 8 confirmada
vuhung3990
2
Angular 9 confirmado
Mike de Klerk
56

Se você estiver usando o webpack ou angular-cli (que usa o webpack), basta solicitar o package.json no seu componente e exibir esse suporte.

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

E então você tem seu componente

@Component({
  selector: 'stack-overflow',
  templateUrl: './stack-overflow.component.html'
})
export class StackOverflowComponent {
  public appVersion

  constructor() {
    this.appVersion = appVersion
  }
}
DyslexicDcuk
fonte
8
Vale ressaltar que se alguém encontrar o erro "Não é possível encontrar o nome requerido" após aplicar sua solução, precisará adicionar o tipo "node" dentro da propriedade "types" no arquivo tsconfig.app.ts. << "tipos": ["nó"] >>. Testado em Angular v4
Tomasz Czechowski
@baio - Eu tenho esse trecho de código em execução nos meus aplicativos de produção há cerca de um ano (executando AOT em produção). Posso ajudá-lo a depurar seu problema de alguma forma?
DyslexicDcuk
5
Apesar deste post ter algum tempo, devo salientar que isso poderia expor algumas informações de compilação e desenvolvimento em compilações de produção e que é potencialmente prejudicial para um ambiente de produção.
ZetaPR 25/01
@ZetaPR exatamente não recomendado!
Jimmy Kane
7
As bibliotecas @DyslexicDcuk com números de versão são dados confidenciais do ponto de vista de segurança.
23418 Rafiek
25

Usando a opção tsconfig, --resolveJsonModulevocê pode importar arquivos json no Typescript.

No arquivo environment.ts:

import { version } from '../../package.json';

export const environment = {
    VERSION: version,
};

Agora você pode usar environment.VERSIONno seu aplicativo.

Ionaru
fonte
1
@lonaru Existem implicações de segurança ao importar o arquivo package.json. Gostaria de saber se isso de alguma forma expõe o conteúdo do package.json?
tif
1
@tif Não deve haver implicações de segurança porque o package.json não é totalmente importado. A versão é a única coisa que acaba na construção da produção.
Ionaru 04/04/19
19

Tentar a resposta de DyslexicDcuk resultou em cannot find name require

Em seguida, a seção 'Carregamento opcional do módulo e outros cenários de carregamento avançado' em https://www.typescriptlang.org/docs/handbook/modules.html me ajudou a resolver isso. (Mencionado por Gary aqui https://stackoverflow.com/a/41767479/7047595 )

Use a declaração abaixo para exigir o package.json.

declare function require(moduleName: string): any;

const {version : appVersion} = require('path-to-package.json');
Vamsi
fonte
8

Solução simplista para usuários de CLI angulares.

Adicionar declare module '*.json';emsrc/typings.d.ts

E depois src/environments/environment.ts:

import * as npm from '../../package.json';

export const environment = {
  version: npm.version
};

Feito :)

박관영
fonte
1
Pode ser necessário adicionar "allowSyntheticDefaultImports": trueao seu tsconfig.json, dependendo da sua versão Angular.
bjornalm
6

É uma boa ideia declarar versioncomo variável de ambiente Para que você possa usá-lo em qualquer lugar do seu projeto. (especialmente no caso de carregar arquivos para serem armazenados em cache com base na versão e.g. yourCustomjsonFile.json?version=1.0.0)
Para evitar problemas de segurança (como o @ZetaPR mencionado) , podemos usar esta abordagem (no comentário de @sgwatgit)
Resumindo: criamos um yourProjectPath \ PreBuild.js Arquivo. Como isso:

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, { flat: '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`);
});

O snippet acima criará um novo arquivo /src/environments/version.tsque contém uma constante nomeada versione a definirá pelo valor extraído do package.jsonarquivo.

Para executar o conteúdo do PreBuild.jsonbuild, adicionamos este arquivo na seção Package.json-> "scripts": { ... }"como a seguir. Então, podemos executar o projeto usando este código npm start:

{
  "name": "YourProject",
  "version": "1.0.0",
  "license": "...",
  "scripts": {
    "ng": "...",
    "start": "node PreBuild.js & ng serve",
  },...
}

Agora podemos simplesmente importar a versão e usá-la onde quisermos:

import { version } from '../../../../environments/version';
...
export class MyComponent{
  ...
  public versionUseCase: string = version;
}
Rzassar
fonte
5

Texto datilografado

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>
vrbsm
fonte
4

Eu não acho que "Porcentagem de suporte de ângulo" tenha algo a ver com angular1. Provavelmente, uma interface para outra API que você não percebe está sendo usada em seu projeto anterior.

Sua solução mais fácil: basta listar o número da versão manualmente em seu arquivo HTML ou armazená-lo em uma variável global se você o estiver usando em vários locais:

<script>
  var myAppVersionNumber = "0.0.1";
</script>
...
<body>
  <p>My App's Version is: {{myAppVersionNumber}}</p>
</body>

Sua solução mais difícil: execute uma etapa de automação de construção que extrai o número da versão do arquivo package.json e, em seguida, reescreve o arquivo index.html (ou arquivo js / ts) para incluir o valor:

  • Poderia simplesmente importar ou exigir o arquivo package.json, se você estiver trabalhando em um ambiente que o suporte:

    var version = require("../package.json").version;

  • Isso também pode ser feito em um script bash que lê o package.json e edita outro arquivo.

  • Você pode adicionar um script NPM ou modificar seu script inicial para usar módulos adicionais para ler e gravar arquivos.
  • Você pode adicionar grunhido ou gole ao seu pipeline e depois usar módulos adicionais para ler ou gravar arquivos.
Cooper Buckingham
fonte
Sem a dica a ser usada, essa é realmente a melhor resposta. Porque não haverá informações desnecessárias / confidenciais na construção da produção.
23418 Rafiek
<% %>geralmente indica uma linguagem .NET como C #
danwellman
2

Tentei resolver isso de uma maneira um pouco diferente, considerando também a facilidade de conveniência e manutenção.

Eu usei o script bash para alterar a versão em todo o aplicativo. O script a seguir solicitará o número da versão desejada e o mesmo será aplicado em todo o aplicativo.

#!/bin/bash
set -e

# This script will be a single source of truth for changing versions in the whole app
# Right now its only changing the version in the template (e.g index.html), but we can manage
# versions in other files such as CHANGELOG etc.

PROJECT_DIR=$(pwd)
TEMPLATE_FILE="$PROJECT_DIR/src/index.html"
PACKAGE_FILE="$PROJECT_DIR/package.json"

echo ">> Change Version to"
read -p '>> Version: ' VERSION

echo
echo "  #### Changing version number to $VERSION  ####  "
echo

#change in template file (ideally footer)
sed -i '' -E "s/<p>(.*)<\/p>/<p>App version: $VERSION<\/p>/" $TEMPLATE_FILE
#change in package.json
sed -i '' -E "s/\"version\"\:(.*)/\"version\"\: \"$VERSION\",/" $PACKAGE_FILE


echo; echo "*** Mission Accomplished! ***"; echo;

Salvei esse script em um arquivo chamado version-manager.sh na raiz do projeto e, no meu arquivo package.json, também criei um script para executá-lo quando for necessário modificar a versão.

"change-version": "bash ./version-manager.sh"

Finalmente, eu posso mudar a versão executando

npm run change-version 

Este comando alterará a versão no modelo index.html e também no arquivo package.json. A seguir, foram apresentadas algumas capturas de tela do meu aplicativo existente.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

sanjeev
fonte
0

Você pode ler o package.json como qualquer outro arquivo, com o http.get assim:

import {Component, OnInit} from 'angular2/core';
import {Http} from 'angular2/http';

@Component({
    selector: 'version-selector',
    template: '<div>Version: {{version}}</div>'
})

export class VersionComponent implements OnInit {

    private version: string;

    constructor(private http: Http) { }

    ngOnInit() {
        this.http.get('./package.json')
            .map(res => res.json())
            .subscribe(data => this.version = data.version);
    }
}
Presari
fonte