绕过捆绑器用于辅助开发宝石

时间:2011-04-23 14:26:49

标签: ruby-on-rails ruby rubygems bundler

在我的Rails项目的Gemfile中,我开始拥有像“ruby-debug19”,“perftools.rb”或“irbtools”这样的辅助宝石。所有这些都与项目无关,而是我本地开发设置的一部分。但由于我使用的是bundler,我无法加载这些宝石(即使它们是在系统范围内安装的),除非我将它们添加到Gemfile中。在我看来,这有点代码味道。

例如,我希望能够require 'irbtools' rails console {{1}}而不在我的Gemfile中添加“irbtools”。

有没有办法将辅助宝石保留在Gemfile之外,并且在需要时仍能加载它们以进行调试,分析等?

4 个答案:

答案 0 :(得分:3)

实际上,您可以在group中创建一个Gemfile,如:

group :auxiliary do
  gem 'irbtools'
end

如果您不想使用bundle install --without auxiliary,请使用irbtools。为什么你认为将它们添加到Gemfile是代码味?如果可以在不向Gemfile添加宝石的情况下执行此操作,我认为会有更多的代码气味。

答案 1 :(得分:3)

感谢this post我有一个很好的解决方案。

  1. 在Gemfile的末尾添加此行:

    eval(File.read(File.dirname(__FILE__) + '/Gemfile.local'), binding) rescue nil
    
  2. 创建一个名为Gemfile.local的文件。

  3. 将您的开发宝石添加到Gemfile local。例如:

    group :development do
      gem 'cucumber'
    end
    
  4. 将Gemfile.local添加到.gitignore。
  5. 现在,您可以添加辅助开发宝石,而无需为团队中的其他人更改Gemfile。很酷。

答案 2 :(得分:2)

我将下面的代码放在我的应用根目录中的一个文件中,因此很容易从irb加载。

如果你想要它像rails服务器那样,你可能需要将load语句添加到environments/development.rb等等。如果你不小心检查了它,那仍然会产生问题,但它不如烦恼必须将它添加到Gemfile并导致Gemfile.lock也改变。

# Example usage:
#   add_more_gems("ruby-debug-base19-0.11.26", "linecache19-0.5.13")
# or
#   add_more_gems(%w(ruby-debug-base19-0.11.26 linecache19-0.5.13))
#
# Note that you are responsible for:
# - adding all gem dependencies manually
# - making sure manually-added gem versions don't conflict with Gemfile.lock
# To list deps, run e.g. "gem dep ruby-debug-base19 -v 0.11.26"
#
def add_more_gems(*gem_names_and_vers)
  gem_names_and_vers.flatten!
  gem_base = File.expand_path(Gem.dir)

  gem_names_and_vers.each do |gem_name_and_ver|
    # uncomment if desired
    ###puts "Adding lib paths for #{gem_name_and_ver.inspect}"
    spec_file = File.join(gem_base, 'specifications', "#{gem_name_and_ver}.gemspec")
    spec = Gem::Specification.load spec_file
    this_gem_dir = File.join(gem_base, 'gems', gem_name_and_ver)
    spec.require_paths.each {|path| 
      dir_to_add = File.join(this_gem_dir, path)
      $: << dir_to_add  unless $:.member?(dir_to_add)
    }
  end
end

# put your often-used gems here
add_more_gems(
  %w(
    ruby-debug-base19-0.11.26
    ruby-debug-ide19-0.4.12
    linecache19-0.5.13
  )
)

答案 3 :(得分:0)

不确定这是否适合您。这取决于您是否使用RVM。如果是,那么您可以将这些辅助gem安装到为每个Ruby解释器自动创建的@global gemset中。默认情况下,@global gemset中的gem可用于所有项目特定的gemset。这样你就不需要弄乱你的Gemfiles了。