Ruby 如何在Rails 4.2文件中有条件地加载本地gem?

Ruby 如何在Rails 4.2文件中有条件地加载本地gem?,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,我使用的是只以二进制形式分发的gem。因此,我们有两个版本(不是gem版本号,只是两个不同的二进制文件),我们必须以某种方式在我们的环境中有条件地加载,因为我们在osx上开发并部署在Linux(AWS)上 我将这些宝石提取到/vendor/gems,如下所示: chilkat-9.5.0.69-x86_64-darwin/ chilkat-9.5.0.69-x86_64-linux/ 我意识到我可以在Gemfile中设置开发组和生产组: group :development do gem

我使用的是只以二进制形式分发的gem。因此,我们有两个版本(不是gem版本号,只是两个不同的二进制文件),我们必须以某种方式在我们的环境中有条件地加载,因为我们在osx上开发并部署在Linux(AWS)上

我将这些宝石提取到
/vendor/gems
,如下所示:

chilkat-9.5.0.69-x86_64-darwin/
chilkat-9.5.0.69-x86_64-linux/
我意识到我可以在Gemfile中设置
开发
组和
生产
组:

group :development do
  gem 'chilkat', path: 'vendor/gems/chilkat-9.5.0.69-x86_64-darwin'
end

group :production do
  gem 'chilkat', path: 'vendor/gems/chilkat-9.5.0.69-x86_64-linux'
end
但这是失败的:

[!] There was an error parsing `Gemfile`: You cannot specify the same gem twice coming from different sources.
You specified that chilkat (>= 0) should come from source at `vendor/gems/chilkat-9.5.0.69-x86_64-darwin` and source at `vendor/gems/chilkat-9.5.0.69-x86_64-linux`
. Bundler cannot continue.
更重要的是,我无法让Bundler单独在
产品上正确运行,可能是因为它无法识别平台:

Could not find chilkat-9.5.0.69 in any of the sources
我不太了解gemspec文件,但也许最后一行:

--- !ruby/object:Gem::Specification
name: chilkat
version: !ruby/object:Gem::Version
  version: 9.5.0.69
platform: x86_64-linux
如果Bundler指定的平台与运行它的平台不同,则告诉Bundler跳过它

初始解决方案

由用户ulferts在下面介绍

if RUBY_PLATFORM =~ /darwin/
  gem 'chilkat', path: 'vendor/gems/chilkat-9.5.0.69-x86_64-darwin'
elsif RUBY_PLATFORM =~ /x86_64-linux/
  gem 'chilkat', path: 'vendor/gems/chilkat-9.5.0.69-x86_64-linux'
end
我一直试图检查
Rails.env
,但我不知道
RUBY\u平台
常量

但是

Bundler似乎有缺陷,缺乏灵活性。尝试部署到生产环境时,此操作失败:

You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.
因此,即使存在条件,似乎是
Gemfile.lock
文件导致了某种问题。这真的很不幸,因为我不认为这种合法的使用是一个边缘的情况

简言之,即使有条件,您也不能让同一个gem在您的Gemfile中列出两次。无论是针对不同的源、不同的版本还是两者

我尝试了其他方法:更改生产中的宝石名称。我更改了gempec文件中的目录名、gem名和引用。结果是:

You have added to the Gemfile:
* source: source at `vendor/gems/chilkatprod-9.5.0.69-x86_64-linux`
* chilkatprod

You have deleted from the Gemfile:
* source: source at `vendor/gems/chilkat-9.5.0.69-x86_64-darwin`
* chilkat

You have changed in the Gemfile:
* chilkat from `no specified source` to `source at
`供应商/gems/chilkat-9.5.0.69-x86_64-darwin``


所以突然之间,它看起来甚至不像现在的条件。我在代码中加入了一个条件,
需要
来实现这一点,但如果无法部署代码,我甚至无法实现。

如果的话,您可以使用安装


请参见这个
Gemfile
只是另一个ruby文件。如果你能找出你所使用的架构,你可以简单地把它包装成一个
If。。。其他
例如

if architecture_is_os_x?
  gem 'chilkat', path: 'vendor/gems/chilkat-9.5.0.69-x86_64-darwin'
else
  gem 'chilkat', path: 'vendor/gems/chilkat-9.5.0.69-x86_64-linux'
end

区别的一种可能性是在生产中设置一个env变量。

我刚刚花了5年时间(!!!)讨论了github的评论。。。显然,这一问题最终通过命令得以解决。“你试过这个吗?”汤姆洛德正是我所想的。一个很大的github线程,在这个问题上与b/w社区和其他成员有很多争论。在我读你的评论之前,我已经读了两年了。谢谢,我将发布结果。谢谢!这是一个好主意,但它实际上会产生相同的
错误。不能两次指定同一个gem。它不会让你从两个地方获得相同的宝石,即使是在有条件的情况下。