bundler Rails在开发中需要不同的gem

时间:2012-02-28 00:29:37

标签: ruby-on-rails ruby rubygems bundler

我正在尝试建立一个开发Rails gem的开发环境。我想在开发模式下从本地源加载gem并在生产中通过rubygems加载。我想做类似以下的事情:

的Gemfile

group :production do
  gem 'my_gem', '1.0.0'
end

group :development do
  gem 'my_gem', :path => '~/apps/my_gem'
end

当我运行bundle命令时,bundler会抱怨你无法加载两次相同的gem。有没有办法根据Rails环境要求不同版本的gem?

3 个答案:

答案 0 :(得分:22)

我遇到了同样的问题并且这样解决了:

if ENV["RAILS_ENV"] == "development"
  gem 'my_gem', :path => '~/apps/my_gem'
else
  gem 'my_gem', '1.0.0'
end

然后您可以在本地计算机上运行RAILS_ENV=development bundle并通过RAILS_ENV=development bundle exec运行任何与环境相关的命令

答案 1 :(得分:9)

这样做会破坏使用Bundler 的目的。重点是,无论您的应用程序在何处加载,您使用的依赖关系都是一致的,故意试图规避该目标只会给您带来问题。

当您的本地版本的gem与Rubygems中发布的版本不同时(或许是因为您忘记发布新版本?)会发生什么?你的应用程序可能会爆炸,你将无法在开发中重现它,这是可怕的

至于为什么用Bundler(至少现在)实现这个甚至是不可想象的:如果在Rubygems版本和本地版本中Gem的依赖版本不同,会发生什么?现在你的整个Gemfile.lock需要有两个完全不同的依赖图,并且你可能会在开发中不存在更多的生产失败点。

也就是说,在更改gem时,暂时将Gemfile更改为本地版本是可以的,但您应该将其更改回来并发布新版本的gem,然后{{1相应地更新Gemfile.lock。

答案 2 :(得分:-5)

可能是你把宝石'my_gem'放在其他地方,仔细检查一下