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

当前回答

使用ES6模块,您可以执行以下操作:

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

其他回答

只是添加一个答案,因为我来到这个问题是为了找到在我的web应用程序中包含package.json版本的最佳方法。

我知道这个问题是针对Node.js的,但是,如果你使用Webpack捆绑你的应用程序,提醒你,推荐的方法是使用DefinePlugin在配置中声明一个全局版本并引用它。所以你可以在webpack.config.json中

const pkg = require('../../package.json');

...

plugins : [
    new webpack.DefinePlugin({
      AppVersion: JSON.stringify(pkg.version),
...

然后AppVersion现在是一个可供您使用的全局版本。还要确保在.eslintrc中通过globals属性忽略此项

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

$ genversion lib/version.js

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

NPM内衬:

从npm v7.20.0开始:

npm pkg获取版本

在npm v7.20.0之前:

npm-s运行env echo“$npm_package_version”

注意,这两种方法的输出略有不同:前者输出用引号括起来的版本号(即“1.0.0”),后者不输出(即1.0.0)。

在Unix中删除引号的一个解决方案是使用xargs

npm pkg get version | xargs echo

我发现下面的代码片段最适合我。因为它使用require来加载package.json,所以无论当前的工作目录如何,它都能正常工作。

var pjson = require('./package.json');
console.log(pjson.version);

@病原体:

使用Browserify执行此操作会带来安全问题。注意不要将package.json暴露给客户端,因为这意味着所有的依赖版本号、构建和测试命令等都会发送给客户端。如果您在同一个项目中构建服务器和客户端,那么也会暴露服务器端版本号。攻击者可以使用这些特定数据来更好地适应服务器上的攻击。

为什么不使用require resolve。。。

const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)

使用此方法,所有子路径都适用:)