2017-10-05 67 views
1

我正在使用僅以二進制形式分發的gem。因此,我們有兩個版本(不是gem版本號,只是兩個不同的二進制文件),我們必須以某種方式有條件地在我們的環境中加載,因爲我們在OS X上開發並在Linux(AWS)上部署。如何在我的Rails 4.2 Gemfile中有條件加載本地gem?

我有這些寶石提取到<app_root>/vendor/gems像這樣:

chilkat-9.5.0.69-x86_64-darwin/ 
chilkat-9.5.0.69-x86_64-linux/ 

我意識到,我可以設置的Gemfile一個development組和production組:

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. 

更重要的是,我不能讓ŧ他捆紮機對production一個本身運行正常,也許是因爲它不能識別平臺:

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如果指定與運行的平臺不同的平臺,則跳過它。

初始解

由用戶下面歐化。

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_PLATFORM不變的。

然而

捆紮機顯得不足,這裏缺乏靈活性。這種失敗在試圖部署到生產:

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文件導致那裏是某種問題。這真的很不幸,因爲我認爲這種合法使用並非如此。

總之,即便是有條件,你不能在你的Gemfile列出兩次相同的寶石。無論是不同的來源,不同的版本,還是兩者。

我嘗試別的東西:改變生產寶石的名稱。我更改了目錄名稱,寶石名稱和gemspec文件中的引用。其結果是:

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 

'供應商/寶石/奇爾卡特-9.5.0.69-x86_64的-darwin``

那麼突然,它看起來像它甚至沒有像現在條件。我在require這個代碼中加入了一個條件來實現這一點,但是如果代碼無法部署,我甚至無法到達那裏。

+1

我只是通過github評論討論這個問題的5年(!!!)...顯然終於用['bundle lock --add-platform']解決了(https://bundler.io /v1.15/man/bundle-lock.1.html)命令。你試過這個嗎? –

+1

@TomLord正是我在想什麼。一個很大的github線程,有很多關於這個問題的論據b/w社區和其他成員。 – kiddorails

+0

我在閱讀您的評論前經歷了2年。謝謝,我會發布結果。 – AKWF

回答

2

Gemfile是另一個紅寶石文件。如果你能弄清楚你所在的架構,你可以簡單地將它包裝在if ... else

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變量。

+0

不起作用。它不會讓你從兩個地方獲得同樣的寶石,即使是在有條件的地方。 – AKWF

相關問題