有没有办法从nodejs代码中的package.json获取版本?

时间:2012-02-05 22:15:37

标签: node.js npm version versioning

有没有办法在nodejs app中的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

28 个答案:

答案 0 :(得分:839)

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

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

警告,由@Pathogen提供:

  

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

答案 1 :(得分:257)

如果您的应用程序是使用'npm start'启动的,您只需使用:

process.env.npm_package_version

有关详细信息,请参阅package.json vars

答案 2 :(得分:112)

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

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

答案 3 :(得分:68)

或者在普通的旧壳中:

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",
  ...
}

答案 4 :(得分:39)

正确的答案将在这里举例:

  1. 回答(此代码包含package.json文件并获取版本)

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

    1. 答案

      const version = process.env.npm_package_version

    2. 请不要使用JSON.parsefs.readFilefs.readFileSync并且不要使用其他npm modules这个问题不是必需的

答案 5 :(得分:34)

以下是如何阅读package.json的版本:

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

答案 6 :(得分:21)

还有另一种从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的位置。

我希望这会有所帮助。

答案 7 :(得分:18)

选项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

答案 8 :(得分:13)

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

$ genversion lib/version.js

我承认客户端安全不是OP的主要目的,但正如Mark Wallaceaug的答案中所讨论的那样,它是高度相关的,也是我发现此Q&amp; A的原因。< / p>

答案 9 :(得分:9)

NPM 一个班轮:

npm -s run env echo '$npm_package_version'

答案 10 :(得分:7)

只是添加一个答案,因为我来到这个问题,看看在我的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

答案 11 :(得分:3)

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

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

示例:

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

答案 12 :(得分:3)

您可以使用project-version包。

$ npm install --save project-version

然后

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

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

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

答案 13 :(得分:2)

如果您正在寻找 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)

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

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

然而,您会收到警告,直到 json 模块普遍可用。

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

答案 14 :(得分:2)

我找到的最精简的方法:

const { version } = JSON.parse(fs.readFileSync('./package.json'))

答案 15 :(得分:2)

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

答案 16 :(得分:1)

一个安全的选择是添加一个 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" }

答案 17 :(得分:1)

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

  1. const version = require('./package.json').version;(用于

  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。

答案 18 :(得分: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', '')\""

对于图像,您可以使用任何节点图像。我使用阿尔卑斯山,因为它是最小的。

答案 19 :(得分:1)

我使用findup-sync执行此操作:

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

答案 20 :(得分:0)

为什么不使用require resolve ...

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

使用这种方法可以处理所有子路径:)

答案 21 :(得分:0)

如果使用汇总,则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

答案 22 :(得分:0)

我做了一个有用的代码来获取父模块的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
}

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

我正在使用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'

现在这是

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

请不要让我的脚本位于我的存储库中具有相应名称的子文件夹中。因此,如果您不将$ 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中的第一次使用该密钥,否则您将得到错误的版本

答案 25 :(得分:0)

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

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

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

答案 26 :(得分:-1)

用于像这样对 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)
  }
}

答案 27 :(得分:-9)

为什么不使用原生方式? 其他方法对我来说都失败了。

// Load native UI library
var gui = require('nw.gui');

// Get the name field in manifest
gui.App.manifest.version