[英]Bundler how to require gems separately in Gemfile just in one file?
[英]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.