在Meteor package.js中使用NPM包

时间:2014-01-03 21:18:22

标签: javascript node.js meteor

我正在尝试使用glob NPM模块来简化向Meteor包添加文件的过程:

Package.on_test(function(api) {
  Npm.depends({
    "glob": "3.2.7"
  });

  var glob = Npm.require("glob");
  api.add_files(glob.sync("styles/**/*.styl"), "client");
  api.add_files(glob.sync("tests/styles/**/*.@(styl|css)"), "client");
});

这不起作用,因为glob dir直到稍后才会添加到.npm/package/node_modules。如果我尝试运行meteor test-packages ./,我会收到错误:

  

无法找到npm模块'glob'。你忘记打电话给'Npm.depends'了吗?

但是,我可以通过这样做来欺骗Meteor实现这项工作:

Package.on_test(function(api) {
  Npm.depends({
    "glob": "3.2.7"
  });

  var glob = Npm.require("glob");
  if (glob) {
    api.add_files(glob.sync("styles/**/*.styl"), "client");
    api.add_files(glob.sync("tests/styles/**/*.@(styl|css)"), "client");
  }
});

现在,我第一次运行meteor test-packages时,应用程序会加载NPM依赖项然后崩溃。如果我再次运行它,则添加了glob包,一切正常。所以我想知道是否有更好的方法来使用除了Underscore之外的Npm模块以及fs内的pathpackage.js等内置模块?

我意识到我可以使用fs模拟此功能,但globpattern语法更简洁,更易读。

1 个答案:

答案 0 :(得分:1)

我不确定这是否会有所帮助,但是有一种“欺骗”方式来添加npm模块。

如果您正在测试,可以使用npm install glob -g全局安装'glob'并使用以下内容:

var glob = eval("require('glob');");

Meteor的链接器模块无法解释并更改它,因此您可以直接链接到npm模块,这样您就可以使用它连接到全局npm模块而不是本地模块。

第一次运行时Npm.require在package.js中不起作用的原因是因为链接器使用package.js来创建需要npm模块以及如何链接它们的想法。

之后项目运行,npm模块可以与Npm.require相关联的文件中的api.add_files一起使用。

但是如果你想在决定要添加哪些文件时使用某些逻辑,你必须能够访问更低级别的内容,这就是运行eval()中的代码所允许的。

另一种选择是手动安装Npm模块并使用eval加载它。虽然它的水平非常低,但它可能比它的价值更麻烦。有关如何安装npm文件的详细信息,请访问https://github.com/meteor/meteor/blob/devel/tools/meteor_npm.js

它基本上创建了'shrinkwrap'然后安装npm模块。

相关问题