我正在尝试使用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
内的path
和package.js
等内置模块?
我意识到我可以使用fs
模拟此功能,但globpattern语法更简洁,更易读。
答案 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模块。