如何在Angular2中显示应用程序版本?

Zby*_*nek 104 version package.json angular

如何在angular2应用程序中显示应用程序版本?该版本应从package.json文件中获取

{
  "name": "angular-app",
  "version": "0.0.1",
  ...
}
Run Code Online (Sandbox Code Playgroud)

在角1.x,我有这个HTML:

<p><%=version %></p>
Run Code Online (Sandbox Code Playgroud)

在angular2中,这不会呈现为版本号,而是按原样(<%=version %>而不是0.0.1)打印.

rad*_*eit 181

如果您正在使用Angular CLI并希望在环境变量中拥有该版本,则可以在您的环境中编写.

    "compilerOptions": {
      ...
      "resolveJsonModule": true
      ...
Run Code Online (Sandbox Code Playgroud)

在您的组件中:

    import { version } from '../../package.json';
    ...
    export class AppComponent {
      public version: string = version;
    }
Run Code Online (Sandbox Code Playgroud)

如果你得到了

找不到名字'要求'

错误,请更改您的/tsconfig.json(不在/src/tsconfig.app.json根文件夹中)以包含节点类型:

    "compilerOptions": {
      ...
      "resolveJsonModule": true
      ...
Run Code Online (Sandbox Code Playgroud)

您还需要安装@ types/node

    import { version } from '../../package.json';
    ...
    export class AppComponent {
      public version: string = version;
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道,这适用于角5和aot编译 (14认同)
  • 由于 webpack 5,角度 12 损坏 -_- (8认同)
  • @sleepwalker 显示角度版本而不是 package.json 中的版本 (7认同)
  • 这个答案不应该被接受,因为它会引发安全问题,因为您现在将 package.json 包含在浏览器包中,互联网上的每个人现在都可以读取您的内部项目配置。请使用@Ionarus 的解决方案对其进行编辑 (5认同)
  • Angular 9 已确认 (4认同)
  • Angular 10 已确认 (4认同)
  • 重要说明:**重新启动**您的服务器(执行ng服务或npm重新启动)才能生效! (3认同)
  • @MarcoRinck:感谢指出这一点。我可以重现这个问题。不知道它是否是由于过去对答案的编辑而出现的,但为了确保没有人再使用旧的解决方案,我编辑了答案并删除了其中有问题的 require() 调用。 (3认同)
  • 我不建议将 Node.js 类型添加到您的 Angular 应用程序中,这可能会对 Node.js 和浏览器具有不同实现(例如计时器和间隔)的函数产生意想不到的副作用。也可以使用普通的 es6 语法导入 json 文件,请参阅我的答案。 (2认同)
  • 我建议检查@lonaru的答案 (2认同)
  • 角度8确认 (2认同)
  • 在 Angular 9 下不起作用:`文件'[...]/package.json'不在'rootDir''[...]/src'下。'rootDir' 预计包含所有源文件。` (2认同)
  • Angular 11 已确认 (2认同)
  • 其他人从编译器得到这个:不应该从默认导出模块导入命名的导出“版本”(作为“版本”导入)(很快只有默认导出可用)? (2认同)
  • 精彩的!适用于 Angular 13.2.2。 (2认同)

Dys*_*cuk 46

如果您使用的是webpack或angular-cli(使用webpack),您只需要在组件中使用package.json并显示该prop.

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
Run Code Online (Sandbox Code Playgroud)

然后你有你的组件

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

  constructor() {
    this.appVersion = appVersion
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,如果有人在应用您的解决方案时遇到错误"无法找到名称要求",则需要在tsconfig.app.ts文件中的"types"属性中添加"node"类型.<<"类型":["节点"] >>.在Angular v4中测试过 (7认同)
  • 从安全角度来看,具有版本号的@DyslexicDcuk库是敏感数据. (6认同)
  • 尽管这篇文章有一段时间我必须指出,这可能会在生产版本中暴露一些构建和开发信息,这对生产环境可能有害. (5认同)
  • 而且在AOT中它不起作用(尽管像往常一样) (2认同)

Vam*_*msi 19

尝试DyslexicDcuk的答案导致了 cannot find name require

然后,阅读https://www.typescriptlang.org/docs/handbook/modules.html中的 "可选模块加载和其他高级加载方案"部分帮助我解决了这个问题.(Gary在这里提到/sf/answers/2923723561/)

使用以下声明来要求package.json.

declare function require(moduleName: string): any;

const {version : appVersion} = require('path-to-package.json');
Run Code Online (Sandbox Code Playgroud)


Ion*_*aru 14

使用tsconfig选项,--resolveJsonModule您可以在Typescript中导入json文件。

在environment.ts文件中:

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

export const environment = {
    VERSION: version,
};
Run Code Online (Sandbox Code Playgroud)

您现在可以environment.VERSION在您的应用程序中使用。

  • 使用此功能时,请确保仅公开部署 **生产** 构建(`ng build --prod`);“常规”构建 **do** 包含整个 `package.json` (已使用 11.0.5 验证) (4认同)
  • @tif 应该没有安全隐患,因为 package.json 没有完全导入。版本是生产版本中唯一结束的东西。 (3认同)
  • @lonaru 导入 package.json 文件时是否存在任何安全隐患。我想知道这是否以某种方式暴露了 package.json 的内容? (2认同)

Ste*_*eve 11

在 Angular 12 中import { version } from '../../package.json';出现错误:

./src/environments/environment.ts:10:13-20 - 错误:不应从默认导出模块导入命名导出“版本”(作为“版本”导入)(很快将仅提供默认导出)

要继续导入版本而不会将 package.json 的全部内容引入构建中而产生安全影响,您可以执行以下操作:

export const environment = {
  ...
  VERSION: require('../../package.json').version,
};
Run Code Online (Sandbox Code Playgroud)

来自https://github.com/angular/angular-cli/issues/3770#issuecomment-269822722

如果遇到Cannot find name 'require'错误,请参阅/sf/answers/3019087081//sf/answers/3780348561/


vrb*_*bsm 8

打字稿

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() {

  }
}
Run Code Online (Sandbox Code Playgroud)

HTML

<div class="row">
    <p class="version">{{'general.version' | translate}}: {{version}}</p>
</div>
Run Code Online (Sandbox Code Playgroud)


小智 7

针对cli用户的简化列表解决方案。

添加declare module '*.json';src/typings.d.ts

然后src/environments/environment.ts

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

export const environment = {
  version: npm.version
};
Run Code Online (Sandbox Code Playgroud)

完成:)


min*_*eek 6

这个答案特定于 Angular 12+。它使用 Webpack 5。

根据webpack5文档

新规范不支持这一点,您将收到警告。代替:

import { version } from './your-path/package.json';
console.log(version);
Run Code Online (Sandbox Code Playgroud)

使用:

import pkg from './your-path/package.json';
console.log(pkg.version);
Run Code Online (Sandbox Code Playgroud)

此外,您还必须在tsconfig.json中提供

"compilerOptions": {
  ...
  "allowSyntheticDefaultImports": true,
  "resolveJsonModule": true,
  ...
Run Code Online (Sandbox Code Playgroud)


Rza*_*sar 5

声明version为环境变量是个好主意所以你可以在项目的任何地方使用它.(特别是在加载基于版本缓存的文件的情况下e.g. yourCustomjsonFile.json?version=1.0.0)
为了防止出现安全问题(如@ZetaPR所述),我们可以使用这种方法(在@sgwatgit的注释中)
简而言之:我们创建一个yourProjectPath\PreBuild.js文件.像这样:

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`);
});
Run Code Online (Sandbox Code Playgroud)

上面的代码片段将创建一个新文件/src/environments/version.ts,其中包含一个名为的常量version,并通过package.json文件中的提取值进行设置.

为了运行PreBuild.json构建的内容,我们将此文件添加到Package.json- > "scripts": { ... }"部分,如下所示.所以我们可以使用以下代码运行项目npm start:

{
  "name": "YourProject",
  "version": "1.0.0",
  "license": "...",
  "scripts": {
    "ng": "...",
    "start": "node PreBuild.js & ng serve",
  },...
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以简单地导入版本并在任何我们想要的地方使用它:

import { version } from '../../../../environments/version';
...
export class MyComponent{
  ...
  public versionUseCase: string = version;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我尝试以一种不同的方式解决这个问题,同时考虑到易用性和可维护性。

我使用 bash 脚本来更改整个应用程序的版本。以下脚本将询问您所需的版本号,并且该版本号适用于整个应用程序。

#!/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;
Run Code Online (Sandbox Code Playgroud)

我已将此脚本保存在项目根目录中名为version-manager.sh的文件中,并且在我的 package.json 文件中,我还创建了一个脚本以在需要修改版本时运行它。

"change-version": "bash ./version-manager.sh"
Run Code Online (Sandbox Code Playgroud)

最后,我可以通过执行来更改版本

npm run change-version 
Run Code Online (Sandbox Code Playgroud)

此命令将更改 index.html 模板以及 package.json 文件中的版本。以下是从我现有的应用程序中截取的一些屏幕截图。

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述


Joh*_*hnA 5

这个https://github.com/angular/angular-cli/issues/5190有一个有趣的解决方案,使用 shell 文件生成 version.ts 文件。@sanjeev 在这个论坛上有类似的解决方案。

该解决方案使用 Node、javascript 和 fs 模块来实现相同的目的。肯定可以在linux下工作。在 Windows 中应该可以正常工作,因为 Node/fs 是跨平台的......对吗?

  1. 在 package.json 添加一行:

    {
      "version": "0.0.1",
      ... 
      "scripts": {
        "version": "node gen_version.js $npm_package_version",
         ...
      },
    ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建 gen_version.js (注意:它不是打字稿)

    var fs = require('fs');
    
    // arg[0]: node path
    // arg[1]: this script's path
    // arg[2]: 1st arg on command line
    console.log('current version: ' + process.argv[2])
    
    path = 'src/environments/version.ts'
    
    script = 'export class Constants {'
    script += '  static readonly version = \'' + process.argv[2] + '\''
    script += '}'
    
    fs.writeFile(path, script, function (err, file) {
      if (err) throw err;
      console.log('file saved:', path);
    });
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从 npm 运行它:

    npm run version
    
    > omnitool@0.0.1 version ...
    > node gen_version.js $npm_package_version
    
    current version: 0.0.1
    file saved: src/environments/version.ts
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从您的应用程序使用:

    import {Constants} from "../environments/version"
    ...
    console.log('Version:', Constants.version)
    
    Run Code Online (Sandbox Code Playgroud)


Sam*_*ath 5

Angular 13+ / 离子

这对我有用:

将其放在devprod环境文件下。

环境.ts

declare const require: any;

export const environment = {
 appVersion: require('../../package.json').version,
};
Run Code Online (Sandbox Code Playgroud)

任何组件的示例用法:

import { environment } from 'src/environments/environment';

     constructor() {
        console.log(environment.appVersion);
      }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。在最新的 ionic 7 / Angular 16+ 中表现得非常出色 (2认同)