如何从 Typescript 中的 package.json 获取版本?

How to get the version from the package.json in Typescript?

我找到了this Q&A

我尝试从 package.json 获取版本,使用:

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

但结果是:

package.json' has unsupported extension. The only supported extensions are '.ts',
'.tsx', '.d.ts'.

如果你在commonJS环境中,为什么不直接使用

const pj = require('./package.json')
console.log(pj.version)

编辑

因为你好像用的是webpack,所以加上合适的loader就可以了

   module: {
    loaders: [
        ...
        {test: /\.json$/, loader: 'json-loader'},
        ....

这显然需要使用 npm install

安装

有多种方法,但我发现最有用的方法是使用 ng-node-environment 包。这会生成一个文件 ./src/environments/base.ts,您可以在打字稿导入中直接引用该文件。它包含一个名为 sharedEnvironment 的常量对象。您的导入行如下所示:import sharedEnvironment from './base';

当您执行该命令时,它会查找所有以 'NG_' 开头的环境变量,并将它们作为属性添加到 sharedEnvironment

因此,我创建了一个 package.json 脚本来设置变量并执行 ng-node-environment。为了兼容性,我使用 cross-env 使其与平台无关(适用于 windows 和 *nix)

这是我的 package.json 脚本:-

"scripts": {
    "version": "cross-env-shell NG_APPVERSION=$npm_package_version node ./node_modules/ng-node-environment/index.js",
    "another" : "echo hello world"
}

然后运行:npm run version提取版本放入./src/environments/base.ts

我现在可以访问 属性 appversion 并在我的 environment.ts 中使用它。

注意:如果我调用了变量NG_APP_Version,属性 名称将被驼峰命名为appVersion

import sharedEnvironment from './base';

export const environment = {
  production: false,
  logLevel: LogLevel.Error,
  version : sharedEnvironment.appversion,
};

当然,这样我可以通过在执行 ng-node-environment 之前设置其他变量来从 package.json 添加其他值,或者可以通过创建名为 NG_<Something> 的变量来提前添加更多属性例如:NG_GitBranchNG_ComputerNameNG_CliVersion

在 Angular 中开发并确保它始终同步时,我使用启动脚本开始开发:-

"scripts": {
    "version": "cross-env-shell NG_APPVERSION=$npm_package_version node ./node_modules/ng-node-environment/index.js",
    "start": "npm run version && ng serve"
}

所以我输入:npm start 它会同步版本号、构建和启动

我喜欢在不需要 webpack 或任何其他依赖项的情况下执行此操作的方法是将 prebuild 脚本添加到 package.json,该脚本将版本写入可导入到其他地方的 TypeScript 源文件。

  "scripts": {
    "prebuild": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
    "build": "tsc",
  }

这会使用以下代码运行 node.js:

'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'

并将输出重定向到 src/version.ts

这导致 src/version.ts 包含:

export const LIB_VERSION = "1.0.0";

然后您可以简单地从其他文件中导入并使用它:

import { LIB_VERSION } from './version';

您可能希望从源代码管理中排除 src/version.ts,这样它的更改就不会乱扔您的更改历史记录!

为了避免包含整个package.json 文件,我通常会创建一个名为buildData.json 的模板并将其放在templates 文件夹中。我给它以下内容。

{
    "version": [<%= options.version %>]
}

然后在nuxt.config.js中,将模板添加到构建部分:

  build: {
    templates: [
      {
        src: "./templates/buildData.json",
        dst: "../buildData.json",
        options: {
          version: require("./package.json").version
        }
      }
    ]
  }

这将生成一个 buildData.json 文件,其中 仅包含 版本号。完整的 package.json 文件在构建期间是只读的,不包含在发送到浏览器的文件中。

最后,在需要版本号的地方添加这段代码:

const version = require("@/buildData.json").version;

确保您提供给 require 语句的文件是生成的 buildData.json 而不是 templates 文件夹中的文件。