我创建了几个自定义条件用于我的项目的构建过程。细节可能不是很相关,但它们的逻辑很少,用于有条件地抑制ivy:resolve
任务的运行(这是否是一个好主意是一个单独的问题,但对于我的项目来说,这需要增加 12 秒构建过程甚至只是读取缓存)。
我遇到的问题是第一次构建项目时,这些条件的实现(现在位于使用它们的项目的主源树中)不可用。在这种情况下,无论如何我都想运行<ivy:resolve>
,这样我就可以condition
完全构建项目(包括实现),然后condition
实现可以供以后使用。
我试图通过希望or
条件懒惰地工作并利用其中的available
元素来实现这一点:
<typedef onerror="report" name="olderormissing" classname="myproject.buildutils.FileOlderOrMissingCondition" classpath="${main.jar}" />
<condition property="ivy.needs.refresh">
<or>
<!-- fetch new if we don't have the helper classes -->
<not><available classname="myproject.buildutils.FileOlderOrMissingCondition" /></not>
<!-- only fetch ivy deps hourly -->
<olderormissing file="${ivy.build.record}" threshold="3600" />
</or>
</condition>
<!-- Ivy task using the above property -->
<target name="resolve" description="--> retrieve dependencies with ivy" if="${ivy.needs.refresh}">
<ivy:retrieve symlink="true" sync="false" pattern="${jars.dir}/[conf]/[artifact].[ext]" keep="true" log="download-only" />
</target>
我曾希望,如果实现类不可用,则or
条件会从第一个条件中吐出 true 并忽略缺失的类型。但是,这不起作用,而是以“或不支持嵌套的“olderormissing”元素失败。” 也许这种方法将是徒劳的?
理想情况下,我希望 Ant 处理此问题,而无需将条件实现拆分为需要显式手动预编译的单独或子项目(如果我可以让 Ant 自动编译子项目,那就太好了,但我可以'没有办法让这种情况发生得足够早,以便满足需求typedef
)。对于在类中实现的两行逻辑来说,一个单独的项目肯定感觉有点矫枉过正。
这个关于 taskdefs 的相关问题似乎是相关的,但并不完全适用于这个用例 AFAICT。