【问题标题】:Cannot load configuration for Capistrano Receipe无法加载 Capistrano 配方的配置
【发布时间】:2025-12-26 19:40:07
【问题描述】:

问题是我想从控制台获取我的 Capistrano 食谱的参数,所以在查看 Google 之后,我想出了这个:

task :set_repo do
  set :repository,  "git@github.com:#{configuration[:repo]}/MyApp.git"
  set :scm_user,  configuration[:repo]
end

在尝试运行任务时,我遇到了配置散列的“method missing”错误。在谷歌上再次搜索后,我发现我必须从 Capistrano 加载配置,所以我添加了这段代码:

configuration = Capistrano::Configuration.respond_to?(:instance) ?
  Capistrano::Configuration.instance(true) :
  Capistrano.configuration(:must_exist)

但这会引发 LoadError 并显示消息“请从 Capistrano 配方中获取此文件”。我试过要求 capistrano/configuration 模块,但我一直收到同样的错误。

非常感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails capistrano


    【解决方案1】:

    好吧,我找到了一个完全不使用配置的解决方法。

    您似乎可以像这样在命名空间之外设置几个任务

    desc "Use UserA's git repository"
    task :usera do
      set :repository,  "git@github.com:UserA/MyApp.git"
      set :scm_user,  "UserA"
    end
    
    desc "Use UserB's git repository"
    task :userb do
      set :repository,  "git@github.com:UserB/MyApp.git"
      set :scm_user,  "UserB"
    end
    

    完成此操作后,您只需在控制台中调用您的部署任务,将您的存储库任务放在前面。例如:

    $ cap usera deploy
    

    所以这将首先调用您的 usera 任务,然后是您的 deploy 任务。

    【讨论】:

      【解决方案2】:

      您可以从命令行设置 capistano 变量。

      例如,以下调用会将 capistrano 变量 scm_user 设置为“userA”,将 capistrano 变量 repository 设置为“http://myrepo.com/blah” :

      cap deploy -s scm_user="userA" -s repository="http://myrepo.com/blah"
      

      这和put的效果一样

      set :scm_user, 'userA'
      set :repository, 'http://myrepo.com/blah'
      

      在 deploy.rb 文件的顶部。

      【讨论】: