【问题标题】:Version number in npm package and modulenpm 包和模块中的版本号
【发布时间】:2017-06-29 21:28:31
【问题描述】:

我正在创作一个具有模块和命令行可执行文件的 npm 包。 npm 包has a version

我希望我的模块知道这个版本,以便我可以从my_executable -v 报告它,并在输出中使用它(例如“由 MyPackage v1.3.2 生成”)。但是,我不想在两个地方(在我的模块和我的package.json)输入相同的版本号,因为在某些时候我肯定会搞砸并忘记更新一个或另一个。我怎么能……

  • …从我的模块中导出版本,并让package.json 从我的模块中读取版本?
    • 使用 Ruby gem 我可以做到这一点,因为gemspec 文件是纯 Ruby 代码,可以加载模块并从派生代码填充参数。我认为这对于 npm/package.json 是不可能的?
  • …或者,从我的模块中读取package.json 中指定的版本?
    • package.json 是否保证与我的模块一起安装在已知位置?我要怎么拉进去?手动读取 JSON 并解析它?

编辑:一个简单的let pkg = require('./package.json') 在我的情况下不起作用,因为我的项目文件结构:

mypackage/
  bin/myexecutable    # uses require('../lib/mymodule.js')
  lib/mymodule.js     # needs to load package.json
  package.json

【问题讨论】:

    标签: node.js npm


    【解决方案1】:

    您可以从package.json 中提取您的包的版本,如下所示:

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

    访问pkg.version获取版本例如:

    console.log(pkg.version);
    

    如果package.json 与您正在执行的文件不在同一目录中:

    let pkg = require(__dirname + '/path/to/package.json')
    

    【讨论】:

    • 这看起来又好又简洁!在这种情况下,./ 是什么?模块的目录?我的module.js 文件的目录?还是命令的CWD?基本上:为了安全起见,我是否需要使用path.resolve 对抗__dirname
    • 模块的根目录 - 这将是package.json 所在的位置
    • 其实我相信是相对于你正在执行的文件而言的。因此,无论您执行的是相对路径的二进制文件。
    • 看来可以。在我的特定情况下——从可执行文件和模块到包的路径都是../package.json——我可以在我的模块中使用require('../package.json'),它可以工作,而无需诉诸path.resolve()__dirname。谢谢你的帮助。如果出现其他建议,我将把这个问题留得更久一些,否则这似乎是一个可以接受的答案。
    • 我知道的任何替代方法都使用fs.readFile,后跟JSON.parse。没有比这更简单的了,但请随时保持开放,看看是否有人返回更好的东西
    【解决方案2】:

    1) 通用解决方案是:

    const path = require('path');
    // will be used to check file existence
    const {accessSync} = require("fs");
    
    function getMainPackage() {
      let mainModuleName, pathToPackage;
    
      const mainModuleNameOnError = {
        name: "unknown",
        version: "unknown",
      };
    
      try {
        mainModuleName = require.main.paths.find((modulesPath) => {
          pathToPackage = path.resolve(modulesPath, "..", "package.json");
          try {
            accessSync(pathToPackage);
          } catch (e) {
            return false;
          }
          return true;
        });
      } catch (e) {
        return mainModuleNameOnError;
      }
    
      return (mainModuleName)
        ? require(pathToPackage);
        : mainModuleNameOnError;
    }
    
    //example
    const pkg = getMainPackage();
    console.log(pkg.version);
    

    2) 如果你知道你的 package.json 放在哪里:

    let pkg = require(<the_packagejson_folder> + './package.json');
    console.log(pkg.version);
    

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

    process.env.npm_package_version
    

    更多详情请见package.json vars

    【讨论】:

    • 作为包和软件的作者,我不是一直都知道package.json在哪里吗?在什么情况下需要你的#1?
    • 当您无法使用 #2 或 #3 中的更简单的解决方案时。有时你可以找到 package.json,所以你会得到 mainModuleNameOnError 对象
    • 什么情况下会出现“时不时”? (我认为你的意思是“……你找不到找到……”。)
    • 情况是你不需要node_modules文件夹中的任何文件。
    猜你喜欢
    • 2019-09-11
    • 2017-09-09
    • 2015-02-16
    • 2016-01-09
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多