如何确定 Ivy 检索任务是不是更新了我的 lib 文件夹中的任何依赖项?

Posted

技术标签:

【中文标题】如何确定 Ivy 检索任务是不是更新了我的 lib 文件夹中的任何依赖项?【英文标题】:How to determine if Ivy retrieve task updated any dependency in my lib folder?如何确定 Ivy 检索任务是否更新了我的 lib 文件夹中的任何依赖项? 【发布时间】:2021-07-14 08:46:39 【问题描述】:

我有一个 Ant 构建,我只想在其依赖项更新时重建一个工件。

对于外部依赖项,这很容易,因为我可以将ivy.xml 的更改日期与工件的创建日期(更新)进行比较。但这不适用于我使用latest.release 定义依赖项修订的内部依赖项。像这样:

<dependencies>
    <dependency org="se.woop" name="thelibrary" rev="latest.release" conf="default->*"/>
</dependencies>

在这种情况下,项目thelibrary 可以生成一个新版本,而无需更改ivy.xml 文件。我想要 resolve 任务上的 checkIfChanged retrieve 任务。

关于如何解决这个问题的任何建议?

编辑:

我意识到我也许可以使用uptodate 函数来检查我的库文件夹是否与最新生产的工件以及它几乎可以工作。这是我最新的样子:

<uptodate targetfile="build/artifacts/theclient.jar" property="artifact.uptodate">
   <srcfiles dir= "src" includes="*"/>
   <srcfiles dir= "lib" includes="*"/>
   <srcfiles dir= "." includes="ivy.xml"/>
</uptodate>

问题在于uptodate 函数会与库文件夹中工件的更改日期进行比较。但是,当文件被复制到库文件夹时(由 Ivy),更改的日期不会更新,但创建的日期会更新。

那么...是否可以将uptodate 与创建日期进行比较?或者是否可以在将依赖项移动到库文件夹时让 Ivy 更新更改的日期?还是有其他可用的解决方案?

【问题讨论】:

【参考方案1】:

“我有一个 Ant 构建,我只想在其依赖项更新时重建一个工件。”停止检查版本。

“问题在于更新函数与库文件夹中工件的更改日期进行比较。”完全停止使用它。

“或者是否有其他可用的解决方案?”是的。

每次您的程序访问该工件时,稍后再使用它,当它不再需要该工件时,复制该工件,然后将该副本保存为具有计数的新工件。像这样:artifact_0001 被访问然后使用,然后当不再需要一个新的 artifact_0002 被保存在库文件夹中。然后 artifact_0001 被删除。如果您需要在程序外部或内部编辑 artifact_0002。

每次您的程序运行时,检查一次是否存在一个 artifact_xxxn,直到找到一个确实存在的 artifact_000n,然后尝试访问它。让它尝试访问xxxx计数的artifact_[xxxx],如果它不能访问artifact_xxxn,那么它会尝试访问artifact_000[n+1]等。当计数达到某个数字时,返回到0或1数数并重新开始。记住只遍历整个 n 范围两次以停止潜在的无限循环。如果整个 artifact_000n 范围被检查了两次并且那里没有任何内容,那么有一个 artifact_default 仅用于让您的程序运行,并且当它运行时,会显示正在使用 artifact_default 的通知,以便您知道修复它。

这应该可以作为跨语言解决方案。

【讨论】:

以上是关于如何确定 Ivy 检索任务是不是更新了我的 lib 文件夹中的任何依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

ivy:publish 是如何工作的?

Ivy - 将解析结果输出到 ivy 文件

ivy (ant) 发布任务的 Nexus url

如何在eclipse中使用Ivy + IvyDE将不同的jar放到lib和web-inf/lib中

IVY 错误:找不到 ivy.xml 文件

如何解决模块 X 的多个工件被检索到 Apache Ivy 中的同一个文件?