感谢您查看此问题。任何帮助表示赞赏。 我正在使用vagrant和chef配置一个带有GUI的虚拟机。
目标:下载IntelliJ IDE然后安装它,以便我在登录时可供用户使用。
食谱cookbook 'idea', '~> 0.4.0'
实现下载,但用户必须手动完成访客的安装。
我无法使用自定义配方来完成厨师的配置。在编写时,如果我在配置机器后将其添加到运行列表但是在初始运行中因为文件尚未安装而失败,则配方完成。
我尝试在相关块和整个配方中使用only_if
方法,但无法使其工作。我也搞砸了subscribe
方法,但也无法解决这个问题。
我确信这有一个简单的解决方案,但谷歌搜索和反复试验并没有让我更接近。我希望有任何帮助来实现这一目标。谢谢!
当前食谱
# Configure IntelliJ Idea.
file '/opt/idea/idea.desktop' do
content '[Desktop Entry]
Name=IntelliJ IDEA
Type=Application
Exec=idea
Terminal=false
Icon=idea
Comment=Integrated Development Environment
NoDisplay=false
Categories=Development;IDE;
Name[en]=IntelliJ IDEA'
mode '644'
owner 'root'
group 'root'
end
bash 'install idea desktop' do
code <<-EOH
cd /opt/idea
sudo desktop-file-install idea.desktop
EOH
end
file '/usr/share/pixmaps/idea.png' do
owner 'root'
group 'root'
mode '0644'
content ::File.open('/opt/idea/bin/idea.png').read
action :create
end
link '/usr/local/bin/idea' do
to '/opt/idea/bin/idea.sh'
link_type :symbolic
end
失败的工作: 包装整个脚本
# Configure IntelliJ Idea.
execute 'configure idea' do
only_if { ::File.exist?("/opt/idea") }
continues...
end
在块中使用only_if
file '/usr/share/pixmaps/idea.png' do
action :create
only_if { ::File.exist?('/opt/idea/bin/idea.png') }
owner 'root'
group 'root'
mode '0644'
content ::File.open('/opt/idea/bin/idea.png').read
end
link '/usr/local/bin/idea' do
to '/opt/idea/bin/idea.sh'
only_if { ::File.exist?('/opt/idea/bin/idea.sh') }
link_type :symbolic
end
答案 0 :(得分:0)
你可能想要的是一个懒惰的评估属性:
content lazy { ::File.open('/opt/idea/bin/idea.png').read }
这将延迟文件读取,直到收敛时间而不是编译时间。