在我的Rails项目的Gemfile
中,我开始拥有像“ruby-debug19”,“perftools.rb”或“irbtools”这样的辅助宝石。所有这些都与项目无关,而是我本地开发设置的一部分。但由于我使用的是bundler,我无法加载这些宝石(即使它们是在系统范围内安装的),除非我将它们添加到Gemfile中。在我看来,这有点代码味道。
例如,我希望能够require 'irbtools'
rails console
{{1}}而不在我的Gemfile中添加“irbtools”。
有没有办法将辅助宝石保留在Gemfile之外,并且在需要时仍能加载它们以进行调试,分析等?
答案 0 :(得分:3)
实际上,您可以在group
中创建一个Gemfile
,如:
group :auxiliary do
gem 'irbtools'
end
如果您不想使用bundle install --without auxiliary
,请使用irbtools
。为什么你认为将它们添加到Gemfile
是代码味?如果可以在不向Gemfile
添加宝石的情况下执行此操作,我认为会有更多的代码气味。
答案 1 :(得分:3)
感谢this post我有一个很好的解决方案。
在Gemfile的末尾添加此行:
eval(File.read(File.dirname(__FILE__) + '/Gemfile.local'), binding) rescue nil
创建一个名为Gemfile.local的文件。
将您的开发宝石添加到Gemfile local。例如:
group :development do
gem 'cucumber'
end
现在,您可以添加辅助开发宝石,而无需为团队中的其他人更改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了。