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

Pat*_*ann 10 ruby rubygems ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

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

mca*_*mir 22

我有同样的问题并解决了这样的问题:

if ENV["RAILS_ENV"] == "development"
  gem 'my_gem', :path => '~/apps/my_gem'
else
  gem 'my_gem', '1.0.0'
end
Run Code Online (Sandbox Code Playgroud)

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


And*_*all 9

这样做会破坏使用Bundler的目的.重点是,无论您的应用程序在何处加载,您使用的依赖项都是一致的,故意试图规避该目标只会导致您遇到问题.

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

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

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