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,我担心可能有一个奇怪的规则?
谢谢!
答案 0 :(得分:3)
一些建议:
这是代码
>> 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(变量)。
不确定为什么,但必须以某种方式杀死它。
尝试删除“:”并查看是否可以解决问题。