【问题标题】:The --deployment flag requires a Gemfile.lock--deployment 标志需要 Gemfile.lock
【发布时间】:2013-02-10 08:49:49
【问题描述】:

我已经花了几个小时,但无法解决这个问题。

当我尝试使用 capistrano 将本地 Rails 应用部署到生产服务器时,出现以下错误:

The --deployment flag requires a Gemfile.lock. Please make sure you have checked your Gemfile.lock into version control before deploying.

关于如何解决这个问题的任何想法?

我的 rails 应用程序文件夹使用 Git 进行版本控制。我已将本地 git repo 推送到 github,Gemfile.lock 就在 github 上。所以它在版本控制之下。然而 capistrano 继续给出同样的错误。

Deploy.rb 文件:https://gist.github.com/brahmadpk/4748991

【问题讨论】:

标签: ruby-on-rails-3 capistrano


【解决方案1】:

.bundle/config 文件中删除BUNDLE_FROZEN: "true" 并再次运行bundle

【讨论】:

  • 这为我解决了这个问题,但是我不得不从~/.bundle/config 中删除该行,这花了我几分钟才找到。
【解决方案2】:

确保发布文件夹中没有任何不是发布的内容。有关详细信息,请参阅this comment on a bundler issue

这篇名为Capistrano Deployment Trouble 的博文解释了同样的问题。

编辑以在评论中包含讨论的结论

deploy_to 参数未设置为绝对路径;因此capistrano 找不到要部署的文件夹,导致出现此错误消息。

【讨论】:

  • 是的,查了那些文章,releases文件夹里什么都没有。
  • 添加deploy.rb file 后:将:deploy_to 参数设置为路径。现在,它被设置为fxtofx。这样,capistrano 会将文件部署到哪里?将其设置为像/var/#{application} 这样的绝对路径。
  • Prakash - 我的应用程序目录是服务器上的“fxtofx”。因此我使用#{application}。所以目录结构是 fxtofx/releases 等。这样使用有什么问题吗?
  • capistrano 是如何找到fxtofx/releases 的?或者你怎么去fxtofx/releases ?不应该是/fxtofx/releases/usr/fxtofx/releases还是从根开始的东西?
  • 好的..我明白你在指出什么。当我使用/#{application} 时,我收到错误mkdir: cannot create directory /fxtofx' 。我的 linux 技能可能不是最好的。
【解决方案3】:

我解决了这个问题:

set :bundle_gemfile, "your_app_name/Gemfile"

在 deploy.rb 中

【讨论】:

  • set :bundle_gemfile, -> { release_path.join('Gemfile') } 这对我有用。
【解决方案4】:

运行 bundle 并将您的 Gemfile.lock 添加到您的版本控制中。

【讨论】:

  • 我可以在我的 rails 目录中看到一个 Gemfile.lock。正如我在问题中提到的,我的 rails 目录受版本控制。如何具体添加Gemfile.lock?
  • 这取决于您的版本控制。如果您使用 git run git add Gemfile.lock(如果需要,请先从您的 .gitignore 中删除它)。
  • Capistrano 从远程存储库中拉取您的应用程序。您是否在部署之前推送了更改?
  • 我没有使用 github。我使用了 set :deploy_via, :copy
  • 你可以试试set :copy_strategy, :export,但我不明白为什么capistrano不会复制Gemfile.lock如果它被git跟踪。文档说“SCM checkout 命令用于获取本地副本”(github.com/capistrano/capistrano/blob/master/lib/capistrano/…
【解决方案5】:

我遇到了同样的问题,即使发布文件夹中没有文件或文件夹。结果发现这是一件愚蠢的小事:我的 repo 中的 gemfile.lock 文件出于某种原因是小写,而 capistrano 需要带有 大写 G 的 Gemfile.lock。

我就是这样解决的:

  1. 删除 gemfile.lock
  2. 从你的 repo 中删除 gemfile.lock (git rm ...)
  3. 运行bundle install
  4. 将新的 Gemfile.lock 文件添加到您的存储库中:git add Gemfile.lock
  5. 从服务器上删除文件夹(不知道是否真的需要,反正做了)
  6. 部署

【讨论】:

    【解决方案6】:

    我遇到了完全相同的问题。

    我的发布文件夹中没有任何内容(完全没有 - 我的部署冷一直回滚)。

    我的 gemfile.lock 已签入 Subversion。

    我明白了:

    ** [out :: localhost] The --deployment flag requires a Gemfile.lock. Please make sure you   have checked your Gemfile.lock into version control before deploying.
    

    有什么方法可以停止回滚,以便我可以看到发布文件夹在尝试运行时的样子

    cd /var/qlarity/releases/20130222003607 && bundle install --gemfile /var/qlarity/releases/20130222003607/Gemfile --path /var/qlarity/shared/bundle --deployment --quiet --without development test
    

    稍后……

    我发现我可以通过注释掉

    中所示的代码来防止回滚
    gems\capistrano-2.14.1\lib\capistrano\recipes\deploy.rb
    
    task :update_code, :except => { :no_release => true } do
      # on_rollback { run "rm -rf #{release_path}; true" }
      strategy.deploy!
      finalize_update
    end
    

    这使我能够检查我的发布文件夹,果然,其中没有 Gemfile.lock。结果我的 Rails 项目文件结构中出现了一个不必要的文件夹,而不是

    myapp/trunk/app
    myapp/trunk/config
    ...
    myapp/trunk/Gemfile
    

    我有

    myapp/trunk/myapp/app
    myapp/trunk/myapp/config
    ...
    myapp/trunk/myapp/Gemfile
    

    这意味着我最终得到了一个包含我的 Gemfile 的文件夹

    releases/nnnn/myapp
    

    并且 bundle 正在寻找 Gemfile in

    releases/nnnn
    

    当我从

    更改我的 Capistrano 配置时
    deploy.rb 
    
    set :repository, "file:///D:/_SVN//myapp/trunk"
    

    deploy.rb 
    
    set :repository, "file:///D:/_SVN//myapp/trunk/myapp"
    

    现在一切都很好。接下来真的应该看看修复文件夹结构!

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 1970-01-01
      • 2019-12-17
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2021-09-10
      • 2016-03-19
      相关资源
      最近更新 更多