我找到了这个问答。
我尝试使用以下方法从 package.json 获取版本:
import { version } from './package.json';
但结果是:
package.json' has unsupported extension. The only supported extensions are '.ts',
'.tsx', '.d.ts'.
我喜欢在不需要 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
,这样它的更改就不会乱丢您的更改历史记录!
如果你在一个普通的JS环境中,为什么不简单地使用
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
的 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
它会同步版本号、构建和启动
还有一种方法可以做到这一点,非常类似于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}`);
为了避免包含整个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
文件夹中的文件。