繁体   English   中英

在Meteor package.js中使用NPM软件包

[英]Using NPM packages in Meteor package.js

我正在尝试使用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目录都不会添加到.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和package.js内部的fspath类的内置模块之外,是否还有更好的方法来使用Npm模块?

我意识到我可以使用fs来仿真此功能,但是globpattern语法更加简洁易读。

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

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

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

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

Npm.require首次运行在package.js中不起作用的原因是,链接器使用package.js来创建所需的npm模块以及如何将其链接的想法。

之后,运行项目,并且可以将Npm.require文件中与api.add_files关联的文件中的api.add_files一起api.add_files

但是,如果要使用逻辑来确定要添加的文件,则必须访问较低级别的文件,这就是运行eval()的代码可以做到的。

另一种选择是手动安装Npm模块并使用eval加载它。 尽管它的级别很低,所以可能比它的价值更麻烦。 有关如何安装npm文件的详细信息, 参见https://github.com/meteor/meteor/blob/devel/tools/meteor_npm.js

它基本上会创建一个“ shrinkwrap”,然后安装npm模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM