设置常春藤冲突经理

时间:2014-03-20 12:26:09

标签: ivy

我正在尝试在常春藤中设置冲突管理器,但我找不到如何设置它们的具体示例。例如,要设置“严格”管理器,这会是什么样的?

<conflict-managers>
  ???
</conflict-managers>

3 个答案:

答案 0 :(得分:8)

<rant>
是的,不是常春藤文件!我的意思是,它必须组织良好,完整吗?它真的必须有意义吗?我的意思是,不像我的工作取决于它!

等一下,它确实......
</rant>

对不起,我必须把常春藤的文件放在胸前。相比之下,它使Maven文档看起来很精彩。

我发现的关于常春藤的最好的书是Manning的Ant in Action。这本已经七年历史的书已经绝版了(但仍然可以作为电子书使用。如果这本书没有,(使用Ivy 1.4),我本来就完全了不幸的是,它并没有深入研究常春藤设置。

常春藤文档深埋了listing of all of the possible conflict managers

  • 所有此冲突管理器通过选择所有修订来解决冲突。也称为NoConflictManager,它不会驱逐任何模块。
  • 最新时间此冲突管理员仅选择最新的&#39;修订版,最新定义为最新版本。请注意,最新的计算成本很高,所以如果可以,请选择最新版本。
  • 最新修订版此冲突管理员仅选择最新版本&#39;修订版,最新版本由修订版的字符串比较定义。
  • 最新兼容此冲突管理器选择冲突中的最新版本,这可能会导致一组兼容的依赖项。这意味着最终,这个冲突管理器不允许任何冲突(类似于严格冲突管理器),除了它遵循尽力而为策略试图找到一组兼容模块(根据版本约束)
  • 严格每当发现冲突时,此冲突管理器都会抛出异常(即导致构建失败)。

我还没有与他们玩过,但我相信你只是在ivy-settings.xml中执行以下操作:

<conflict-managers>
    <latest-revision/>
</conflict-managers>

您也可以在ivy.xml中定义冲突管理,这可能会更加实用,因为它可以逐个模块地定义。

当然,一些例子可能会有很长的路要走,但是Ivy文档并没有提供很多。

答案 1 :(得分:3)

  

我发现的关于常春藤的最好的书是曼宁的行动中的蚂蚁。

那是我。从那时起,Ivy已经发展了很多,所以有了构建

常春藤冲突管理者的一个问题是它与maven有所不同,maven的政策首先在图表上最浅,而且选择最接近的maven。如果你明确要求一个版本,这是好的,如果你有&gt; 1最近&#34;不是你想要的。

使用常春藤,你可以达到严格的决心,即“你必须明确解决你的依赖关系中的每一个冲突”#34;。这增加了额外的工作@构建时间,但有一个关键结果:如果你明确声明你想要的东西的版本,你现在可以控制你的类路径中的内容。

答案 2 :(得分:1)

Ivy参考文档严格遵循ivy.xml和ivy-settings.xml文件的XML标记结构。您需要直接从文档结构中提取所需的信息。

来自常春藤文档的解码: 冲突管理器标记用于声明项目可能使用的冲突管理器,如果接受配置则配置它们,而不是设置冲突管理器使用。

<conflict-managers>
    <latest-cm name="mylatest-conflict-manager" latest="my-latest-strategy"/>
    <compatible-cm name="my-latest-compatible-conflict-manager" latest="my-latest-strategy"/>

</conflict-managers>

settings标签有一个用于选择默认冲突管理器的属性:

<settings defaultConflictManager="strict"/>

或者在ivy.xml中:

<dependencies>
    <dependency.../>
    <conflict manager="strict">
</dependencies>

请注意,大多数冲突管理者在解释您的意图时比您预期的更自由。两个例子: *分支被认为是无关紧要的,如果在两个分支上有依赖关系,那么最近的分支是&#34;解析器系列将从两者中选择最新的。 *&#34;最新时间&#34;和#34;最新修订版&#34;解析器忽略版本约束,除了在匹配空间上设置边界。例如如果a取决于b-1.0和c-1.0但c-1.0依赖于b-5.0那么你将获得b-5.0,尽管它不符合要求的约束。 我认为您的需求是发现其中一个设计缺陷的结果。

相关问题