我对 bundler 和 capistrano 很陌生,我正在尝试将它们一起使用。当我尝试部署时,我收到以下消息:
您尝试在更改 Gemfile 后以部署模式安装。在别处运行 `bundle install' 并将更新的 Gemfile.lock 添加到版本控制中。
我不知道如何满足抱怨的系统,我不明白为什么会出现抱怨,因为我在 the doc 中读到:
如果 Gemfile.lock 确实存在,并且您已更新 Gemfile(5),则捆绑程序将使用 Gemfile.lock 中的依赖项来处理您未更新的所有 gem,但将重新解析您更新的 gem 的依赖项.您可以在下面的保守更新下找到有关此更新过程的更多信息。
我将其解释为 Bundler 可以处理我的 Gemfile 与预期不同的事实。有什么帮助吗?
规格:Ruby 1.9.3、Rails 3.2.3、Capistrano 2.12.0、Bundler 1.1.4、Windows 7,部署到 Posix 机器。
编辑:我的 Gemfile 包含如下逻辑块:
unless RbConfig::CONFIG['host_os'] === 'mingw32'
# gem 'a' ...
end
您收到有关 Gemfile.lock
的错误消息可能是因为您的 Gemfile
和 Gemfile.lock
彼此不一致。自上次运行 bundle install
(或 update
)以来,您的 Gemfile 中似乎发生了一些变化。当您 bundle install
时,它会使用您对 Gemfile 所做的任何更改来更新您的 Gemfile.lock。
确保您在本地运行 bundle install
,然后签入以控制新更新的 Gemfile.lock
。然后尝试部署。
编辑:正如评论中所承认的,Gemfile 中的条件导致一个平台上的 Gemfile.lock 有效,而在另一个平台上无效。在 Gemfile 中为这些平台相关的 gem 提供一个 :platform 标志应该可以解决不对称问题。
vi .bundle/配置
将 BUNDLE_FROZEN 选项从“1”更改为“0”
做“捆绑安装”
或者
运行“捆绑配置”
查看“冻结”值是否为 true 将其设置为 false
捆绑配置冻结错误
bundle config frozen false
是我的 goto 修复。非常感谢,两年了!我相信 Joshua Pinter 的回答解决了上述评论 - 它可能是影响这一点的全局 Bundler 配置。
bundle config frozen false
对我没有任何帮助。求助于编辑 .bundle/config 其中条目 BUNDLE_FROZEN = "true" (textual true)
注意全局 Bundler 配置。
我在 ~/.bundle/config
的开发环境中有一个全局配置,而我的 CI / 生产环境中没有,这导致我的开发环境中生成的 Gemfile.lock
与我的 CI / 生产环境中的不同。
在我的情况下,我在我的开发环境中将 github.https
设置为 true,但在我的 CI / 生产环境中没有这样的配置。这导致两个 Gemfile.lock
文件不同。
当你看到以下...
$ 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
将一些“过时”的 .gem 文件放入缓存中?
在任何情况下,您都可以通过运行来克服此错误:bundle install --no-deployment
这是关于 Rails 的众多优点之一……错误消息通常会准确地告诉您如何解决问题。
我的具体问题与@JoshPinter 报告的内容有关,即捆绑程序用于从 github 检索 gem 的协议中的 dev-vs-deploy 主机差异。
长话短说,我所要做的就是修改以下 Gemfile
条目...
gem 'activeadmin', github: 'activeadmin'
...对于这种安全语法 (see reference):
gem 'activeadmin', git: 'https://github.com/activeadmin/activeadmin.git'
我的部署恢复正常。
我不在乎。这就是我所做的。它修复了它。
rm -rf .bundle
rm -rf Gemfile.lock
bundle install
我的解决方案与此处列出的其他解决方案略有不同。我试图从 sidekiq 升级到 sidekiq-pro(需要捆绑程序 1.7.12+),但我不断收到来自 travis-ci 的“您正在尝试在更改 Gemfile 后以部署模式安装”消息
检查 travis-ci 的控制台输出显示正在使用旧版本的捆绑程序。
就我而言,我必须编辑 travis.yml 文件以添加:
before_install: - gem update bundler
这迫使 travis-ci 使用最新版本的 bundler,并使错误消息消失。
cap shell
和 gem update bundler
或 with <role> gem update bundler
或 on <machine> gem update bundler
有用
--deployment
标志已被弃用,因为它依赖于在捆绑器调用中被记住,捆绑器在未来的版本中将不再这样做。”,所以也许这也有一些影响。
rm -fr .bundle
为我解决了这个问题。
错误的另一个原因:
这有点愚蠢,但我相信其他人也会犯同样的错误。
对于 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'
添加新的时,您必须删除它们。 (包括在内)。我认为你可以摆脱它,直到你在你的 gem 文件中触摸它们,然后 Heroku 注意到重复并因上述错误而大喊大叫。
祝 Rails 4 好运。
在此命令之后,您可以再次进行正常的捆绑安装:
bundle install --no-deployment
set :bundle_config, { deployment: false }
我之前遇到过类似的事情。我认为解决它的一种方法是运行
bundle install --deployment
然后尝试部署。这类似于将所有 gem 安装到供应商文件夹中,我认为通常可以避免这种情况......但仍然可能有效。我的应用程序曾经像这样运行,我的解决方案是从我的 Gemfile 中删除要下载的确切版本,然后重新捆绑和部署。
gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git', :branch => 'master'
至
gem 'rails_admin'
或者你可以按照它的建议去做,把你的项目从生产服务器上Git到本地机器上,捆绑它,然后重新推送到你的服务器上。这个解决方案可能不是 100% 正确,但其中一些对我有用……只是想我会分享。祝你好运
--deployment
标志没有任何区别。这就是它应该的方式吗?
在我们的例子中,我们使用了在我们的生产机器上运行的旧版本捆绑器中不可用的功能。因此升级捆绑器就足够了,即做一个gem update bundler
。
这可能是一个危险的想法,但如果绝对必须在生产部署环境中测试某些东西,您可以编辑 .bundle/config 文件
# This value is normally '1'
# Set it to '0'
BUNDLE_FROZEN: '0'
现在调用 bundle,在我的情况下我需要更新一个特定的 gem,所以这是我的命令
RAILS_ENV=production bundle update <whatever gem>
您可能应该在更新后将其改回,以便之后一切如您所愿。同样,这可能不受支持,并且 YMMV
在一些 gem 更新之后,我遇到了这个部署 Nesta 应用程序的问题。对我有用的是删除 Gemfile.lock,运行 bundle install
重新生成它,然后再次部署。
我遇到了类似的问题,但是我同时执行了 bundle install
和 bundle update
并且 Heroku 仍然拒绝了我的推送。
我通过删除 Gemfile.lock 然后再次运行 bundle install
解决了这个问题。然后我添加、提交并将其推送到我的 git 存储库。之后,我毫无问题地推向 Heroku。
对于 heroku,您不必更改 Gemfile
中的语法。您只需将 BUNDLE_GITHUB__HTTPS
(注意双下划线)添加为环境变量并将其设置为 true
(在您的 heroku 应用程序仪表板中 Config Vars
部分的 Settings
标签下)。这会将所有此类请求的协议从 git://
切换到 https://
。
尝试推送到 Heroku 时出现错误消息。我发现以下解决方案已修复。
Git pull origin master Git status Git commit Git push origin master Git push heroku master
此问题可能与指向旧版本代码的子模块有关。对我来说,我通过更新子模块解决了这个问题
如果您有子模块,请尝试运行:
git submodule update --init
bundle install
我阅读了十几个关于不同资源的解决方案,但没有找到在这种情况下对我有帮助的确切方法
所以我确实找到了解决方案。确切地说我仔细阅读了错误消息并且有一个解决方案:在其他地方运行捆绑安装。 “其他地方”是我开发应用程序的 Cloud9。所以我的步骤
使用 rsync 命令将 Gemfile 和 Gemfile.lock 从服务器复制到本地机器将这两个文件插入我的 RoR 项目(我使用 Cloud9)打开 Gemfile 并进行我想要的更改。就我而言,我将终端 cd 中的 gem 'thin' 添加到 Cloud9 上的应用程序并运行捆绑安装。在这种情况下,您将使用 rsync cd 在服务器上复制新的 Gemfile.lock 和 Gemfile.lock 的更改版本到我的应用程序文件夹,然后再次运行 bundle install --deployment --without development test DONE!祝大家好运!
windows 10 (rails v-7) 中命令 bundle install
的错误消息类似于
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
If this is a development machine, remove the C:/Users/friends/Gemfile freeze
by running `bundle config unset deployment`.
The dependencies in your gemfile changed
You have added to the Gemfile:
* pg
You have deleted from the Gemfile:
* sqlite3 (~> 1.4)
所以我完全按照错误信息要求我做。运行以下命令
bundle config unset deployment
然后我再次运行`bundle install 然后它工作了
unless RbConfig::CONFIG['host_os'] === 'mingw32'
? (因此,它应该在我的 Windows 计算机上捆绑不同的项目,而不是在 linux 服务器上。):platforms
标志会有所不同:platforms :ruby do; gem 'mygem'; ...; end
(如果您不介意添加此指令,您将获得绿色检查对你的回答。):require
区分 linux 和/或 darwin env,也可以正常工作 stackoverflow.com/a/16475580/933358