【发布时间】:2017-02-06 14:01:39
【问题描述】:
我需要构建一个基于 CI 输出构建项目的自定义 Ant 脚本。我们使用 Atlassian Bamboo 作为 CI 服务器。
通常我们的项目依赖于我们的平台模块,通过 Ivy/Artifactory 管理。
我们典型的 dependencies.xml 文件包含对 that 模块的依赖,可传递。 和 其他潜在的依赖项。例如,我们的核心模块依赖于很多 Spring 包,但不依赖于 Spring Boot。如果一个项目也需要 Spring Boot,它将在其 dependencies.xml 文件中定义其依赖关系以及 <depencency org="com.acme" name="core-platform"...
我现在的目标是从解析中排除 com.acme#core-platform,因为我正在做一个不同的任务,它使用 Bamboo 输出工件来获取核心模块的最新版本及其依赖项而不通过 Artifactory .
这非常重要,因为在构建期间我可能想更改依赖包的版本(例如,将 Spring 4.3.1 升级到 4.3.3)并使用正确的 Spring 进行测试。如果我只是简单地将依赖关系解析为在 Artifactory 上发布的 com.acme#core-platform#latest.release,我将不会采用已提交给 Git 并在 core-platform 当前正在构建的 dependencies.xml 中提供的 Spring 4.3.3。我希望我的解释容易理解。
假设我以这个依赖列表为例
com.acme#core-platform#${version}
org.hibernate#hibernate-java8#5.1.0.Final
org.springframework.boot#spring-boot-starter-web#1.3.1.RELEASE
commons-collections#commons-collections#3.2.2
.... others
完全依赖是
<dependencies>
<dependency org="com.acme" name="core-platform" rev="${version}" transitive="true" conf="runtime->runtime" changing="true"/>
<dependency org="com.acme" name="core-platform" rev="${version}" transitive="true" conf="compile->compile" changing="true"/>
<dependency org="com.acme" name="core-platform" rev="${version}" transitive="true" conf="provided->provided" changing="true"/>
<dependency org="com.acme" name="core-platform" rev="${version}" transitive="true" conf="junit->junit" changing="true"/>
<dependency org="com.acme" name="core-platform" rev="${version}" transitive="true" conf="test->test" changing="true"/>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-java8 -->
<dependency org="org.hibernate" name="hibernate-java8" rev="5.1.0.Final" transitive="false" />
<dependency org="org.springframework.boot" name="spring-boot-starter-web" rev="1.3.1.RELEASE" transitive="false" />
<dependency org="org.springframework.boot" name="spring-boot-starter-tomcat" rev="1.3.1.RELEASE" transitive="false" />
<dependency org="org.springframework.boot" name="spring-boot-starter-validation" rev="1.3.1.RELEASE" transitive="false" />
<dependency org="commons-collections" name="commons-collections" rev="3.2.2" transitive="false" />
<!-- jackson2 libs -->
<dependency org="com.fasterxml.jackson.datatype" name="jackson-datatype-jdk8" rev="2.8.1" transitive="false" conf="runtime->*"/>
<dependency org="com.fasterxml.jackson.datatype" name="jackson-datatype-jsr310" rev="2.8.1" transitive="false" conf="runtime->*"/>
<exclude module="joda-time" />
<exclude module="jackson-datatype-joda" />
</dependencies>
我只是想拿Hibernates的Java8、commons-collections等。
- 创建重复的dependencies.xml 不是一个选项
- 我正在考虑通过 Ant 操作 dependencies.xml 并让它通过正则表达式排除
acme模块。可行但很棘手 - 很遗憾,我不能将 Ant 任务的
ivy:retrieve与属性file和元素exclude结合起来,因为那样会很麻烦
有什么想法吗?
【问题讨论】: