767

有没有办法package.json在 nodejs 应用程序中设置版本?我想要这样的东西

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
4

27 回答 27

1171

我发现以下代码片段最适合我。由于它用于require加载package.json,因此无论当前工作目录如何,它都可以工作。

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

@Pathogen提供的警告:

使用 Browserify 执行此操作具有安全隐患。
请注意不要将您的内容暴露package.json给客户端,因为这意味着您的所有依赖项版本号、构建和测试命令等都将发送给客户端。
如果你在同一个项目中构建服务器和客户端,你也会暴露你的服务器端版本号。攻击者可以使用此类特定数据来更好地适应对您服务器的攻击。

于 2012-06-01T17:51:37.653 回答
553

如果您的应用程序使用 启动npm start,您可以简单地使用:

process.env.npm_package_version

有关更多详细信息,请参阅package.json 变量

于 2014-03-12T00:00:12.603 回答
224

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

import {version} from './package.json';
于 2016-04-20T03:24:09.107 回答
128

或者在普通的旧外壳中:

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

这可以缩短为

$ node -p "require('./package.json').version"
于 2015-11-10T11:24:25.680 回答
88

有两种检索版本的方法:

  1. 要求package.json和获取版本:
const { version } = require('./package.json');
  1. 使用环境变量:
const version = process.env.npm_package_version;

请不要使用JSON.parse, fs.readFilefs.readFileSync也不要使用另一个npm modules这不是这个问题所必需的。

于 2018-02-12T10:04:34.857 回答
60

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

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

编辑:哇,这个答案最初来自 2012 年!现在有几个更好的答案。可能最干净的是:

const { version } = require('./package.json');
于 2012-05-21T00:27:11.300 回答
57

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

$ genversion lib/version.js

我承认客户端安全不是 OP 的主要意图,但正如Mark Wallaceaug的回答中所讨论的,它是高度相关的,也是我找到此问答的原因。

于 2017-10-05T09:44:08.953 回答
26

还有另一种从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

我希望这会有所帮助。

于 2014-03-05T15:50:34.560 回答
21

选项1

最佳实践是使用 npm 环境变量从 package.json 进行版本控制。

process.env.npm_package_version

更多信息:https ://docs.npmjs.com/using-npm/config.html

这仅在您使用 NPM 命令启动服务时才有效。

快速信息:您可以使用 process.env.npm_package_[keyname] 读取 pacakge.json 中的任何值

选项 2

使用https://www.npmjs.com/package/dotenv作为文件在环境变量中设置版本.env并将其读取为process.env.version

于 2020-01-30T18:24:43.310 回答
15

NPM一班轮:

npm v7.20.0 开始

npm pkg get version

在 npm v7.20.0 之前:

npm -s run env echo '$npm_package_version'

请注意,这两种方法的输出略有不同:前者输出用引号括起来的版本号 (ie "1.0.0"),后者不输出 (ie 1.0.0)。

于 2020-12-21T12:31:38.540 回答
13

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

我知道这个问题是针对 Node.js 的,但是,如果您使用 Webpack 捆绑您的应用程序,建议您使用DefinePlugin在配置中声明一个全局版本并引用它。所以你可以在你的webpack.config.json

const pkg = require('../../package.json');

...

