有没有一种方法从nodejs代码中的package.json获取版本?

有没有办法让一个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 

我发现下面的代码片段最适合我。 由于它使用'require'来加载package.json,所以它不pipe当前的工作目录。

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

警告,@Pathogen礼貌:

这样做与browserify有安全隐患。
注意不要将你的package.json暴露给客户端,因为这意味着所有的依赖版本号,构build和testing命令等等都被发送到客户端。
如果您在同一个项目中构build服务器和客户端,则也会暴露您的服务器端版本号。
攻击者可以使用这些特定的数据来更好地适应您的服务器的攻击。

如果您的应用程序是通过“npm start”启动的,则可以简单地使用:

 process.env.npm_package_version 

有关更多详细信息,请参阅package.json vars 。

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

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

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

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

或在普通的老bash中:

 node -e "console.log(require('./package.json').version);" 

输出

 0.0.1 

还有另一种方式从你的package.json文件中获取某些信息,即使用pkginfo模块。

这个模块的使用非常简单。 您可以使用以下命令获取所有包variables

 require('pkginfo')(module); 

或者只是某些细节(在这种情况下的version

 require('pkginfo')(module, 'version'); 

而你的包variables将被设置为module.exports (所以版本号可以通过module.exports.version访问)。

你可以使用下面的代码片段:

 require('pkginfo')(module, 'version'); console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, module.exports.version 

这个模块具有非常好的function – 它可以在你的项目中的任何文件(例如在子文件夹中)使用,它会自动从你的package.json获取信息。 所以你不必担心你的package.json在哪里。

我希望这会有所帮助。

我不认为有任何方法构build到节点本身,但是没有任何东西阻止您仅仅通过读取文件和使用fs模块parsingJSON。

更新:

以上是旧的Node版本。 正如接受的答案所述,在当前版本的Node中,您只require JSON文件即可。 只要记住,将同步阅读,因此不应该dynamic使用。

我用findup-sync做到这一点:

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

您可以使用项目版本包。

 $ npm install --save project-version 

然后

 const version = require('project-version'); console.log(version); //=> '1.0.0' 

它使用process.env.npm_package_version但在由于某种原因缺lessenv var时,在package.json中写入版本。

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

我知道这个问题的目标是为Node.js,但是,如果你使用Webpack捆绑你的应用程序只是一个提醒,推荐的方法是使用DefinePlugin声明一个全球版本的configuration和参考。 所以你可以在你的webpack.config.json

 const pkg = require('../../package.json'); ... plugins : [ new webpack.DefinePlugin({ AppVersion: JSON.stringify(pkg.version), ... 

然后AppVersion现在是一个全球可供您使用。 另外请确保您的.eslintrc通过全局支持忽略这个

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

 $ genversion lib/version.js 

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

我知道这不是OP的意图,但我只是要做到这一点,所以希望它有助于下一个人。

如果您使用docker-compose作为您的CI / CD过程,您可以通过这种方式获得!

 version: image: node:7-alpine volumes: - .:/usr/src/service/ working_dir: /usr/src/service/ command: ash -c "node -p \"require('./package.json').version.replace('\n', '')\"" 

对于图像,您可以使用任何节点图像。 我使用高山,因为它是最小的。

为什么不使用本地方式? 其他的方法对我来说是失败的。

 // Load native UI library var gui = require('nw.gui'); // Get the name field in manifest gui.App.manifest.version