[英]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
内部的fs
和path
类的内置模块之外,是否还有更好的方法来使用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.