有没有方法在nodejs应用程序中获取package.json中设置的版本?我想要这样的东西

var port = process.env.PORT || 3000
app.listen port
console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, app.VERSION

当前回答

我正在使用create-react应用程序,在执行react应用程序时,我没有process.env.npm_package_version可用。

我不想在我的客户端代码中引用package.json(因为向客户端暴露了危险的信息,比如包版本),也不想安装另一个依赖项(genversion)。

我发现我可以通过在package.json中使用$npm_package_version来引用package.jsn中的版本:

"scripts": {
    "my_build_script": "REACT_APP_VERSION=$npm_package_version react-scripts start"
}

现在,版本始终遵循package.json中的版本。

其他回答

以下是如何读取package.json的版本:

fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version

编辑:哇,这个答案最初来自2012年!现在有几个更好的答案。可能最干净的是:

const { version } = require('./package.json');

选项1

最佳实践是使用npm环境变量从package.json进行版本转换。

process.env.npm_package_version

更多信息:https://docs.npmjs.com/using-npm/config.html

只有当您使用NPM命令启动服务时,这才有效。

快速信息:您可以使用process.env.npm_package_[keyname]读取pacakge.json中的任何值

选项2

使用在环境变量中设置版本https://www.npmjs.com/package/dotenv作为.env文件,并将其作为process.env.version读取

一个安全的选项是添加一个npm脚本,该脚本生成一个单独的版本文件:

"scripts": {
    "build": "yarn version:output && blitz build",
    "version:output": "echo 'export const Version = { version: \"'$npm_package_version.$(date +%s)'\" }' > version.js"
  }

这将输出包含以下内容的version.js:

export const Version = { version: "1.0.1.1622225484" }

如果使用rollup,可以使用rollup插件替换插件来添加版本,而无需向客户端公开package.json。

// rollup.config.js

import pkg from './package.json';
import { terser } from "rollup-plugin-terser";
import resolve from 'rollup-plugin-node-resolve';
import commonJS from 'rollup-plugin-commonjs'
import replace from 'rollup-plugin-replace';

export default {
  plugins: [
    replace({
      exclude: 'node_modules/**',
      'MY_PACKAGE_JSON_VERSION': pkg.version, // will replace 'MY_PACKAGE_JSON_VERSION' with package.json version throughout source code
    }),
  ]
};

然后,在源代码中,您可以在任何需要package.json版本的地方使用字符串“MY_package_json_version”。

// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js

您可以使用ES6导入package.json以检索版本号并在控制台上输出版本。

import {name as app_name, version as app_version}  from './path/to/package.json';

console.log(`App ---- ${app_name}\nVersion ---- ${app_version}`);