簡體   English   中英

使用 bundler 時如何使用不在 Gemfile 中的 gems?

[英]How to use gems not in a Gemfile when working with bundler?

當將 bundler 用於一般項目,特別是 Rails 時,您只能訪問 Gemfile 中定義的 gem。 雖然這是有道理的,但它可能是有限的。 大多數情況下,當我想使用團隊其他成員不使用的某個 RSpec 格式化程序時,我發現它是有限制的。 除非它在 ​​Gemfile 中,否則它是不可訪問的。

有沒有辦法解決它,或者我必須將它添加到 Gemfile 中?

更新:我的問題不是 Bundler 而是 Spork。 在沒有 Spork 的情況下運行 RSpec 時,我可以使用任何我想要的格式化程序。

更新 #2:看起來使用 Bundler 仍然是問題的原因。 使用 Spork 和不使用 Spork 的區別在於,在沒有 Spork 的情況下運行 RSpec 時,它會在加載您的項目並進入 Bundler“沙箱”之前加載格式化程序。

使用捆綁器:

$ bundle exec irb
>> require 'fivemat'
LoadError: cannot load such file -- fivemat

from (irb):1:in `require'
from (irb):1
from /Users/arikfr/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'

沒有捆綁器:

$ irb
>> require 'fivemat'
=> true

ChiliProject 中,我們允許用戶創建一個Gemfile.local ,它在加載時包含在主Gemfile中。 這允許用戶指定額外的 gem,而無需更改我們的Gemfile以簡化更新。

為此,我們在 Gemfile 的底部包含了以下代碼。

gemfile_local = File.expand_path('Gemfile.local', __dir__)
if File.readable?(gemfile_local)
  puts "Loading #{gemfile_local}..." if $DEBUG
  instance_eval(File.read(gemfile_local))
end

Gemfile.local本身通過.gitignore從存儲庫中排除。

我認為這些答案都沒有被選為正確的,因為它們沒有很好地解決問題:默認情況下可以使用額外的 gems 不需要對存儲庫中已有的文件進行任何更改來實現. 也就是說,您不必修改任何文件,也不必記住不要簽入本地更改。 這是我如何做到的。

這個想法基本上是反轉 Holger 答案的依賴關系,這樣就不需要修改共享的 Gemfile。 Bundler 允許您指定將哪個文件用作 gemfile ,但奇怪的是,所記錄的方法顯然不能與其配置文件一起使用,並且不會被修復 Bundler 有一個有點模糊的特性,即任何配置選項都可以在環境變量中設置或通過命令行傳遞。 將所有命令作為bundle [command] --gemfile [yourgemfile]BUNDLE_GEMFILE="[yourgemfile]" bundle [command]將導致 Bundler 讀取您想要的任何 gemfile。 我強烈建議使用環境變量方法,並為當前會話創建別名或導出變量,特別是因為我無法將命令行開關與“exec”命令一起使用。

因此,我像這樣運行 rspec: BUNDLE_GEMFILE="[mygemfile]" bundle exec rspec [filename] ,並且我在我的 bashrc bem這個別名的第一部分稱為bem 奇跡般有效。

然后,你應該設置你的源代碼控制來忽略你的 Gemfile,要么在項目的 .gitignore 中,要么保持項目完全衛生而不改變它的 .gitignore,到你的個人全局忽略文件(默認情況下在~/.config/git/ignore並具有與項目的 gitignore 文件相同的格式)。

另一件需要注意的事情是 Bundler 將根據 Gemfile 的名稱創建一個鎖文件。 這非常方便,因為它可以防止您在簽入項目的 Gemfile.lock 時覆蓋它,但您也需要忽略這個新的鎖定文件。 如果您的 gemfile 是Foo.bar ,請查找Foo.bar.lock

最后,您可以在自定義 Gemfile 中執行類似於 Holger 的建議的操作:

source "http://rubygems.org"
gem "fivemat"
instance_eval(File.read(File.dirname(__FILE__) + "/Gemfile"))

只要你記得指定你的 Gemfile,你就可以開始了。

你可以在你的 Gemfile 中使用這樣的東西:

gem 'foo' if ENV['ENABLE_FOO_GEM']

然后只需在您的環境中設置 ENABLE_FOO_GEM。

export ENABLE_FOO_GEM=1

默認情況下,gem 將被禁用,但任何想要使用它的人都可以輕松地(永久地)打開它。

添加到.gitignore

Gemfile.local
Gemfile.local.lock

Gemfile.local.sample文件添加到項目中,內容如下:

# Include gems that are note meant to be part of the project but for development purposes
# That's why Gemfile.local and Gemfile.local.lock must be git-ignored

# To use these gems:
#   1. Create a "Gemfile.local" file (at same level of "Gemfile")
#   2. Prepend "BUNDLE_GEMFILE=Gemfile.local" before "bundle install" or "bundle exec rails c" and so forth.

eval_gemfile "./Gemfile"

group :development, :test do
  # Suggested gems
  gem "awesome_print", require:"ap"
  gem "hirb"
  gem "pry"
  gem "pry-byebug"
  gem "pry-rails"
  gem "meta_request"

  # My gems
  gem "fivemat"
end

如果您仍然決定這樣做(可怕的想法):

您可以將 ruby​​ 代碼添加到您的 Gemfile 以加載 ~/.gemfile(或此類)(如果存在)。

就像是:

eval(IO.read('~/.gemfile'), binding) if FileTest.exists?("~/.gemfile")

我相信 gem Devpack提供了您正在尋找的功能。

gem 允許您將單個 gem 添加到您的 Gemfile,這將允許任何開發人員通過創建包含 gem 列表的.devpack文件為單個項目或全局配置他們自己的首選開發 gem 集。

(我是這個 gem 的作者;我在開發它時遇到了這篇文章,所以認為它可能值得添加)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM