这并不是一个罕见的问题,因为 @whiskeyspider 表示它并不局限于 Jenkins。在我看来,这也是阻碍大型遗留 ANT 构建的问题之一。随着时间的推移,由于担心它会破坏依赖构建,改变通用逻辑变得越来越困难。
将通用逻辑保存在单独的存储库或 git 子模块中是合理的建议,因为它可以实现该逻辑的版本控制。另一种选择是将公共逻辑打包为ANT lib http://ant.apache.org/manual/Types/antlib.html
<project ... xmlns:common="antlib:com.example.commonbuild">
<taskdef uri="antlib:com.example.commonbuild">
<classpath>
<fileset dir="${lib.dir}" includes="commonbuild-1.0.jar"/>
</classpath>
</taskdef>
..
..
<target name="build">
<common:compileAndPackage srcDir="${src.dir}" buildDir="${build.dir}" jarFile="${build.dir}/${ant.project.name}.jar"/>
</target>
虽然它看起来更复杂,但我仍然坚持创建这些常见任务,以提高构建文件的可重用性和可读性。它还可以让您的组织的定制内容一目了然。我发现它对于隐藏可能涉及讨厌的嵌入式脚本的实现细节特别有用。
最后我非常喜欢使用ivy http://ant.apache.org/ivy/用于管理我的第 3 方依赖项。这意味着我可以轻松地从我的存储库下载我的构建所需的任何版本的通用逻辑。
如何创建 ANT 库
├── build.xml
└── src
└── com
└── example
└── commonbuild
└── antlib.xml
antlib.xml
<antlib>
<macrodef name="compileAndPackage">
<attribute name="srcDir"/>
<attribute name="buildDir"/>
<attribute name="jarFile"/>
<sequential>
<mkdir dir="@{buildDir}/classes"/>
<javac srcdir="@{srcDir}" destdir="@{buildDir}/classes" includeantruntime="false"/>
<jar destfile="@{jarFile}" basedir="@{buildDir}/classes"/>
</sequential>
</macrodef>
</antlib>
Note:
- 此示例有一个任务。实际上,您的通用构建逻辑将提供多个宏定义。
构建.xml
只需打包 XML 文件即可:
<target name="build" description="Create jar">
<jar destfile="${build.dir}/commonbuild-${version}.jar" basedir="${src.dir}"/>
</target>
我的构建逻辑另外会将此 jar 文件发布到我的存储库中,以便其他构建可以使用ivy http://ant.apache.org/ivy/。也意味着通用的构建逻辑可以有一个单独的、正式的发布管理生命周期(在大型组织中非常重要)