我正在使用僅以二進制形式分發的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
這個代碼中加入了一個條件來實現這一點,但是如果代碼無法部署,我甚至無法到達那裏。
我只是通過github評論討論這個問題的5年(!!!)...顯然終於用['bundle lock --add-platform']解決了(https://bundler.io /v1.15/man/bundle-lock.1.html)命令。你試過這個嗎? –
@TomLord正是我在想什麼。一個很大的github線程,有很多關於這個問題的論據b/w社區和其他成員。 – kiddorails
我在閱讀您的評論前經歷了2年。謝謝,我會發布結果。 – AKWF