【问题标题】:Capistrano: How to Include common settings in multiple project deploy.rb filesCapistrano:如何在多个项目 deploy.rb 文件中包含常用设置
【发布时间】:2010-09-20 00:23:33
【问题描述】:

这可能是一个新手红宝石问题。我有几个库和应用程序需要部署到几个不同的主机。所有的应用程序和库都将共享这些主机的一些通用设置——例如主机名、数据库服务器/用户/密码等

我的目标是做类似的事情:

cap host1 stage deploy
cap host2 stage deploy
cap host1 prod deploy
# ...

我的问题是如何在所有 deploy.rb 文件中包含这些常用设置?更具体地说,我想创建一个我可以包含的 rb 文件,其中包含一些常见设置和几个特定于主机的任务定义:

set :use_sudo, false
# set some other options

task :host1 do
    role :app, "host1.example.com"
    role :web, "host1.example.com"
    role :db,  "host1.example.com", :primary => true

    set :rodb_host, "dbhost"
    set :rodb_user, "user"
    set :rodb_pass, "pass"
    set :rodb_name, "db"
 end

 task :host2 do
     #...
 end

deploy.task :carsala do
    transaction do
        setup
        update_code
        symlink
    end
end

然后在我定义阶段、产品等的所有 deploy.rb 文件中“包含”这个文件,并根据需要覆盖任何“通用”配置参数。任何建议,将不胜感激。我已经尝试了一些不同的东西,但是我从所有的上限中得到了错误。

编辑:我试过了

require 'my_module'

但我收到错误,抱怨未定义的任务对象。

【问题讨论】:

    标签: ruby deployment capistrano


    【解决方案1】:

    我不确定您的需求有多复杂,但这对我来说非常适合部署:

    set :application, "app"
    
    set :scm,           :subversion
    # ... set all your common variables
    
    task :staging do
      set :repository,    "http://app/repository/trunk/"
      # ... set other uncommon variables in task
    end
    
    task :production do
      set :repository,    "http://app/repository/production/"
      # ...
    end
    

    部署只是

    cap staging deploy
    

    cap production deploy
    

    【讨论】:

      【解决方案2】:

      我只是对它进行了更多试验,我发现你必须:

      load 'config/my_module'
      

      我可以把我所有的常用定义放在这里,然后把它加载到我的 deploy.rb 中。

      它出现在加载并执行文件的文档中。或者,要求尝试加载指定的库。我不完全确定真正的区别,但似乎当前应用程序符号空间和所需的库之间存在一些分离(因此出现关于未定义任务对象的错误),这在您执行时不是问题加载。

      【讨论】:

      • Require 用于加载 Rubygems,但如果找到它们,将首先加载给定的本地文件。此外,如果之前加载过文件,则 require 不会第二次运行该文件,而 load 会。除此之外,它们是完全等价的。所以你可以使用 require 来加载你自己的文件。
      • 如果我使用require,我得到一个错误:“undefined method `namespace'”,但如果我使用load,它工作正常。
      【解决方案3】:

      Jon 说得对,这是最简单的方法,只需将其保存在单独的文件中并使用 require 'filename'。你也可以使用像Webistrano 这样的花哨的东西进行部署,它也以 Capistrano 'Recipes' 的形式支持这一点。我已经在几个项目中使用了一段时间,并且开始喜欢它。

      【讨论】:

      • 我试过这个,但我收到错误,抱怨未定义任务对象。你需要'my_extension'顶部的任何东西吗?
      【解决方案4】:
      require 'my_extension'
      

      将您的扩展保存在 my_extension.rb 中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        相关资源
        最近更新 更多