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

当前回答

用于以下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)
  }
}

其他回答

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

或者在普通的旧壳中:

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

这可以缩短为

$ node -p "require('./package.json').version"

如果您正在寻找模块(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运行node进程:

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

然而,在json模块变得普遍可用之前,您将收到警告。

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

我们可以通过两种方式从package.json中读取版本或其他密钥

1-使用require并导入所需的密钥,例如:

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

2-使用文档中提到的package_vars

process.env.npm_package_version

为什么不使用require resolve。。。

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

使用此方法,所有子路径都适用:)