我在LWRP中有以下内容,它所做的只是爆炸.ear文件::
action :expand do
ear_folder = new_resource.target_folder
temp_folder = "#{::File.join(ear_folder, 'tmp_folder')}"
expand_ear(new_resource.source, ear_folder)
expand_wars(ear_folder,temp_folder)
end
def expand_ear(src,dest)
bash "unzip EAR" do
cwd dest
code <<-EOF
pwd
ls -l
jar -xvf #{src}
EOF
end
end
def explode_wars(src,dest)
Dir.glob("#{basepath}/*.war") do |file|
......... ###crete tmp folder, move .war there then unzip it to 'dest'
end
end
当我运行此/使用Vagrant提供/输出显示Chef并行启动'expand_ear'和'expand_wars'。因此,expand_wars def无法找到所有.wars /它们仍然被提取。我尝试制作'expand_ear'布尔值并将'expand_wars'包装在:
中if expand_ear?(src,dest)
expand_war
end
但这会产生相同的结果。???
答案 0 :(得分:2)
Chef run由两个阶段组成,编译和执行。在第一阶段,厨师通过食谱和:
你的问题是expand_ear
中的代码被编译 - 因为它是一个资源,但explode_wars
中的代码会立即被执行 - 因为它是纯粹的红宝石。有两种可能的解决方案:
更改expand_ear以动态定义bash资源:
res = Chef::Resource::Bash.new "unzip EAR", run_context
res.cwd dest
res.code <<-EOF
pwd
ls -l
jar -xvf #{src}
EOF
res.run_action :run
这是纯粹的红宝石 - 因此将被执行而不是编译。
OR 将您在rubde_wars中的ruby代码放入ruby_block资源。
ruby_block do
block do
Dir.glob("#{basepath}/*.war") do |file|
......... ###crete tmp folder, move .war there then unzip it to 'dest'
end
end
end
这样它也会被编译,并且只在第二阶段执行。