Capistrano任务中奇怪的变量参数问题

时间:2010-02-25 16:50:03

标签: ruby-on-rails ruby shell capistrano

Hello stackoverflow专家,

我在使用Capistrano创建的任务中遇到了一个非常奇怪的问题。我正在尝试从命令行传递一个变量:

>> cap create_dir -s name_of_dir=mydir

task :create_dir do
  printf("#{name_of_dir}")
  if !(exists?(:name_of_dir)) then  
      name_of_dir = Capistrano::CLI.ui.ask("Name of dir to be created.")    
  end   

  full_path = "/home/#{name_of_dir}"
  run "mkdir #{full_path}"

end

非常奇怪的是,当我执行printf时正确解析变量,但在以下命令中解析为空(空)字符串。我真的找不到这方面的解释,我肯定不是一个愚蠢的错字或类似的东西?

我没有像Java和PHP那样使用Ruby,我担心可能有一个奇怪的规则?

谢谢!

3 个答案:

答案 0 :(得分:3)

一些建议:

  • 避免使用具有相同内部任务变量名称的变量
  • 如果退出,使用fetch()而不是处理?否则呢......

这是代码

>> cap create_dir -s name_of_dir=mydir

task :create_dir do
  printf("#{name_of_dir}")
  directory = fetch(:name_of_dir) { Capistrano::CLI.ui.ask("Name of dir to be created.") }

  full_path = "/home/#{directory}"
  run "mkdir #{full_path}"
end 

答案 1 :(得分:2)

在较新版本的capistrano中,至少从我现在运行的2.5.19开始,整个命令行参数现在的工作方式不同了。你这样称呼它。

cap command argument=value

代码中的语法是

ENV.has_key?('argument') and ENV['argument']

基本上就是这样,但是你可以看看我的blogpost关于它的一个有用的例子

答案 2 :(得分:0)

在第二行中,您正在检查符号:name_of_dir是否存在 - 而不是变量name_of_dir的实际值。

因为您不太可能有文件名name_of_dir,所以它将被视为不存在...然后Capistrano::CLI.ui.ask命令会覆盖name_of_dir(变量)。

不确定为什么,但必须以某种方式杀死它。

尝试删除“:”并查看是否可以解决问题。