有没有一种方法从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