首页 文章

Bundler:您正在尝试在更改Gemfile后以部署模式安装

提问于
浏览
75

我对bundler和capistrano很陌生,我正试图一起使用它们 . 当我尝试部署时,我收到消息:

您正在尝试在更改Gemfile后以部署模式安装 . 在别处运行`bundle install'并将更新的Gemfile.lock添加到版本控制 .

我不抱怨,我不明白为什么投诉会出现,因为我在the doc中读到:

如果Gemfile.lock确实存在,并且您已更新Gemfile(5),则bundler将使用Gemfile.lock中的依赖项来处理您未更新的所有gem,但会重新解析您所执行的gem的依赖项更新 . 您可以在CONSERVATIVE UPDATING下找到有关此更新过程的更多信息 .

我认为这意味着Bundler可以处理我的Gemfile不是它预期的事实 . 有帮助吗?

规格:Ruby 1.9.3,Rails 3.2.3,Capistrano 2.12.0,Bundler 1.1.4,Windows 7,部署到Posix机器 .

Edit: 我的Gemfile包含如下逻辑块:

unless RbConfig::CONFIG['host_os'] === 'mingw32'
  # gem 'a' ...
end

17 回答

  • 0

    尝试推送到Heroku时,我收到了错误消息 . 我找到了以下解决方案 .

    • Git pull origin master

    • Git状态

    • Git提交

    • Git push origin master

    • Git push heroku master

  • 0
    rm -fr .bundle
    

    解决了我的问题 .

  • 1

    我的具体问题与@JoshPinter报告的内容有关,即dev-vs-deploy主机在bundler用于从github检索gems的协议中存在差异 .

    长话短说,我只需修改以下 Gemfile 条目......

    gem 'activeadmin', github: 'activeadmin'
    

    ...到这种安全语法(see reference):

    gem 'activeadmin', git: 'https://github.com/activeadmin/activeadmin.git'
    

    我的部署恢复正常 .

  • 1

    执行此命令后,您可以再次执行常规捆绑安装:

    bundle install --no-deployment
    
  • 0

    我遇到了类似的问题但是我做了 bundle installbundle update 并且Heroku仍然拒绝了我的推动 .

    我通过删除Gemfile.lock然后再次运行_453145来解决了这个问题 . 然后我添加,承诺并将其推送到我的git repo . 在那之后,我没有问题推向Heroku .

  • 10

    您收到的有关 Gemfile.lock 的错误消息可能是因为您上次运行 bundle install (或 update )后,您的_373110_和 Gemfile.lock 已经改变了Gemfile中的内容 . 当您 bundle install 时,它会使用您对Gemfile所做的任何更改来更新您的Gemfile.lock .

    确保在本地运行 bundle install ,并在此之后签入源代码控制新更新的 Gemfile.lock . 然后尝试部署 .

    Edit :正如评论中所认识到的那样,Gemfile中的条件在一个平台上导致了有效的Gemfile.lock,在另一个平台上无效 . 在Gemfile中为这些与平台相关的gem提供:platform标志应解决不对称问题 .

  • 68

    此问题可能与指向旧版本代码的子模块有关 . 对我来说,我通过更新我的子模块解决了这个问题

    如果您有子模块,请尝试运行:

    git submodule update --init

    bundle install

  • 22

    我的解决方案与此处列出的其他解决方案略有不同 . 我试图从sidekiq升级到sidekiq-pro(需要捆绑器1.7.12),但是我一直收到来自travis-ci的“你正在尝试在部署模式下安装后更改你的Gemfile”消息

    检查travis-ci的控制台输出显示正在使用旧版本的bundler .

    就我而言,我必须编辑travis.yml文件来添加:

    before_install: - gem update bundler

    这迫使travis-ci使用最新版本的bundler,并使错误消息消失 .

  • 4

    错误的另一个原因:

    这有点愚蠢,但我相信别人会犯同样的错误 .

    对于Rails 4 Heroku添加了gem rails_12factor . 如果你在添加它之前使用它,那么你将拥有这两个宝石:

    gem 'rails_log_stdout',  github: 'heroku/rails_log_stdout'
    gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
    

    添加新文件时必须删除它们 . (他们被包括在内) . 我认为你可以逃脱它,直到你触摸他们的宝石文件中的行,然后Heroku注意到重复并呼吁上述错误 .

    Rails 4祝你好运 .

  • 16

    注意全局Bundler配置 .

    我在 ~/.bundle/config 中的开发环境中进行了全局配置,这在我的CI / 生产环境 环境中没有导致我的开发环境中生成的 Gemfile.lock 与我的CI / 生产环境 环境中生成的_453121不同 .

    在我的情况下,我在我的开发环境中将 github.https 设置为true,但在我的CI / 生产环境 环境中没有这样的配置 . 这导致两个 Gemfile.lock 文件不同 .

  • 3

    vi .bundle / config

    将BUNDLE_FROZEN选项从“1”更改为“0”

    做“捆绑安装”


    要么

    运行“捆绑配置”

    查看“冻结”值是否为true将其设置为false

    bundle config frozen false

  • 4

    当你看到以下内容......

    $ bundle install
    You are trying to install in deployment mode after changing
    your Gemfile. Run `bundle install` elsewhere and add the
    updated Gemfile.lock to version control.
    
    If this is a development machine, remove the Gemfile freeze
    by running `bundle install --no-deployment`.
    
    You have added to the Gemfile:
    * source: rubygems repository https://rubygems.org/
    * rails (~> 3.2)
    . . .
    

    ...然后,问题很可能是您的供应商/缓存目录中的.gem文件已过时 .

    也许,你以前跑了 $bundle install --deployment 哪个放了一些"outdated" .gem文件在缓存中?

    无论如何,您可以通过运行以下命令来解决此错误: bundle install --no-deployment

    这是Rails的众多优点之一......错误消息通常会告诉您如何解决问题 .

  • 0

    我之前碰到过类似的东西 . 我认为,修复它的一种方法是运行,但是服务器上的空间可能比你想要的多

    bundle install --deployment
    

    然后尝试部署 . 这有点像将所有宝石安装到供应商文件夹中,我认为通常很好避免......但仍然可能有效 . 我的应用程序曾经表现得像这样,我的解决方案是从我的Gemfile中删除要下载的确切版本,然后重新绑定和部署 .

    gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git', :branch => 'master'
    

    gem 'rails_admin'
    

    或者您可以按照它的建议进行操作,并将您的项目从 生产环境 服务器上Git到本地计算机上,捆绑它,然后重新插入您的服务器 . 这个解决方案可能不是100%正确,但其中一些对我有用...只是想我会分享 . 祝好运

  • 1

    在我们的例子中,我们使用的是在我们的 生产环境 机器上运行的旧版本bundler中没有的功能 . 因此,升级捆绑包就足够了,即做一个 gem update bundler .

  • 0

    这可能是一个危险的想法,但如果绝对必须在 生产环境 部署环境中测试某些东西,则可以编辑.bundle / config文件

    # This value is normally '1' 
    # Set it to '0'
    BUNDLE_FROZEN: '0'
    

    现在调用bundle,在我的情况下我需要更新一个特定的gem,所以这是我的命令

    RAILS_ENV=production bundle update <whatever gem>
    

    您可能应该在更新后将其更改回来,这样事情就会发生,就像您期望的那样 . 同样,这可能是不受支持的,而YMMV

  • 0

    在一些宝石更新后,我遇到了部署Nesta应用程序的问题 . 对我有用的是 delete the Gemfile.lock ,运行 bundle install 重新生成它,然后重新部署 .

  • 1

    对于heroku,您不必更改 Gemfile 中的语法 . 你可以添加 BUNDLE_GITHUB__HTTPS (注意双下划线)作为环境变量并将其设置为 true (在 Config Vars 部分的 Settings 选项卡下的heroku应用程序的仪表板中) . 对于所有此类请求,这会将协议从 git:// 切换到 https:// .

相关问题