在capistrano的deploy脚本中,你可以根据实际情况大量使用脚本,通常是shell脚本
比如
run
"
your shell command
"
用起来非常方便,但有点必须注意,如果你的脚本前后具有很强的依赖性,你因该这么写
run
"
command1 && command2
"
而不是
run
"
command1
"
run " command2 "
run " command2 "
这是个很细微差别,一般注意不到,结果就是焦头烂额
比如今天我就干了件蠢事,我想在某个目录下,产生一个配置文件
于是就
run
"
cd #{path}
"
run " script for creating a configure file "
run " script for creating a configure file "
尝试了很多次,就是不能产生文件, 我很奇怪,capistrano我也用了一段时间了,执行脚本应该是没什么问题的,而且老早写的
run
"
cd #{current_path} && mongrel_rails cluster::configure -e production -p #{mongrel_port} -N #{mongrel_nodes} -c #{current_path}
"
为什么就是能产生文件呢,把我的产生文件的脚本放到服务器上测也没问题,难道远程执行脚本有特殊的要求 ,我的脚本不符合这种特殊的要求?我就把这个脚本写成最简单以至不会出错的方式,结果还是不行,不得已查看源代码,也没看出所以然,我一直觉得我的脚本可能有问题,于是我放弃了用run,我采用了
command
=
"
command1 && command2
"
invoke_command ( command , :via => :run )
invoke_command ( command , :via => :run )
居然可行,难道非得这样用?经过几次尝试采用了
run
"
command1 && command2
"
看来不是偶然的,我实在没在意这种写法,我总觉得这是偷懒的写法,就好像装软件一样,make && make install分不分开写没什么区别,确实没什么区别,但那是在同一台机器上,前后的语境是连通的,换成目前远程脚本的方式,就有差别了,如果写成两个远程命令,前后语境不连通, 所以command1的路径下肯定不互有commnd2产生的文件,而且command2并不是没有产生文件,仅仅是它不在你希望的目录而是在~目录产生了文件,所以我的前面的那些猜测都是错误的,capistrano中的run运行shell脚本非常好,无需什么特殊设置,你完全可以通过合适的脚本来实现高级自动化的部署方案