3

鉴于:

  • 使用 Hudson/Ant 构建。
  • Ivy 缓存超时设置为 5 分钟。
  • Ivy 存储库包含项目 A 版本 2.2.2 和项目 B 版本 1.1.1。
  • 项目 B 依赖于项目 A。

事件:

  1. 对项目 A 进行了 API 更改。
  2. 对项目 B 进行了相关更改。
  3. 项目 A 版本 2.2.3 已构建并发布到存储库。
  4. 不到 5 分钟后,Project B 版本 1.1.2 构建完成。
  5. 项目 B 失败,仍然从常春藤缓存中提取项目 A 版本 2.2.2。
  6. 5 分钟后,项目 B 将正确构建,项目 A 版本为 2.2.3

我看过但没有看到明显的解决方案(除了不缓存?)。是否有发布设置会更新本地缓存和存储库?您是否需要明确发布到两者?

4

3 回答 3

0

只是猜测:如果 A 和 B 构建在同一台机器上,是否会在 A 的构建结束时执行 <ivy:resolve refresh="true"> 刷新缓存?当然,如果 A 和 B 在不同的机器上构建,那将无济于事......

于 2011-01-29T05:17:59.063 回答
0

一种类似于(但不如不缓存)不缓存的解决方案是通过设置以下 ivy 属性来减少缓存中的时间:

ivy.cache.ttl.default                 = 30s

现在,也许这可以解决您的问题。虽然,它并不比不缓存好多少。

在我的脑海中,我可能会尝试的另一件事是关闭缓存,然后通过在指向缓存的 ivy 设置文件中创建文件系统解析器并将其放置在链上的较低位置来手动重新实现缓存。看起来像这样:

<ivysettings>
    <settings defaultResolver="all-repositories" />
    <include file="ivysettings-common.xml" />
    <resolvers>
        <chain name="all-repositories" returnFirst="true" >
            ...
            <ibiblio name="ibiblio" m2compatible="true" />
            <filesystem name="manual-cache">
                <ivy pattern="${ivy.default.ivy.user.dir}/cache/${ivy.local.default.ivy.pattern}" />
                <artifact pattern="${ivy.default.ivy.user.dir}/cache/${ivy.local.default.artifact.pattern}" />
            </filesystem>
            ...
        </chain>    
    </resolvers>
</ivysettings>

注意:ivy.default.ivy.user.dirivy.local.default.ivy.patternivy.local.default.artifact.pattern是默认设置的内置属性。我在这个例子中引用了它们,但我不需要做任何其他特别的努力来设置它们(它们已经包含正确的默认值)。

我希望其中一种方法可以解决您的问题。这是目前唯一想到的两种可能的解决方案。

于 2011-03-15T14:47:15.727 回答
0

在项目 B 的 ivy 文件中,您需要将依赖项的更改属性设置为 true。

  <dependency org="org.example" name="A" revision="latest.integration" changing="true" />

查看常春藤文档

于 2021-11-18T19:33:02.090 回答