有没有办法在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
,因此无论当前的工作目录如何,它都能正常工作。
var pjson = require('./package.json');
console.log(pjson.version);
由@Pathogen提供的警告:
使用Browserify执行此操作具有安全隐患。 注意不要将
package.json
暴露给客户端,因为这意味着所有依赖版本号,构建和测试命令等都会发送到客户端。 如果您在同一项目中构建服务器和客户端,则也会公开服务器端版本号。攻击者可以使用此类特定数据来更好地适应您服务器上的攻击。
您可以使用project-version包。
$ npm install --save project-version
然后
const version = require('project-version');
console.log(version);
//=> '1.0.0'
它使用process.env.npm_package_version
但回退在package.json
中编写的版本,以防由于某种原因缺少env var。
您可以使用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}`);
要确定节点代码中的包版本,可以使用以下命令:
const version = require('./package.json').version;
为<ES6版本import {version} from './package.json';
为ES6版本const version = process.env.npm_package_version;
如果应用程序已经使用npm start
启动,则所有npm_ *环境变量都可用。我用findup-sync
这样做:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
我知道这不是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', '')\""
对于图像,您可以使用任何节点图像。我使用阿尔卑斯山,因为它是最小的。
将package.json
文件导入server.js
或app.js
,然后将package.json属性访问到服务器文件中。
var package = require('./package.json');
package变量包含package.json中的所有数据。
我制作了一个有用的代码来获取父模块的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
}
为什么不使用require resolve ...
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
这种方法适用于所有子路径:)
为什么不使用原生方式?其他方法对我来说都失败了。
// Load native UI library
var gui = require('nw.gui');
// Get the name field in manifest
gui.App.manifest.version
使用ES6模块,您可以执行以下操作:
import {version} from './package.json';
或者在普通的旧壳中:
node -e "console.log(require('./package.json').version);"
这可以缩短为
node -p "require('./package.json').version"
即使这不是问题所针对的问题,如果你想在package.json
本身中使用该版本,例如在script
中登录到版本化文件,它也很有用:
{
"name": "myapp",
"version": "0.1.2",
"scripts": {
"run": "node index.js 2>&1 | tee -a myapp_v$(node -p \"require('./package.json').version\").log",
...
}
package.json
文件并获取版本)
const { version } = require('./package.json');
const version = process.env.npm_package_version
请不要使用JSON.parse
,fs.readFile
,fs.readFileSync
,不要使用另一个npm modules
,这个问题不是必需的。
以下是如何从package.json中读取版本:
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
还有另一种从package.json
文件中获取某些信息的方法,即使用pkginfo模块。
使用这个模块非常简单。您可以使用以下方法获取所有包变量
require('pkginfo')(module);
或者只是某些细节(在这种情况下是version
)
require('pkginfo')(module, 'version');
并且您的包变量将设置为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
这个模块有很好的功能 - 它可以在项目的任何文件中使用(例如在子文件夹中),它会自动从你的package.json
获取信息。所以你不必担心package.json
在哪里。
我希望这会有所帮助。
对于那些寻求在服务器端也能运行的安全客户端解决方案的人来说,有genversion。它是一个命令行工具,它从最近的package.json读取版本,并生成一个可导入的CommonJS模块文件,用于导出该版本。免责声明:我是维护者。
$ genversion lib/version.js
我承认客户端安全不是OP的主要目的,但正如Mark Wallace和aug的回答中所讨论的那样,它具有高度相关性,也是我发现此问答的原因。
只是添加一个答案,因为我来到这个问题,看看在我的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
you ignore this via the globals prop