我正try 在rake任务中使用gem,但我不想在dev构建中包含它.所以不是在Gemfile的开发部分.

我不想把它包含在Gemfile中,因为它安装起来很慢,而且在M2Mac上并不总是能用.

所以我试着只将它包含在要使用它的rake任务中.

这是我精心设计的例子

namespace :utility do
  task contrived_test_funct: :environment do
    begin
      gem 'rmagick'
    rescue LoadError
      system("gem install rmagick")
      gem 'rmagick'
    end

    require 'RMagick'
    file_names = Dir.glob(File.join("/tmp", "**", "*"))
    file_names = file_names.select { |f| f.include?(".pdf") }
    file_names.each do |file_name|
      im = Magick::Image.read(file_name)
      im[0].write(filename.gsub(".pdf",".jpg"))
    end
  end
end

这应该只是在我的临时目录中的所有PDF,并吐出他们作为JPG.如果我的gem文件中有这个Ruby ,并且移除了Begin/Resue块,那么这一切都会在我的本地系统上发挥作用.

当我删除gefile更改并取消对Begin/Resue块的注释时,它发生了故障

我明白了

Gem::LoadError: rmagick is not part of the bundle. Add it to your Gemfile.

问:我怎么能只在Rails应用程序/repo中的特定rake任务中要求gem呢?

推荐答案

我有一个部分的解决方案.不是很完美,但它让我越过了底线.

您可以在Rails的gem文件中添加新的gem组

group :special_group, optional: true do
  gem 'rmagick'
end

然后,在rake任务中,您可以需要Ruby .您还可以捕获错误,并让您的开发人员同事知道如何安装gem.

begin
  require 'RMagick'
rescue LoadError
   abort("RMagick is selectively installed, Run `bundle config set --local with rmagick`" +
 "and then bundle install and this rake task again")
end

Ruby-on-rails相关问答推荐

仅当未在带有ENV[';Dyno';]的Heroku问题上运行时才初始化Sidekiq Cron

GO AES GCM加密在解密时出错&S

多行与内联块之间的不同行为

在 Rails 3.2 中更新多行

Ruby on Rails 取消首字母大写

上传图片 Ruby on Rails

运行多个 Rails Server 实例

添加自定义字段/列以使用 Rails 4 进行设计

简单表单关联自定义标签名称

Rails 3:验证组合值

在 Rails 中将表格行变成链接

使用 jQuery 在 Rails 中不显眼的动态表单字段

在 PostgreSQL 中强制字符串的最大长度

Rails Active Admin css 与 Twitter Bootstrap css 冲突

Rails Associations - has_many => :through - 但相同的模型

如何在 Rails 3 中将多个属性传递给 find_or_create_by?

何时使用 Helpers 而不是 Partials

ruby 方法名称中的变量

ArgumentError:ApplicationController 的副本已从模块树中删除,但仍处于活动状态

保存用户偏好的最佳方法?