Rspec 我应该如何构造一个包含一些需要在部署期间运行的任务和其他可以';甚至在部署期间都无法定义?

Rspec 我应该如何构造一个包含一些需要在部署期间运行的任务和其他可以';甚至在部署期间都无法定义?,rspec,rake,capistrano,bundler,sprockets,Rspec,Rake,Capistrano,Bundler,Sprockets,我正在使用一个简单的(或者我认为是这样的)Sinatra应用程序,它在应用程序开发/部署周期的不同阶段使用了一些宝石: 用于管理依赖项的Bundler Rake用于构建任务 用于资产预编译的链轮 RSpec 2用于测试 卡皮斯特拉诺部署中心 GEM文件包括rspec在test组中 Rakefile定义了一个assets:compile任务,用于将Sass转换为CSS,将CoffeeScript转换为JavaScript,并连接生成的文件 Capistrano运行bundle安装--无需开发测

我正在使用一个简单的(或者我认为是这样的)Sinatra应用程序,它在应用程序开发/部署周期的不同阶段使用了一些宝石:

  • 用于管理依赖项的Bundler
  • Rake用于构建任务
  • 用于资产预编译的链轮
  • RSpec 2用于测试
  • 卡皮斯特拉诺部署中心
GEM文件包括
rspec
test
组中

Rakefile定义了一个
assets:compile
任务,用于将Sass转换为CSS,将CoffeeScript转换为JavaScript,并连接生成的文件

Capistrano运行
bundle安装--无需开发测试
,这样生产服务器上只安装生产(和资产编译)所需的gem。它还运行Cap任务,最终在服务器上运行
bundle exec rake assets:compile

到目前为止,这一切都很好,但我想将RSpec Rake任务添加到我的Rakefile中,这就是问题所在。当我在本地运行时,它工作正常,但是当我运行
capdeploy
时,我在服务器上得到一个错误:
没有这样的文件要加载--rspec/core/rake_task

这是有道理的:当我们安装捆绑包时,服务器上没有安装RSpec,并且spec任务实际上永远不会在那里运行。错误的发生仅仅是因为试图定义任务

我可以想出很多办法来处理这个问题,但在我看来,没有一个是完全正确的:

  • 要求的'rspec/core/rake_task'
    包装在
    开始…救援
    块中并忽略错误
  • rspec
    test
    组中取出,或者强制将其安装到服务器上
  • 在部署期间使用不同的rakefile,该rakefile仅包括
    资产:编译任务
  • 定义我自己的
    spec
    任务,该任务在调用时只需要RSpec
  • 在本地而不是服务器上运行预编译(这些选项中我最喜欢的)

这里的最佳实践是什么?

我会通过这样做来解决这个问题

require 'rspec/core/rake_task' if defined?(RSpec)

理由很简单。其他解决方案可能也足够了,但我的意见是,它们增加的复杂性大于灵活性。如果将来出现更多类似的情况,我会考虑寻找替代解决方案。

就我个人而言,鉴于Rake在服务器上不经常被调用,我会保持它的简单性,并使用
rescue

begin
  require 'rspec/core/rake_take'
rescue LoadError
end

我不知道为什么Rails从来没有遇到过这个问题。

我遇到了几乎相同的问题

不确定这是否是“最佳实践”,但我最终在Rakefile中做到了这一点:

if (Rails.env.migration? || Rails.env.production?)
  # define rake tasks that depend on gems installed only in dev/test envs
end

(我使用一个单独的环境进行迁移,该环境指向与生产相同的数据库,但具有进行架构更改所需的更高数据库权限。)

不幸的是,这不起作用,因为只有在我已经需要RSpec的情况下,才会定义RSpec!我希望避免这种情况,因为我在生产中“知道”它将不可用,并且尝试搜索加载路径并忽略故障似乎是毫无意义和笨拙的。然而,这是大多数人提出的解决方案,所以我将随大流顺便说一句,如果您将rspec-rails与rails一起使用,那么它定义了自己的Rake任务,当rspec-rails本身被加载时,该任务将自动加载。因此,当您将rspec-rails放入GEM文件的测试组时,这一切都“正常工作”。因此,
rspec-rails
就是我从未遇到过这个问题的原因。很高兴知道。