【问题标题】:Conditional ruby gem dependencies within a gemspecgemspec 中的条件 ruby​​ gem 依赖项
【发布时间】:2016-03-06 15:09:56
【问题描述】:

我正在构建一个在迁移中使用外键的 Rails 引擎。

    add_foreign_key "theblog_content_nodes",
                    "theblog_content_statuses", column: :content_status_id

4.2 版本开始,rails 本身支持外键,但在我们使用foreigner gem 之前。如果我们尝试将foreignerrails 4.2 和更新版本一起使用,则会出现错误。

因此,由于我要从 4.0.1 开始支持 rails,我必须在我的 gemspec 中使用条件依赖。

我找到了可能的解决方案 here,但我不知道如何在 gemspec 中检查 rails 版本。

# sidekiq-spy.gemspec

if RUBY_VERSION >= '2.1'
  spec.add_development_dependency "curses", "~> 1.0"
end

注意:

我有另一个临时解决方案:我只是在迁移中检查Foreigner 的可用性。如果它不可用,我只是不创建外键:

if defined?(Foreigner)
  add_foreign_key "theblog_content_nodes",
                  "theblog_content_statuses", column: :content_status_id
end

但我想为旧的 rails 版本添加 foreigner 依赖项。

【问题讨论】:

  • 您是否考虑过为该场景提供两个不同版本的 gem?
  • @iltempo,我什至可以在两种情况下都使用一个版本。只需添加注意,如果 Rails 版本小于 4.2 并且我们想使用外键,我们必须将 gem "foreigner" 添加到 Gemfile

标签: ruby rubygems gemspecs


【解决方案1】:

要访问 rails 版本,我们可以使用以下内容(基于this answer):

require 'rubygems'

rails_gem = Gem::Specification.select {|z| z.name == "rails"}.max_by {|a| a.version}
p rails_gem.version.version
#=> "4.2.5"

【讨论】:

  • 不幸的是,我们似乎无法访问 gemspec 中的Rails。我刚刚收到以下错误:uninitialized constant Rails from /Users/kont/projects/theblog/theblog.gemspec:21:in 'block in <main>'
  • 更新了使用rubygems API 的答案。请检查这是否适合您
  • 我在引擎本身和使用该引擎的应用程序中都尝试了这个。它似乎工作正常。谢谢!
  • 最近 CI 失败并出现以下错误:There was a NoMethodError while loading theblog.gemspec: undefined method version' for nil:NilClass from /Users/kont/projects/drevo/theblog/theblog.gemspec:26:in block in <main>' 我发现Gem::Specification 还不包含 Rails
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多