常春藤的单独缓存文件夹

Posted

技术标签:

【中文标题】常春藤的单独缓存文件夹【英文标题】:Separate cache folders for Ivy 【发布时间】:2016-05-28 00:58:42 【问题描述】:

我想通过在本地 Bamboo 代理上运行一些与 Ivy 相关的 Ant 任务来释放并行性的力量。我们的 Bamboo 机器拥有充足的 CPU 马力和 RAM。

如果我将构建任务拆分为并行作业,每个作业都会根据ivy-retrieve 的结果产生不同的工件,那么我已经在理论上解决了我的问题

不幸的是,在实践中,如果出于某种原因,两个 Ant 任务同时在同一台机器和同一组织工件上运行,它们将发生冲突,其中一个会出现 XML 错误。

我没有确切的错误消息,因为 1) 问题是随机重现的,2) 我已经做了很多工作来将所有工作都放到一个连续的工作中。但我对正在发生的事情有一个清晰的认识。

当 Ant 运行 ivy-retrieve 时,代码如下,它将使用本地用户的缓存目录,恰好是 /home/bamboo/.ivy2/cache。在那里我可以找到很多 resolved-[org]-[artifact]-[version].xml 文件(每个文件都是我项目的不同构建版本)。当我想运行 ivy-retrieve 任务两次时会出现问题,例如一次用于compile 配置,另一次用于runtime。这两个 XML 将发生冲突,并且 Ivy 在读取其中一个文件时会报告 SAX 错误,因为它看起来目前正在写入。

如果我在远程代理上运行作业,我希望没有问题,但是嘿,我已经有 5 个本地代理,如果本地人空闲,Bamboo 不会触发远程代理。

不幸的是,我所有的工作,彼此独立,都需要不同的常春藤检索。目前我按顺序运行它们。

问题是

是否可以告诉运行在 Bamboo 代理上的 Ivy 使用临时唯一缓存目录来处理 dependencies.xml 文件而不是使用全局缓存?还是最多同步访问文件?

第二个选项将让并行 Ant 进程相互排他地读取和写入缓存的 dependencies.xml 文件。所以他们读取的将始终是一个一致的文件(作为完全相同的文件,我不在乎一个进程是否覆盖另一个)

【问题讨论】:

【参考方案1】:

Ivy 有 2 个缓存 - 存储库缓存和解析缓存。第二个会覆盖每个分辨率,并且永远不应该被多个进程同时使用。

    设置一个指向临时目录的环境变量 你的竹代理。 为您的项目创建一个单独的 ivysettings.xml 文件。 在项目的 ivysettings.xml 中使用环境变量来设置缓存目录。

这里是一个ivysettings.xml的例子:

<ivysettings>
  <properties environment="env" />
  <caches resolutionCacheDir="$env.TEMP_RESOLUTION_CACHE" />

  <settings defaultResolver="local" />

  <statuses default="development">
    <status name="release" integration="false"/>
    <status name="integration" integration="true"/>
    <status name="development" integration="true"/>
  </statuses>

  ...    

</ivysettings>

或者你可以试试lock-strategy。我没试过。

【讨论】:

我还没有尝试过锁定策略。但是我找不到关于它的示例或 XSD 文件,所以我真的真的不知道在哪里放置这样的元素 描述缓存时可以使用这个参数:ant.apache.org/ivy/history/latest-milestone/settings/…

以上是关于常春藤的单独缓存文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖常春藤缓存的位置?

使用 maven 存储库作为本地常春藤缓存

常春藤从常春藤缓存中删除不需要的(旧)工件

常春藤发布到存储库不会更新本地缓存

无法使用 Eclipse 中的 IvyDE 插件从常春藤缓存中删除过时的工件

如何在 Grails 1.2.5 上清除 Ivy 缓存