plugins : [
    new webpack.DefinePlugin({
      AppVersion: JSON.stringify(pkg.version),
...

然后AppVersion现在是一个可供您使用的全局变量。还要确保你.eslintrc通过 globals 属性忽略这个

于 2017-09-18T20:21:00.240 回答
8

您可以使用 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}`);
于 2019-01-14T13:35:06.193 回答
7

要确定节点代码中的包版本,可以使用以下命令:

  1. const version = require('./package.json').version;对于 < ES6 版本

  2. import {version} from './package.json';对于 ES6 版本

  3. const version = process.env.npm_package_version; 如果应用程序已使用 启动npm start,则所有 npm_* 环境变量都可用。

  4. 您也可以使用以下 npm 包 - root-require、pkginfo、project-version。

于 2019-04-23T12:50:31.467 回答
5

您可以使用项目版本包。

$ 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。

于 2017-08-02T09:13:17.570 回答
5

如果您想获取目标包的版本。

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

例子:

import { version } from 'react/package.json';
于 2021-02-24T01:25:00.353 回答
5

如果您正在寻找module (package.json: "type": "module")(ES6 导入)支持,例如来自重构 commonJS,您应该(在撰写本文时)执行以下任一操作:

import { readFile } from 'fs/promises';

const pkg = JSON.parse(await readFile(new URL('./package.json', import.meta.url)));

console.log(pkg.version)

或者,使用 to 运行节点进程node --experimental-json-modules index.js

import pkg from './package.json'
console.log(pkg.version)

但是,在 json 模块普遍可用之前,您会收到警告。

如果您收到语法或(顶级)异步错误,您可能使用的是较旧的节点版本。至少更新到 node@14。

于 2021-05-15T23:50:58.993 回答
4

为什么不使用 require 解析...

const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)

使用这种方法适用于所有子路径:)

于 2019-07-03T11:07:22.433 回答
3

我知道这不是 OP 的意图,但我只需要这样做,所以希望它可以帮助下一个人。

如果您在 CI/CD 流程中使用 docker-compose,您可以通过这种方式获得它!

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', '')\""

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

于 2017-03-09T18:01:15.983 回答
3

一个安全的选择是添加一个生成单独版本文件的 npm 脚本:

"scripts": {
    "build": "yarn version:output && blitz build",
    "version:output": "echo 'export const Version = { version: \"'$npm_package_version.$(date +%s)'\" }' > version.js"
  }

这将输出version.js内容:

export const Version = { version: "1.0.1.1622225484" }
于 2021-05-28T18:14:12.280 回答
2

我这样做findup-sync

var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1' 
于 2015-01-18T15:15:18.747 回答
2

我发现的最精简的方式:

const { version } = JSON.parse(fs.readFileSync('./package.json'))
于 2020-10-13T20:27:27.530 回答
2

const { version } = require("./package.json");
console.log(version);

const v = require("./package.json").version;
console.log(v);

于 2020-11-24T10:56:20.130 回答
2

我正在使用 gitlab ci 并希望自动使用不同的版本来标记我的 docker 图像并推送它们。现在他们的默认泊坞窗图像不包括节点所以我的版本只在 shell 中执行此操作是这个

脚本/getCurrentVersion.sh

BASEDIR=$(dirname $0)
cat $BASEDIR/../package.json | grep '"version"' | head -n 1 | awk '{print $2}' | sed 's/"//g; s/,//g'

现在这样做是

  1. 打印你的包裹 json
  2. 搜索带有“版本”的行
  3. 只取第一个结果
  4. 替换 " 和 ,

请不要说我的脚本在我的存储库中具有相应名称的子文件夹中。因此,如果您不将 $BASEDIR/../package.json 更改为 $BASEDIR/package.json

或者,如果您希望能够获得主要、次要和补丁版本,我使用这个

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

于 2020-12-01T13:16:58.930 回答
1

我做了一个有用的代码来获取父模块的 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
}
于 2018-11-07T23:35:15.440 回答
1

如果使用汇总,则rollup-plugin-replace可以使用插件添加版本,而无需将 package.json 暴露给客户端。

// rollup.config.js

import pkg from './package.json';
import { terser } from "rollup-plugin-terser";
import resolve from 'rollup-plugin-node-resolve';
import commonJS from 'rollup-plugin-commonjs'
import replace from 'rollup-plugin-replace';

export default {
  plugins: [
    replace({
      exclude: 'node_modules/**',
      'MY_PACKAGE_JSON_VERSION': pkg.version, // will replace 'MY_PACKAGE_JSON_VERSION' with package.json version throughout source code
    }),
  ]
};

然后,在源代码中,在任何您想要拥有 package.json 版本的地方,您都可以使用字符串“MY_PACKAGE_JSON_VERSION”。

// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js
于 2019-12-20T18:30:23.917 回答
0

将您的package.json文件导入您的server.jsorapp.js然后将 package.json 属性访问到服务器文件中。

var package = require('./package.json');

package 变量包含 package.json 中的所有数据。

于 2018-08-01T06:39:25.110 回答
-2

用于像这样对 Web 组件进行版本控制:

const { version } = require('../package.json')

class Widget extends HTMLElement {

  constructor() {
    super()
    this.attachShadow({ mode: 'open' })
  }

  public connectedCallback(): void {
    this.renderWidget()
  }

  public renderWidget = (): void => {
    this.shadowRoot?.appendChild(this.setPageTemplate())
    this.setAttribute('version', version)
  }
}

于 2021-04-15T08:45:09.120 回答