当Vagrant主机更改源时,Grunt Karma测试无法检测到它。

5
这个问题让我费了很长时间,但似乎找不到解决方法。我使用Vagrant运行一个Fedora 20的虚拟机,其中运行着grunt/karma。我在主机上编辑代码,但当我保存后,grunt却没有检测到变化,因此无法进行测试。
我想这是一个配置问题,因此尝试了很多组合,但都没有成功。最后,我在虚拟机中打开了第二个ssh vagrant ssh,并在另一个ssh终端中更改了文件echo " " >> app/js/app.js,发现现在grunt/karma检测到了变化并再次运行测试。
由于虚拟机没有任何X窗口或其他界面,所以我使用PhantomJS运行测试。另一个问题是,我必须在httpd.conf中设置EnableSendfile off,以防止Apache在从共享目录(我的项目在主机上,web根目录在虚拟机中)提供文本文件时发送垃圾信息。我猜测可能还需要对node进行其他设置,以便它能够检测到主机上对共享文件的更改。它正在使用VirtualBox共享。
有人遇到过这种情况吗?是否有解决方法?似乎主机机器对共享文件进行更改时,没有触发grunt/karma正在监听的某个事件来表明文件已经更改。
【更新】
尝试了NFS和rsync共享,但NFS根本不起作用,rsync似乎只会在启动时同步一次。
【更新】
作为临时解决方法,我必须手动告诉虚拟机中的文件已经更新:
#start grunt and give me back command:
grunt &
#when I update a file tell grunt it's updated
touch -d "now" test/unit/loginSpec.js

有趣的是,如果我更新了app/js/login.js并告诉grunt更新了test/unit/loginSpec.js,它会再次运行测试,但使用旧的login.js,即使它已经改变了,cat app/js/login.js显示了更改。如果不是这样的话,解决方案就是将焦点设置为正确的窗口,并按下两个按键(上箭头和Enter)

听起来像是网络配置问题,而不是编码问题...或者你正在编译自己的grunt分支吗? - Ben Voigt
@BenVoigt 这绝对是共享实现方式的问题。但是,如果主机更改文件,则可以在具有正确最后修改日期的客户端上看到文件更改。只是 grunt watch (node) 无法检测到文件已更改。 - HMR
你正在编写/修改实现分享的代码吗? - Ben Voigt
2
@BenVoigt 谢谢您的回复。我不同意您的观点,因为Vagrant是一种开发工具,共享的整个重点在于您可以在一个开发机器上运行多个客户端/项目的服务器配置:http://www.vagrantup.com/ 为了使其正常工作,需要设置Apache和我怀疑nodejs以使grunt watches正常工作。Apache部分已经有文档记录和提及,但找不到grunt watches部分,所以在这里询问。 - HMR
就像“我计划在这台电脑上安装Visual Studio”并不是在这里询问任意Windows问题的理由一样,“我正在这个盒子上运行vagrant”也不是在寻求Linux配置问题的理由。 - Ben Voigt
显示剩余2条评论
1个回答

3
这是由vboxsf(Virtualbox“sharded folder”文件系统)同步中已知的一个bug导致的,解决此问题的唯一方法是由Virtualbox团队实施。人们在使用Gulp、Guard或Meteor.js时也遇到了类似的问题。

有一些解决方法可以使用...

自动rsync

Vagrant 1.5具有自动同步实用程序(rsync-auto),它会监视指定的文件夹,并在您实时进行更改时自动同步更改。它使用系统特定的API来检测文件更改,而不是轮询文件系统...

所以您只需要在vagrant文件中定义共享即可。例如:

config.vm.synced_folder ".", "/vagrant", type: "rsync"


并打开一个额外的终端会话运行:

$ vagrant rsync-auto

然而,仅仅这样做并不是最高效的选项。在这里,您可以找到一个gruntfile和一个vagrant插件,它们将帮助您使rsync运行更快、更顺畅...希望对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接