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

问题描述 投票:0回答:5

我找到了这个问答

我尝试使用以下方法从 package.json 获取版本:

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

但结果是:

package.json' has unsupported extension. The only supported extensions are '.ts',
'.tsx', '.d.ts'.
typescript versioning
5个回答
43
投票

我喜欢在不需要 webpack 或任何其他依赖项的情况下执行此操作的方式是向

prebuild
添加一个
package.json
脚本,该脚本将版本写入可以导入到其他地方的 TypeScript 源文件。

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

这将运行带有

-p/--print
标志的 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
,这样它的更改就不会乱丢您的更改历史记录!


11
投票

如果你在一个普通的JS环境中,为什么不简单地使用

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

编辑

既然你好像用的是webpack,那就加上合适的loader

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

显然您需要使用

npm install

安装

2
投票

有多种方法,但我发现最有用的一种是使用 ng-node-environment 包。这会生成一个文件

./src/environments/base.ts
,您可以在打字稿导入中直接引用该文件。它包含一个名为
sharedEnvironment
的 const 对象。您的导入行如下所示:
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,
};

当然,这样我可以通过在执行

package.json
之前设置其他变量来从
ng-node-environment
添加其他值,或者可以通过创建名为
NG_<Something>
的变量来提前添加更多属性,例如:
NG_GitBranch
NG_ComputerName
NG_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
它会同步版本号、构建和启动


0
投票

还有一种方法可以做到这一点,非常类似于Tim的方法.

我需要一些额外的字段,比如名称和描述,用

node -p
组装起来会很乏味。

如果你想要依赖,你可以获得一些简洁和灵活性:

jq
添加到您的项目中:

npm install node-jq -D

然后在您的

package.json
中,您可以添加一行来拉取您想要的任何字段:

  "scripts": {
    ...
    "prebuild": "jq '{version, name, description}' package.json > ./src/pkgInfo.json",
    ...
  }

然后在您项目的其他地方,您可以访问您的精选字段:

import pkgInfo from './pkgInfo.json' assert { type: 'json' };

console.log(`I am ${pkgInfo.name} v${pkgInfo.version}, some say I ${pkgInfo.description}`);


-1
投票

为了避免包含整个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
文件夹中的文件。

© www.soinside.com 2019 - 2024. All rights reserved.