Ruby 如何为每个开发者定制Gemfile?

Ruby 如何为每个开发者定制Gemfile?,ruby,bundler,Ruby,Bundler,有一个共同的模式: 有许多开发人员在一个项目上工作,并且Gemfile(.lock)通过SCM共享。但是,如果一些开发人员想要使用不同的工具进行测试和开发,该怎么办?怎么做 问题是,当您将条件节放入Gemfile时,每个开发人员的Gemfile.lock也会不同,因此每次提交给SCM时都会发生冲突 是否有一些简单且被广泛认可的解决方案?每个开发人员都可以创建自己的分支-Bundler可以很好地处理具有不同文件内容的不同分支。开发人员最好在分支名称前面加上缩写,以避免混淆或冲突。如果签入依赖于ge

有一个共同的模式:

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

问题是,当您将条件节放入Gemfile时,每个开发人员的Gemfile.lock也会不同,因此每次提交给SCM时都会发生冲突


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

每个开发人员都可以创建自己的分支-Bundler可以很好地处理具有不同文件内容的不同分支。开发人员最好在分支名称前面加上缩写,以避免混淆或冲突。

如果签入依赖于gem的内容,gem应该在gem文件中。如果存储库中的代码不依赖于gem,那么就不需要将其包含在gem文件中。因此,除非您的开发人员不签入他们的测试(这会很奇怪),否则如果您想运行整个测试套件,您将需要所有测试的依赖项


如果运行应用程序或其测试不需要gems,那么gems不需要在gem文件中。只需让每个开发人员为应用程序创建一个gemset(我假设您正在使用RVM,如果您不需要,您应该这样做),并在那里安装他们需要的任何东西,然后只需将应用程序需要运行的东西添加到gemfile中。

我希望在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中使用它。

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

将默认/最小GEM文件放在SCM中,然后让开发人员在他们的系统上更改它,并且从不提交。让他们将其添加到SVN客户机中的非活动变更集中(如果他们使用),其他SCM也应该有类似的内容


这就是我们在我的公司如何做到这一点-效果非常好:)

您可以使用Bundler的
,而不使用
标志来排除组

如果您有以下文件

group :jakubs_testing_tools do
  gem "rspec"
  gem "faker"
end
您可以通过
bundle安装将其排除在外

$ bundle install --without jakubs_testing_tools

现在它对您没有帮助,但是Bundler已经开放了很久,可以添加对Gemfile.local的支持。它计划在1.x系列中的某个地方使用,所以请继续关注


如果您的主要问题是特定于开发人员的IRB gems,那么该问题的解决方案有两个。

我认为
install\u If
方法(最近添加)解决了问题:

install_if -> { `whoami`.strip == 'jakub' } do
  gem "pry-rails"
end


看到

我很高兴听到bundler让我恼火的不仅仅是我自己……事实上,我并不是真的让它恼火;],与此相反,这是一项非常年轻的技术,其文档也不是很详细(加上可能选项不太丰富),问题仍然是Gemfile.lock,rvm文档建议将其签入。。。因此,在本地忽略它可能是一个临时修复。您应该在Gemfile.lock中检查应用程序,但(可能)不检查Gems。阅读此文:对于那些想知道为什么首先要这样做的人:这是一个例子,我相信还有其他例子。如果开发人员在开发中使用不同的数据库引擎呢?他们为什么要这样做?每个人都有自己的偏好,但你必须务实。@user438962在某些情况下,有各种各样的原因让你更喜欢sqlite而不是postgres——主要是,易用性开发人员不应该在开发中使用不同的数据库引擎!ORM并不完美,代码可能会在一个数据库环境中工作,而不是在另一个数据库环境中工作。本地环境也应该镜像生产,因此使用与生产相同的数据库引擎。无论如何,这个答案都是胡说八道。有很多宝石与项目的代码完全无关。IRBTOOLS就是一个很好的例子。我应该能够将它作为我的环境的一部分,而不是强迫我的团队中的每个人都通过Gemfile拥有它。让rvm在全局gemset中包含这样一个gem是不够的,因为rails控制台将在bundler不明确知道需要它的情况下崩溃(换句话说,它必须在项目gemfile中)。在我看来,Bundler有一个很大的问题。创建分支只是为了规避Bundler中的疏忽?讨厌。我知道Git中的分支很便宜,但它仍然增加了开销。我认为这是一种反SCM使用模式——很抱歉这么说。这不是Bundler中的疏忽。Bundler背后的整个想法是冻结所有依赖项,以便每个人都能获得相同的环境!这听起来很公平,但我们在团队中只有5名,所以规模不大,但这当然是可行的。。。但是,Gemfile.lock会受到什么影响?如何影响?/home/jake/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/site\u ruby/1.8/rubygems/custom\u require.rb:29:in`gem\u original\u require':没有这样的文件要加载--/home/jake/code/fullstop/Gemfile.local(LoadError)您对Gemfile.lock文件做了什么?我试图在我的组织中部署它,但意识到它会在开发人员分支之间发生变化。在推到Heroku时,我是唯一一个失败的人吗?(抱怨Gemfile和Gemfile.lock之间存在差异)无论是谁给了-1,请(始终)说明原因。这并不能解决开发人员之间差异Gemfile.lock文件的问题(应该签入,OP说他们正在这样做)。开发人员只能提交对Gemfile.lock的某些更改,但这很难实现。就是它不受支持。你链接的解决方法或这里的主要答案都是很好的选择,这很糟糕,因为你的Gemfile.lock中会有所有这些垃圾…aa问题被拒绝并解决了,现在,尽管有一些解决方法。。。