Ruby on rails 如何为开发和生产指定不同版本的gem

Ruby on rails 如何为开发和生产指定不同版本的gem,ruby-on-rails,ruby,ruby-on-rails-3,heroku,Ruby On Rails,Ruby,Ruby On Rails 3,Heroku,我需要开发和生产不同版本的gem,所以我在gem文件中放了以下内容 group :development, :test do gem 'rspec-rails', '2.11.0' gem 'bcrypt-ruby', '3.1.2' end group :production do gem 'rails_12factor' gem 'bcrypt-ruby', '3.0.1' end 但是如果我尝试进行捆绑安装,甚至仅仅是rails控制台,我就会得到上面的错误 我试过了

我需要开发和生产不同版本的gem,所以我在gem文件中放了以下内容

group :development, :test do
  gem 'rspec-rails', '2.11.0'
  gem 'bcrypt-ruby', '3.1.2'
end

group :production do
  gem 'rails_12factor'
  gem 'bcrypt-ruby', '3.0.1'  
end
但是如果我尝试进行
捆绑安装
,甚至仅仅是
rails控制台
,我就会得到上面的错误

我试过了

bundle install --without production
但我还是收到了错误信息。 供参考: 我之所以需要这样做,是因为我正在学习rails教程,windows、ruby 2.0.0、bcrypt和Heroku之间出现了冲突 因此,我在windows上使用bcrypt 3.1.2(对活动记录文件进行了修改) Heroku上的bcrypt 3.0.1

有关更多详细信息,请参见:

我基本上做了第一个答案中提到的事情

编辑

###################################################################
正如下面的答案所指出的,我真的应该在生产和开发中使用相同的版本(即使我只是在教程中工作)。 我最后做的是给ActiveModel打补丁

gem 'bcrypt-ruby', '3.1.2'
而不是

gem 'bcrypt-ruby', '~> 3.0.0'
在安全密码中

我通过使用_3_1_2.rb将以下内容放在lib/secure_password_中实现了这一点

module ActiveModel
  module SecurePassword
    extend ActiveSupport::Concern

    module ClassMethods

      def has_secure_password
        # Load bcrypt-ruby only when has_secure_password is used.
        # This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library.
        #gem 'bcrypt-ruby', '~> 3.0.0'
        gem 'bcrypt-ruby', '3.1.2'
        require 'bcrypt'

        attr_reader :password

        validates_confirmation_of :password
        validates_presence_of     :password_digest

        include InstanceMethodsOnActivation

        if respond_to?(:attributes_protected_by_default)
          def self.attributes_protected_by_default
            super + ['password_digest']
          end
        end
      end
    end
  end
end
然后将以下内容添加到config/environment.rb

require File.expand_path('../../lib/secure_password_using_3_1_2.rb', __FILE__)

简单的回答是,你不能轻易做到这一点。Bundler旨在强制所有GEM在开发和生产之间使用相同的版本。使用不同的版本可能会导致细微的错误

为什么不想在生产环境中运行3.1.2?

这个怎么样

gem "my_gem", ENV["RAILS_ENV"] == "production" ? "2.0" : "1.0"

RAILS_ENV=production bundle

我知道我来晚了,但我到处都找不到答案

我试图找到这个问题的答案,因为我想在我的登台环境中部署一个预发布的gem,在我的生产环境中部署一个完整的gem版本。在发布之前,我不想让我的生产环境使用“1.0.2.pre1”之类的东西,因此我的版本是“1.0.2”。原因说来话长:)


如果您有分配变量的dev/test组,它只会运行该块。

您说您得到了“上面的错误”,但您没有提供错误。对不起。。。这是我的标题,但太长了。基本上,它抱怨gem文件中有两个版本。我现在不在电脑旁,所以我现在无法给出确切的信息。我正在heroku上使用rails 3.2.16,它要求在has_secure_password.rb中使用bcrypt«3.0.0。我在windows安装中入侵了该文件。我想我不能在制作中这样做,或者我可以提供一个替代的has_secure_password.rb吗?我想这是可行的。我会将其标记为答案,但我认为“正确”的解决方案是我在编辑的问题版本中所做的猴子补丁。当它进入生产时,这将不起作用,因为当您运行
捆绑安装
并提交新的
Gemfile.lock
3.1.2
版本将写入其中,并随后用于生产。
version = "3.0.1"

group :development, :test do
    version = "~> 3.1.2"
end

gem 'bcrypt-ruby', version