在Meteor环境中运行其他节点进程?

mr *_*ers 3 meteor

我一直在玩Meteor(和陨石),并且喜欢我开始运行的轻松.现在我想对应用程序添加一些测试,发现主要障碍是在测试脚本中包含Meteor使用的包的引用/要求.

作为一个例子,我有一个我编写的简单类,它在内部使用一些下划线方法.然后我写了一个简单的摩卡脚本来测试它.

我跑的时候

mocha my_test.js
Run Code Online (Sandbox Code Playgroud)

它抱怨_是未定义的.如果我加

var _ = require('underscore')._
Run Code Online (Sandbox Code Playgroud)

对于我的测试代码,它找不到下划线库,因为这些包都被包裹在一个紧密的小包中,而不是在mocha的NODE_PATH上.我可以指定该路径,但这种硬编码路径似乎是一个坏主意.

有没有办法在Meteor环境中运行节点进程/脚本(如mocha)?我正在寻找类似于ruby-land的'捆绑exec'的东西.我已经调查了陨石,它似乎几乎将命令传递给了流星,所以我希望你们可能想要对这个进行调查.

更新:

写完之后,我开始查看流星源代码.我能够写出一些主要完成我想要的东西,并认为Meteor团队可能会评论这是否是一条好路.从meteor shell脚本(/ usr/local/meteor/bin/meteor)开始,我在底部添加了一个case语句,它根据命令名称切换模式.此文件可以替换当前的流星启动脚本,然后添加meteor-exec到meteor和voila的链接.有了这个替换脚本,我就能以正常的方式运行流星.我也可以跑

meteor-exec `which mocha` tests/mocha_test.coffee --compilers coffee:coffee-script
Run Code Online (Sandbox Code Playgroud)

我得到了我期望的结果.我可以要求('下划线')从Meteor的第三方库中提取.我可以在我的npm全局包空间中加入'mocha'和'chai'.

如果这看起来是正确的心态,并且代码同意你们的方式,我可以提交一个适当的拉取请求.

替换流星shell脚本在这个要点https://gist.github.com/4416913.我在下面添加了差异.

提前致谢

罗杰斯先生

PS.保持良好的工作.我真的很喜欢流星.

diff meteor meteor.orig 
105,116c105,106
< NPM_GLOBAL_PATH=$(npm root -g)
< METEOR_THIRD_PARTY="$DEV_BUNDLE/app/lib/third"
< case $(basename $0) in
<   meteor)
<     export NODE_PATH="$DEV_BUNDLE/lib/node_modules"
<     exec "$DEV_BUNDLE/bin/node" "$METEOR" "$@"
<     ;;
<   meteor-exec)
<     export NODE_PATH="$DEV_BUNDLE/lib/node_modules:$METEOR_THIRD_PARTY:$DEV_BUNDLE/packages:$NPM_GLOBAL_PATH"
<     exec "$DEV_BUNDLE/bin/node" "$@"
<     ;;
< esac
---
> export NODE_PATH="$DEV_BUNDLE/lib/node_modules"
> exec "$DEV_BUNDLE/bin/node" "$METEOR" "$@"
Run Code Online (Sandbox Code Playgroud)

avi*_*tal 5

你是对的,这使你可以访问下划线和节点模块,但正如你所说,你将无法以这种方式访问​​流星包(即你将无法使用Meteor.Collection).另外值得指出的是,我们的Git存储库中的admin/node.sh与您的相同meteor-exec.

如果您想尝试构建更完整的解决方案,请查看app/server/server.js以了解我们如何加载包.你需要做这样的事情才能测试依赖于Meteor本身的代码.另一种方法是创建一个包装摩卡的智能包.目前还没有简单的方法可以直接从Meteor软件包中依赖NPM模块(这是在开发中),但您可以将mocha源复制到您的软件包中.然后你可以到达一个只meteor在你的应用程序中运行你的mocha测试的点(虽然仍然运行在端口3000上监听的web服务器等)