2008-10-30 74 views
4

这可能是一个新手ruby问题。我有几个库和应用程序需要部署到几个不同的主机。所有的应用程序和库都将共享这些主机的一些常用设置 - 例如主机名,数据库服务器/用户/密码等Capistrano:如何将常见设置包含在多个项目的deploy.rb文件中

我的目标是做这样的事情:

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文件,其中该文件我定义stage,prod等,并根据需要覆盖任何“通用”配置参数。任何建议,将不胜感激。我尝试了一些不同的东西,但是我从所有人都得到了错误。

编辑:我已经试过

require 'my_module' 

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

回答

2
require 'my_extension' 

保存您的扩展在my_extension.rb

0

乔恩是正确的,这是要走的最简单的方法,只是将它保存在一个单独的文件,并使用require 'filename'。你也可以使用像Webistrano这样的部署,这也支持Capistrano'Recipes'的形式。我已经在一些项目上使用了它一段时间,并且开始喜欢它。

+0

我试着这,但我得到错误抱怨任务对象没有被定义。你在'my_extension'顶部需要什么吗? – drsnyder 2008-10-30 18:15:53

9

我只是用它尝试多一点,什么我发现是,你必须:

load 'config/my_module' 

我可以把我所有的共同的定义在这里,只是将其加载到我的deploy.rb。

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

+0

Require需要用于加载Rubygems,但是如果它找到它们,它将首先加载给定的给定的本地文件。另外,require在第一次加载时不会运行该文件。除此之外,它们完全相同。所以你可以使用require来加载你自己的文件。 – webmat 2008-10-31 13:06:08

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 
相关问题