2016-07-06 88 views
1

我已經做了一些挖掘rubygems的代碼,它看起來並不像是有一種內置的方法,即使它有一個也不會拋出Gem::ConflictError。在開發過程中,我可能想要測試一些我知道不會觸及衝突即將發生的代碼的東西,或者我知道任何衝突的gem版本都不會導致問題。我只想繼續測試我想測試的內容,稍後我會擔心版本衝突。我可以讓rubygems忽略寶石版本衝突嗎?

我知道我可以破解rubygems來做到這一點。我可以考慮或多種方式來完成它。我只是有點好奇,如果有人已經這樣做,他們是如何做到的,也許如果該代碼已被分享到某個地方。我也有點好奇,爲什麼這不是作爲開發工具內置於rubygems的。

+0

也許[this](http://stackoverflow.com/questions/16741935/how-to-tell-bundler-to-ignore-gems-that-dont-exist#16742178)幫助你,使用'require: Gemfile中每個gem的false參數。 – AxelWass

回答

2

在完成任何事情之前,您現在需要擔心版本衝突。由於Ruby具有單獨的根名稱空間,並且每個依賴項都被加載,所以通常不可能加載相同gem的多個版本。像Node.js的NPM等其他系統更加靈活,可以同時加載任意數量的版本,因此如果習慣了這種情況,則需要調整您的期望。

如果您正在嘗試進行測試,並且想要避免解決衝突,請暫時從Gemfile中刪除gem要求。

最終你必須解決問題,這是沒有辦法的,但你總是可以選擇你需要的東西。

+1

同意。最好先確定衝突的起始位置,然後根據錯誤的假設編寫大量代碼,將事情鎖定到位並使其更難以回溯。 –

+0

加載多個版本的代碼是完全可能的。 rubygems試圖管理這個事實是輔助的,而不是Ruby固有的。在某些情況下,這可能是不可取的,但一點也不難。我試圖暗示,最終,是的,衝突需要解決(因此「發展中......」)。重點在於,有時候你有一些想要處理**的東西,並且必須忘記所有這些,並且解決**你不知道的衝突**現在**只是適得其反。所以,我不同意這裏。 – Huliax

+0

首先,僅僅因爲它可以被理論化*並不意味着它實際上是可行的。一個正確編碼的寶石可能會被重新命名。許多人不會因爲他們認爲他們可以控制他們指定的命名空間。如果同時加載兩個不同版本的gem,則會產生衝突,並且隨着與Ruby核心綁定的YAML解析器與gem版本反覆顯示的不斷摩擦,它可能會變得混亂。這是Ruby世界中一個超級棘手的問題。 – tadman

0

如果你真的知道自己在做什麼,試試這個:

export NOEXEC_DISABLE=1 
ruby you-program.rb 

這個環境變量將禁用搜索和檢查Gemfiles和寶石版本。

+0

有點霸道......但我喜歡它!下次我需要時我會嘗試一下。 – Huliax