【问题标题】:Chef Recipes, not_if厨师食谱,not_if
【发布时间】:2014-09-24 01:08:09
【问题描述】:

bash "编辑 gemfile" 做

cwd "/home/vagrant/myapp"
code <<-EOH
echo "group :development, :test do
gem 'capybara'
gem 'rspec-rails'
gem 'selenium-webdriver'
gem 'capybara-screenshot'
gem 'launchy'
end" >>Gemfile
EOH
#####not_if do ::File.exists?('/home/vagrant/myapp/Gemfile') end#####
end

我希望它在 Gemfile 中添加后不再添加,以避免重复... 请告诉我如何使用正确的 not_if 命令,谢谢!

【问题讨论】:

    标签: chef-infra chef-recipe


    【解决方案1】:

    not_if { ::File.exists?('/home/vagrant/myapp/Gemfile') } 应该这样做。

    这里您使用的是块语法 do .. end 在一行上,在这种情况下,您必须在块内以分号结束命令;

    对于您的语法,它将是 not_if do ::File.exists?('/home/vagrant/myapp/Gemfile'); end

    如果您省略分号,解释器将无法猜测您传递的 end 是作为参数还是关键字。

    经验法则:使用花括号 {} 表示一行,do .. end 表示多行块。

    【讨论】:

    • 是的,但我的意思是,如果上述命令已经在 Gemfile 中,那么我不希望它再执行。上面的 not_if 代码是不是找到 Gemfile 就不会运行命令了吗?
    • 对。通常只用厨师管理文件的一部分是个坏主意。您最好使用模板来管理整个文件。
    【解决方案2】:

    您的 not_if 需要使用 grepawk 或 ruby​​ 块来检查 gemfile 并查看它是否包含您想要的行。

    【讨论】:

    • 怎么做?请告诉我。 @Tejay Cardon
    • @JustineGumba 这些 GEM 中有没有可能已经在 Gemfile 中了?如果有,事情会变得更加棘手,但仍然非常简单。