如何为每个开发人员自定义Gemfile?

时间:2010-11-22 09:57:10

标签: ruby bundler

有一个共同的模式:

有许多开发人员在一个项目上工作,Gemfile(.lock)通过SCM共享。但是,如果一些开发人员想要使用不同的工具进行测试和开发呢?怎么做?

问题是,当您将条件部分放入Gemfile时,每个开发人员的Gemfile.lock也会有所不同,因此每次提交SCM时都会遇到冲突。

是否有一些简单,广泛认可的解决方案?

7 个答案:

答案 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

http://gembundler.com/groups.html

答案 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

请参阅http://bundler.io/v1.14/man/gemfile.5.html#INSTALL_IF

答案 6 :(得分:-1)

(与8月Lilleaas的评论基本相同:gitignore)

将默认/最小Gemfile放在SCM中,然后开发人员在他们的系统上更改它,永远不会提交。让他们将其添加到他们的SVN客户端中的非活动变更集(如果他们使用一个),其他SCM应该有类似的东西。

这就是我们在公司做到这一点的方法 - 效果很好:)。