使用bundler时,如何在Gemfile中使用gem?

当一般使用带有项目的bundle和Rails时,你只能访问Gemfile中定义的gem。 虽然这是有道理的,但它可能是有限的。 当我想使用团队的其他成员不使用的某个RSpec格式化程序时,我发现它主要限制了它。 除非它在Gemfile中,否则无法访问。

任何方式或我必须将其添加到Gemfile?

更新:我的问题不是Bundler而是Spork。 在没有Spork的情况下运行RSpec时,我没有使用任何格式化程序的问题。

更新#2:看起来使用Bundler仍然是导致问题的原因。 使用Spork和不使用Spork之间的区别在于,在没有Spork的情况下运行RSpec时,它会在加载项目并进入Bundler“sandbox”之前加载格式化程序。

使用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 `' 

没有Bundler:

 $ irb >> require 'fivemat' => true 

我认为这些答案中没有一个被选为正确的,因为它们没有很好地解决问题:拥有额外的gem,你可以使用它默认情况下不需要对存储库中已有的文件进行任何更改来实现。 也就是说,您不必修改任何文件,也不必记住不检查本地更改。 我就是这样做的。

这个想法基本上颠倒了Holger的答案的依赖性,因此不需要修改共享的Gemfile。 Bundler允许指定哪个文件用作gemfile ,但奇怪的是,记录的方法显然不能使用其配置文件,也不会被修复 。 Bundler有一个模糊的function,任何配置选项都可以在环境变量中设置或在命令行上传递。 将所有命令作为bundle [command] --gemfile [yourgemfile]BUNDLE_GEMFILE="[yourgemfile]" bundle [command]将导致Bundler读取您想要的任何gemfile。 我强烈建议使用环境变量方法,并为当前会话创建别名或导出变量,特别是因为我无法使用带有“exec”命令的命令行开关。

因此,我像这样运行rspec: BUNDLE_GEMFILE="[mygemfile]" bundle exec rspec [filename] ,我把这个别名的第一部分作为bem放在我的bashrc中。 奇迹般有效。

然后,你应该设置你的源代码控制来忽略你的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。

在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从存储库中排除。

你可以在你的Gemfile中使用这样的东西:

 gem 'foo' if ENV['ENABLE_FOO_GEM'] 

然后在您的环境中设置ENABLE_FOO_GEM。

 export ENABLE_FOO_GEM=1 

默认情况下,gem将被禁用,但任何想要使用它的人都可以轻松打开(永久)。

如果你仍然决定这样做(可怕的想法):

您可以将ruby代码添加到Gemfile中以加载〜/ .gem文件(或类似文件)(如果存在)。

就像是:

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

添加到.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