我正在使用一个简单的(或者我认为是这样的)Sinatra 应用程序,它在应用程序开发/部署周期的不同阶段使用了一些 gem:
- 用于管理依赖项的 Bundler
- 用于构建任务的耙子
- 资产预编译的链轮
- 用于测试的 RSpec 2
- 用于部署的 Capistrano
Gemfile 包含rspec
在一个test
组中。
Rakefile 定义了一项assets:compile
任务,用于将 Sass 转换为 CSS 并将 CoffeeScript 转换为 JavaScript,并连接生成的文件。
Capistrano 运行bundle install --without development test
,因此只有生产(和资产编译)所需的 gem 安装在生产服务器上。它还运行最终bundle exec rake assets:compile
在服务器上运行的 Cap 任务。
到目前为止一切都很好,但是我想将 RSpec Rake 任务添加到我的 Rakefile 中,这就是问题所在。当我在本地运行时它工作正常,但是当我运行时我cap deploy
在服务器上得到一个错误:no such file to load -- rspec/core/rake_task
.
这是有道理的:当我们安装 bundle 时,RSpec 并没有安装在服务器上,并且 spec 任务实际上永远不会在那里运行。错误只是因为试图定义任务而发生。
我可以想到很多选项来处理这个问题,但对我来说,它们似乎都不对:
- 包裹
require 'rspec/core/rake_task'
在一个begin...rescue
块中并忽略错误 rspec
从组中取出或test
以其他方式强制将其安装在服务器上- 在部署期间使用仅包含
assets:compile
任务的不同 rakefile - 定义我自己的
spec
任务,调用时只需要 RSpec - 在本地而不是在服务器上运行预编译(我最喜欢这些选项)
这里有哪些最佳实践?