首页 文章

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

提问于
浏览
423

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

15 回答

  • 7

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

    // Load native UI library
    var gui = require('nw.gui');
    
    // Get the name field in manifest
    gui.App.manifest.version
    
  • 54

    还有另一种从 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 在哪里 .

    我希望这会有所帮助 .

  • 0

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

    $ genversion lib/version.js
    

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

  • 19

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

  • 93

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

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

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

  • 1

    您可以使用project-version包 .

    $ npm install --save project-version
    

    然后

    const version = require('project-version');
    
    console.log(version);
    //=>  '1.0.0'
    

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

  • -9

    或者在普通的旧壳中:

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

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

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

    由@Pathogen提供的警告:

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

  • 33

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

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

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

    process.env.npm_package_version
    

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

  • 1

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

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

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

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

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


    • 答案

    const version = process.env.npm_package_version


    请不要使用 JSON.parsefs.readFilefs.readFileSync 并且不要使用其他 npm modules 这个问题没有必要 .

  • 231

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

    我这样做findup-sync

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

    我知道这不是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', '')\""
    

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

相关问题