我正在尝试使用guard-rspec
设置一个有效的ruby项目。
我将tutsplus tutorial的一般方法与RSpec videos和another post中描述的一些新语法混合在一起。该项目可在github上的stack-overflow-question
分支中找到。
我也在尝试按照Programming Ruby 1.9中的描述练习命名空间。所以我最终希望example.rb
目录中有lib/example/
。
我对我的项目有4个问题:
Guardfile
中查看我的项目中的特定目录以进行更改?我有几种不同的方式可以在我的Guardfile
中看到标记为: # Watch Specific Directory Attempt X
在我的Guardfile
(下方Uncomment and set this to only include directories you want to watch
)中取消注释第8行和第9行,并按照here添加watch(%r{^lib/(?<path>.+)\.rb$}) { |m| "spec/lib/#{m[:path]}_spec.rb" }
之类的“命名群组捕获”之间有什么区别}
我需要在哪里放置--clear
选项才能使其持久化?我知道我可以使用像bin/guard --clear
这样的binstub来运行它,我已经尝试将它放在我的Guardfile
中,但它不起作用。
您在我的项目中看到了明显的约定,语法或清晰度错误吗?我觉得我正在把这整件事整理在一起,我很欣赏一些以明智的方式将这件事拼凑在一起的指导。
答案 0 :(得分:1)
我会回答标题中的问题,并在我去的时候涵盖“子问题”。
设置项目的最佳方式(截至目前)是使用bundle exec guard --init rspec
。这应该给出合理的默认值来立即开始工作。它并不完美,但是有很多工作要改进,所以请在GitHub上提问(更有意义)。
Guard必须保持向后兼容性,所以现在有一些“非直观”的东西,首先浏览所有文档(和wiki)是一个很好的投资,可以快速了解可用的内容和位置。在困惑或疑问时询问也是一个好主意(每个问题最好一个问题)。
Guard使用DSL来简化设置侦听器。这有点不直观和笨拙有时,但它确实有助于将操作组织到组中,这有助于维护复杂的工作流程。 DSL的命令,例如clearing终端自动为:(clearing: on
)。 (这回答问题3)。
有各种各样的用途和场景,因此Guard努力让每个人都感到高兴,并且也在每个平台上。 Guard使用Listen,它以递归方式监视目录(主要是由于对OSX的限制)。这通常不是问题,但对于OSX的巨大方向,这可能非常非常慢。这就是为什么Guard允许您选择要观看的顶级目录(如'lib','app'等)。看整个项目目录非常方便,所以这仍然是默认的。有关这方面的更多信息,请访问Listen项目。因此,默认情况下,所有目录(:directories
语句)都是“物理监视”(占用操作资源),但在Guard中,您只需配置要响应的更改(watch
语句执行的操作)
所选词语有时会有点误导。例如。 DSL中的watch
实际上意味着:“在所有发生的变化中,选择匹配的变化......”。传递给watch
的块将获得匹配结果。该块应返回要运行的当前guard插件的文件列表。因此,“观察”可能更具误导性而非有用。 “匹配”可能是一个更好的选择,它可能在未来取代“观察”。
guard-rspec项目在更改的文件上运行RSpec。如果您在启用调试选项的情况下运行guard,则可以看到确切的RSpec命令,例如: bundle exec guard -d
。为了简化设置,如果项目遵循给定的设置,Guard :: RSpec使用的DSL应该是开箱即用的。例如。 dsl.watch_spec_files_for(ruby.lib_files)
已定义为here:因此,如果将所有经过测试的源文件放在lib
中,它几乎已经应该按照您的要求执行。对于其他文件夹,您可以添加自己的文件夹。例如。 Rails项目通常也在app
目录中有源,因此在默认的Guard :: RSpec模板中有一个语句:dsl.watch_spec_files_for(rails.app_files)
,模式定义为:rails.app_files = %r{^app/(.+)\.rb$}
如果你有一个典型的案例没有涵盖,在该项目中打开一个问题。 (涵盖问题2)。
示例项目中的一切看起来都很好,建议主要基于品味或偏好。 E.g。
let (:greeter) { Example::RSpecGreeter.new }
,我会使用RSpec的隐式subject(但有些人可能会认为它不那么明确且不太可读)。Example::RSpecGreeter
,我建议您将该类放在单独的文件中并改为包含它(require 'example/rspec_greeter'
)