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

问题描述 投票:472回答:17

有没有办法在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
node.js npm version versioning
17个回答
850
投票

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

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

由@Pathogen提供的警告:

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


3
投票

您可以使用project-version包。

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


3
投票

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

2
投票

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

  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。

1
投票

我用findup-sync这样做:

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

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

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


0
投票

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

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

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


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
}

0
投票

为什么不使用require resolve ...

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

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


-9
投票

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

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

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

263
投票

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

process.env.npm_package_version

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


115
投票

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

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

69
投票

或者在普通的旧壳中:

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

40
投票

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

  1. 回答(此代码包含package.json文件并获取版本) const { version } = require('./package.json');

  1. 回答 const version = process.env.npm_package_version

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


35
投票

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

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

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在哪里。

我希望这会有所帮助。


13
投票

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

$ genversion lib/version.js

我承认客户端安全不是OP的主要目的,但正如Mark Wallaceaug的回答中所讨论的那样,它具有高度相关性,也是我发现此问答的原因。


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

© www.soinside.com 2019 - 2024. All rights reserved.