如何从 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_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
它会同步版本号、构建和启动
我喜欢在不需要 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
文件夹中的文件。
我找到了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_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
它会同步版本号、构建和启动
我喜欢在不需要 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
文件夹中的文件。