常春藤的单独缓存文件夹
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/…以上是关于常春藤的单独缓存文件夹的主要内容,如果未能解决你的问题,请参考以下文章