4

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

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

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'

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

4

4 回答 4

9

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

load 'config/my_module'

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

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

于 2008-10-30T21:37:10.360 回答
2
require 'my_extension'

将您的扩展保存在 my_extension.rb

于 2008-10-30T16:03:21.017 回答
0

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

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
于 2008-10-31T17:37:17.767 回答
0

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

于 2008-10-30T17:15:16.567 回答