npm包和模块中的版本号
我正在编写一个有模块和命令行可执行文件的npm包。 npm包有一个版本 。
我想我的模块知道这个版本,以便我可以从my_executable -v
报告它,否则在输出中使用它(例如“生成MyPackage v1.3.2”)。 不过,我不想在两个地方input相同的版本号(在我的模块和我的package.json
),因为在某些时候我保证会搞砸,忘记更新一个或另一个。 我怎么能…
- …从我的模块导出版本,并让
package.json
从我的模块读取版本?- 使用Ruby gem我可以这样做,因为
gemspec
文件是纯粹的Ruby代码,可以加载模块并从派生代码填充参数。 我认为这不可能与npm / package.json?
- 使用Ruby gem我可以这样做,因为
- …或者,从我的模块中读取
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 。