如何在Chef中编写包装器cookbook时覆盖依赖版本

时间:2017-03-27 19:20:53

标签: ruby dependencies chef

例如。

我正在编写包装食谱( my_cookbook ),其目的与我使用社区食谱( community_cookbook )相同。我遇到了与 community_cookbook 中存在的依赖关系列表有关的问题。

metadata.rb 中的community_cookbook文件具有以下依赖关系列表。

...
depends mysql
depends postfix
...

因此,默认情况下,运行列表具有mysql cookbook的最新版本(比如说8.3.0)。

我的问题是我应该做些什么更改才能获得mysql的先前版本(比如5.3.6)。

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++

我采取了哪些措施来解决这个问题?

答:

我在 metadata.rb my_cookbook中写了以下内容。

...
    depends 'mysql', '~> 5.6.3'
    depends 'community_cookbook', '~> 1.1.0' 
...

我在控制台上收到以下消息

>>>>>>     Failed to complete #converge action: [Unable to satisfy the following requirements:

- `mysql (= 8.3.0)` required by `user-specified dependency`
- `mysql (~> 5.6.3)` required by `my_cookbook-0.1.0`
- `mysql (>= 0.0.0)` required by `community_cookbook-1.1.0`
- `mysql (>= 6.0.0)` required by `php-3.0.0`  # This is because the community_cookbook also has php as it's dependency list. 

2 个答案:

答案 0 :(得分:1)

您可能手动更改了Berksfile.lock,导致上述问题。

你可以尝试删除Berksfile.lock(进行备份)并执行berks install然后上传吗?

它应该安装所有必需的mysql cookbook版本 然后所有的食谱都可以有他们需要的mysql版本

答案 1 :(得分:0)

听起来你的Berkfile或Policyfile中有一些时髦的东西。检查那里的非预期版本引脚,并可能运行berks update以强制重新解决。 user-specified-dependency表示约束来自于食谱系统之外,通常是通过Berksfile中的手动cookbook 'mysql', '8.3.0',但还有其他方式,如环境约束或运行列表版本黑客。