在autopublish.meteor.com上,我们正在尝试检索有关包的一些外部数据,即其最新发布标记from GitHub或the NPM registry:
var version;
try {
var packageJson = JSON.parse(Npm.require('fs').readFileSync('package.json'));
version = packageJson.version;
} catch (e) {
// package.json won't be found when running the example with the local copy
// of the package because the current directory isn't the package dir
// ... so fall back to other methods of getting the version
version = HTTP.get('...').data.version;
}
Package.describe({
name: 'foo',
summary: 'bar',
version: version,
});
问题是package.js
中没有HTTP包。
我尝试通过Npm.require('request')
使用the request module,但该模块是异步的......
request.get('http://registry.npmjs.org/summernote/latest', function (err, res, body) {
...
Package.describe({
...
});
});
...失败,因为Package.describe
需要在光纤中运行:
错误:Meteor代码必须始终在光纤内运行。尝试使用Meteor.bindEnvironment包装传递给非Meteor库的回调。
问题是Meteor单例在package.js
中也不可用。
有办法吗?
我尝试过的其他事情:
使用NPM api,例如npm.view('summernote');
- 无效,因为您无法Npm.require('npm')
:
在package.js中,Npm.require只能找到内置模块。
使用execFileSync调用npm
二进制文件,但这不起作用,因为execFileSync仅在Node v0.12.0, which Meteor doesn't use yet中可用。
答案 0 :(得分:1)
在光纤中运行意味着使用node-fibers,因此您可以像Npm.require('fibers/future')
请求一样添加它。
因此该代码获得该模块的“0.6.1”版本:
var request = Npm.require('request');
var Future = Npm.require('fibers/future');
var fut = new Future();
request.get('http://registry.npmjs.org/summernote/latest', function (err, res, body) {
if (! err){
fut.return (body);
}
});
var body = JSON.parse(fut.wait());
Package.describe({
name: 'foo',
summary: 'bar',
version: body.version
});