npm包和模块中的版本号

我正在编写一个有模块和命令行可执行文件的npm包。 npm包有一个版本 。

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

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

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

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

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

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

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

 console.log(pkg.version); 

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

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

1)通用解决scheme是:

 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 。