介绍
guard 是一个自动监控文件夹变更, 执行特定操作的工具. 如果你有这样的需求, 就可以用它.
guard可以和rails整合, 这里 是介绍.
使用方法
比如, 简单地监控当前文件夹里面的变更, 如果变了就重新编译一下, 我们先装好一个插件: guard-rake 新建一个文件夹,里面2个文件:
Guardfile :
guard 'rake', :task => 'default' do
watch(/(.*)/)
end
Rakefile:
task :default do
sh 'cpp xxx.c -o hello'
sh './hello'
end
然后在这个文件夹里面执行:
guard
每次这个文件夹里面出现了文件变更, 就会重新执行一下default, 编译执行一下代码, 省去了每次自己点击的操作了.
原理
我们使用一个工具的时候一般来说最好还是需要知道一下这个工具的基本工作原理, 不然遇到问题的话也比较好解决.
底层根据操作系统采用对应的文件系统监控API(Listener). 在linux下面是调用 inotify.
guard的插件, 需要继承Guard, 实现run_on_change/initialize/start/stop 这些API就可以了.
guard本身定义了一套DSL. 在Guardfile里面写的东西, 就会连接到对应的插件上面去. 比如上面的例子, guard ‘rake’, 下面就会调用guard-rake写的一个插件定义类.
livereload
guard有各种各样的插件, 这里介绍一个神奇的livereload. 它的作用是:
在做rails开发的时候, 每次更新了一个源文件, 我们需要手动去刷新一下网站页面. 它能够让你的网页自动刷新.
原理:
guard维护一个本地的服务器. 网页内嵌有一个js, 连接上这个服务器.
当修改文件的时候, guard能够获知修改, 通知所有连上来的客户端, 本地有更新. js接收到更新, 会去自动刷新网页.
具体安装需要几个: guard-livereload 作为guard插件. rack-livereload 作为rails rack的一个中间件, 用来嵌入livereload的js.