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

当前回答

我实际上已经完成了这里的大多数解决方案,它们要么在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文件中输出不同的语法和常量名称等。

其他回答

您可以使用项目版本包。

$ npm install --save project-version

Then

const version = require('project-version');

console.log(version);
//=>  '1.0.0'

它使用process.env.npm_package_version,但如果由于某种原因缺少env-var,则回退到package.json中编写的版本。

我使用查找同步来执行此操作:

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

您可以使用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}`);

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

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

我正在使用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中第一次使用密钥,否则您将得到错误的版本