有没有方法在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

当前回答

我编写了一段有用的代码来获取父模块的package.json

function loadParentPackageJson() {
    if (!module.parent || !module.parent.filename) return null
    let dir = path.dirname(module.parent.filename)
    let maxDepth = 5
    let packageJson = null
    while (maxDepth > 0) {
        const packageJsonPath = `${dir}/package.json`
        const exists = existsSync(packageJsonPath)
        if (exists) {
            packageJson = require(packageJsonPath)
            break
        }
        dir = path.resolve(dir, '../')
        maxDepth--
    }
    return packageJson
}

其他回答

对于那些寻找同样适用于服务器端的安全客户端解决方案的人来说,有genversion。它是一个命令行工具,从最近的package.json中读取版本,并生成一个可导入的CommonJS模块文件,用于导出版本。免责声明:我是维护者。

$ genversion lib/version.js

我承认客户端安全性不是OP的主要意图,但正如Mark Wallace和aug在回答中所讨论的,这是高度相关的,也是我发现此问答的原因。

我使用查找同步来执行此操作:

var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1' 

我发现的最精简的方法:

const { version } = JSON.parse(fs.readFileSync('./package.json'))

如果使用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

我正在使用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中的版本。