解析了我的 ivy.xml
文件后,我想创建一个新的 resolved-ivy.xml
文件,其中包含所有传递依赖项 在解析中找到。 这有可能吗?
这与交付不同,交付(我相信)只从您的 ivy.xml
中写出直接依赖关系,而不是传递依赖关系。 deliver
Ant 任务确实有一个 delivertarget
属性,在文档中看起来它应该这样做。实际上,它仅适用于同一组织中的模块(因此通常不适用于所有依赖项)并为每个模块生成一个文件。
它也不同于解析时生成的 ivy-report
XML 文件,但差别不大。如果我正在尝试的是不可能的,那么我会直接破解这个文件,我想。
此处的上下文试图实现可重复的可复制构建,包括在存储库发生更改(新库、版本)的情况下。互联网上有一些帖子试图做到这一点,但我发现没有一个能正确地做到这一点。
- 添加到 Ivy 存储库可以改变解析结果,特别是如果存储库中任何地方的任何依赖项(不仅仅是您的项目)具有范围依赖项。示例:
A
依赖于B;[2.0,4.0]
并且B;3.1
稍后添加到存储库。 - 想法是像往常一样解析,将解析写成扁平化的 Ivy 文件,将其保存在项目的 VCS 中用于该标记(或其他),然后使用
transitive="false"
解析该文件>。假设存储库中的现有项目没有改变,这允许可重复构建。 - 如果有人对此有更好的想法,我会洗耳恭听。目前我希望必须破解
ResolveEngine
的一些组合以使ResolveReport
可用,然后添加自定义DeliverEngine
以使用
最佳答案
artifactreport> 可能会有所帮助。
使用 deliver 任务创建一个 ivy.xml,动态版本约束替换为静态版本约束(即 [2.0,3.0[ 变为 2.2.1):
<ivy:deliver conf="*(public)" deliverpattern="${dist.dir}/ivy.xml"/>
然后对该文件使用 resolve 任务来准备 artifactreport。
<ivy:resolve file="${dist.dir}/ivy.xml"
conf="*(public)"
refresh="true"
type="ivy" />
最后,artifactreport 将执行瞬时依赖解析。
<ivy:artifactreport tofile="${dist.dir}/artifactreport.xml" />
artifactreport.xml 看起来像
<modules>
<module organisation="com.googlecode.flyway" name="flyway" rev="1.7" status="release"/>
<module organisation="org.postgresql" name="postgresql-jdbc" rev="9.0" status="release"/>
<module organisation="org.hibernate" name="hibernate" rev="3.3.2" status="release"/>
<module organisation="org.apache.commons" name="commons-daemon" rev="1.0.2" status="release"/>
...
使用 XSLT 生成 ivy.xml 表单。
关于java - Ivy - 将解析结果输出到 ivy 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444660/