有没有方法在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
有没有方法在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并获取版本:
const { version } = require('./package.json');
使用环境变量:
const version = process.env.npm_package_version;
请不要使用JSON.parse、fs.readFile和fs.readFileSync,也不要使用其他npm模块,这不是这个问题所必需的。
其他回答
我实际上已经完成了这里的大多数解决方案,它们要么在Windows和Linux/OSX上都不起作用,要么根本不起作用;要么依赖于Unix shell工具,如grep/awk/sed。
从技术上来说,接受的答案是可行的,但它会把你的整个package.json都吸进你的构建中,这是一件糟糕的事情,只有绝望的人才应该暂时使用它来解封,而且一般情况下应该避免,至少对于生产代码来说是这样。另一种方法是仅使用该方法将版本写入可以使用的单个常量,而不是整个文件。
因此,对于其他寻求跨平台解决方案(不依赖Unix shell命令)和本地解决方案(无外部依赖)的人来说:
由于可以假设Node.js已经安装,并且已经跨平台安装,所以我只创建了一个make_version.js文件,其中包含:
const PACKAGE_VERSION = require("./package.json").version;
console.log(`export const PACKAGE_VERSION = "${PACKAGE_VERSION}";`);
console.error("package.json version:", PACKAGE_VERSION);
并向package.json添加了一个版本命令:
scripts: {
"version": "node make_version.js > src/version.js",
然后添加:
"prebuild": "npm run version",
"prestart": "npm run version",
它在每次启动或构建时都会创建一个新的src/versions.js。当然,这可以很容易地在版本脚本中调整到不同的位置,或者在make_version.js文件中输出不同的语法和常量名称等。
还有另一种方法可以从package.json文件中获取某些信息,即使用pkginfo模块。
此模块的使用非常简单。您可以使用以下方法获取所有包变量:
require('pkginfo')(module);
或仅某些细节(本例中的版本)
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.jsn在哪里。
我希望这会有所帮助。
我正在使用gitlab ci,并希望自动使用不同的版本来标记我的docker图像并推送它们。现在,它们的默认docker图像不包含节点,所以我的版本仅在shell中执行此操作
scripts/getCurrentVersion.sh
BASEDIR=$(dirname $0)
cat $BASEDIR/../package.json | grep '"version"' | head -n 1 | awk '{print $2}' | sed 's/"//g; s/,//g'
现在,它的作用是
打印您的包json搜索带有“版本”的行只取第一个结果替换“和,
请注意,我的脚本位于存储库中具有相应名称的子文件夹中。因此,如果您不更改$BASEDIR//package.json到$BASEDIR/package.json
或者如果你想获得主要、次要和补丁版本,我会使用这个
scripts/getCurrentVersion.sh
VERSION_TYPE=$1
BASEDIR=$(dirname $0)
VERSION=$(cat $BASEDIR/../package.json | grep '"version"' | head -n 1 | awk '{print $2}' | sed 's/"//g; s/,//g')
if [ $VERSION_TYPE = "major" ]; then
echo $(echo $VERSION | awk -F "." '{print $1}' )
elif [ $VERSION_TYPE = "minor" ]; then
echo $(echo $VERSION | awk -F "." '{print $1"."$2}' )
else
echo $VERSION
fi
如果您的版本是1.2.3,则采用这种方式。您的输出将如下所示
$ > sh ./getCurrentVersion.sh major
1
$> sh ./getCurrentVersion.sh minor
1.2
$> sh ./getCurrentVersion.sh
1.2.3
现在,您需要确保的唯一一件事是,您的包版本将是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
}
将package.json文件导入server.js或app.js,然后将packaage.json财产访问到服务器文件中。
var package = require('./package.json');
package变量包含package.json中的所有数据。