有一个共同的模式:
有许多开发人员在一个项目上工作,Gemfile(.lock)通过SCM共享。但是,如果一些开发人员想要使用不同的工具进行测试和开发呢?怎么做?
问题是,当您将条件部分放入Gemfile时,每个开发人员的Gemfile.lock也会有所不同,因此每次提交SCM时都会遇到冲突。
是否有一些简单,广泛认可的解决方案?
答案 0 :(得分:19)
我喜欢在我的Gemfile中使用它:
local_gemfile = File.dirname(__FILE__) + "/Gemfile.local"
if File.file?(local_gemfile)
require local_gemfile
end
我在gitignore中也有Gemfile.local和Gemfile.lock。我知道我不是“应该”,但我不认为这些警告(例如你在问题中提到的那些)是值得的。
截至2011年3月3日的Bundler 1.0.10更新
local_gemfile = File.dirname(__FILE__) + "/Gemfile.local.rb"
if File.file?(local_gemfile)
self.instance_eval(Bundler.read_file(local_gemfile))
end
我必须在Rails 3和Bundler 1.0.10中使用它。
答案 1 :(得分:3)
如果你签入一些依赖于gem的东西,gem应该在gemfile中。如果存储库中的代码不依赖于gem,则不需要在gemfile中使用它。因此,除非您的开发人员不检查他们的测试(这会很奇怪),否则如果您想要运行整个测试套件,则需要所有测试的依赖项。
如果宝石不是运行应用程序或其测试所必需的,那么宝石不需要在gem文件中。让每个开发人员创建一个gemset(我假设你正在使用RVM,如果你不应该),为应用程序安装他们需要的东西,然后只需添加应用程序运行到gemfile的内容。
答案 2 :(得分:3)
您可以使用Bundler的without
标记来排除群组。
如果您有以下Gemfile
group :jakubs_testing_tools do
gem "rspec"
gem "faker"
end
您可以使用bundle install
$ bundle install --without jakubs_testing_tools
答案 3 :(得分:2)
它现在对你没有帮助,但是对于Bundler来说,有一个开放的feature request可以添加对Gemfile.local的支持。它计划在1.x系列中的某个地方,所以请继续关注。
如果您的主要问题是特定于开发人员的IRB宝石,则问题comments中有几种解决方法。
答案 4 :(得分:0)
每个开发人员都可以创建自己的分支--Bundler可以正常使用具有不同Gemfile内容的不同分支。开发人员最好在分支名称前加上首字母,以避免混淆或冲突。
答案 5 :(得分:0)
我认为install_if
方法(最近添加)解决了这个问题:
install_if -> { `whoami`.strip == 'jakub' } do
gem "pry-rails"
end
答案 6 :(得分:-1)
(与8月Lilleaas的评论基本相同:gitignore)
将默认/最小Gemfile放在SCM中,然后开发人员在他们的系统上更改它,永远不会提交。让他们将其添加到他们的SVN客户端中的非活动变更集(如果他们使用一个),其他SCM应该有类似的东西。
这就是我们在公司做到这一点的方法 - 效果很好:)。