2016-07-28 13 views
-1

シェフの料理本では、同じソフトウェアの複数のバージョンをサポートしています。しかし、私たちは悪い習慣を採用しました。各バージョンごとにレシピのコピーを作成し、そのレシピを変更しました。シェフ - レシピの複製を避ける方法

remote_file install_file do 
    source node['android']['sdk']['23']['source_url'] 
    not_if do 
    ::File.exists?(extract_dir) 
    end 
    notifies :run, "execute[extract-sdk-23]", :immediately 
end 

これは本質的にコードの重複である

remote_file install_file do 
    source node['android']['sdk']['24']['source_url'] 
    not_if do 
    ::File.exists?(extract_dir) 
    end 
    notifies :run, "execute[extract-sdk-24]", :immediately 
end 

なります。属性を同じに保ちながら値を変更する方がよりクリーンになります。

これはシェフと同じですか?

重要な場合は、chef-clientゼロを直接使用します。つまり、ナイフなどは使用しません。

+0

本当に問題はありません。バージョン( '23' /' 24')を属性として持つこともできます。文字列連結を使って '' execute [extract-sdk-24] ''アクションの名前をつくることもできますし、常に同じであれば '' extract-sdk''という名前を付けるだけです。 – StephenKing

+0

レシピをよりクリーンにするために、その物を[リソース](https://docs.chef.io/custom_resources.html)にすることもできます。 – StephenKing

+0

@StephenKing現在、私はandroid :: sdk_24またはandroid :: sdk_23を呼び出すことで、異なるレシピを実行できます。私は同じことを望んでいますが、異なる属性値で実行されるレシピは1つしかありません。彼らが私の後ろであるかどうかを調べるために、リソースを調べる必要があります。 –

答えて

0

@StephenKingが述べたように、ロジックを抽象化するカスタムリソースを記述することをお勧めします。また、すべての異なるSDKをノード属性にハッシュして、単一のレシピで反復処理することもできますが、これは柔軟性が低くなります。

関連する問題