npm包和模块

时间:2017-06-23 15:54:43

标签: node.js npm

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

我希望我的模块知道这个版本,以便我可以从my_executable -v报告它,并在输出中使用它(例如"由MyPackage v1.3.2和#34生成;) 。但是,我不想在两个地方(在我的模块和我的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

2 个答案:

答案 0 :(得分:2)

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

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

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

console.log(pkg.version);

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

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

答案 1 :(得分:1)

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)如果您的应用程序是使用&nbsp; npm start&#39;启动的,您只需使用:

process.env.npm_package_version

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