我有一个 ant 脚本,它导入其他脚本,这些脚本导入其他脚本,导致定义可能发生的地方的网络。
ant 可以拉入所有定义并像 maven 一样输出一个文件help:effective-pom
吗?
我想将此作为输出文件添加到我的构建中,以使调试更容易一些。
我有一个 ant 脚本,它导入其他脚本,这些脚本导入其他脚本,导致定义可能发生的地方的网络。
ant 可以拉入所有定义并像 maven 一样输出一个文件help:effective-pom
吗?
我想将此作为输出文件添加到我的构建中,以使调试更容易一些。
您可以创建另一个目标来创建这种文件。例如,它可能如下所示:
main build.xml 做了一些工作,也可以生成有效的构建:
<project name="testxml" default="build">
<import file="build1.xml" />
<import file="build2.xml" />
<target name="build">
<echo>build project</echo>
</target>
<target name="effective.build">
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpath="C:\Program Files (x86)\groovy-2.1.4\embeddable\groovy-all-2.1.4.jar" />
<groovy>
def regex = ~/import file="(.*)"/
def buildXmlContent = new File('build.xml').text
new File('build.xml').eachLine {
line -> regex.matcher(line).find() {
def file = new File(it[1])
if (file.exists()) {
def replacement = file.getText().replaceAll(/<project.*/, '').replaceAll(/<\/project.*/, '')
buildXmlContent = buildXmlContent.replaceFirst(/<import.*/, replacement)
}
}
}
new File('build.effective.xml') << buildXmlContent
</groovy>
</target>
</project>
为测试创建了两个 build.xml:
<project name="testxml2" default="build">
<target name="clean">
<echo>clean project</echo>
</target>
</project>
<project name="testxml1" default="build">
<target name="test">
<echo>test project</echo>
</target>
</project>
如果您将运行ant effective.build
,您将获得包含以下内容的新build.effective.xml
文件:
<project name="testxml" default="build">
<target name="test">
<echo>test project</echo>
</target>
<target name="clean">
<echo>clean project</echo>
</target>
<target name="build">
<echo>build project</echo>
</target>
<target name="effective.build">
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpath="C:\Program Files (x86)\groovy-2.1.4\embeddable\groovy-all-2.1.4.jar" />
<groovy>
import java.util.regex.Pattern
def regex = ~/import file="(.*)"/
def buildXmlContent = new File('build.xml').text
new File('build.xml').eachLine {
line -> regex.matcher(line).find() {
def file = new File(it[1])
if (file.exists()) {
def replacement = file.getText().replaceAll(/<project.*/, '').replaceAll(/<\/project.*/, '')
buildXmlContent = buildXmlContent.replaceFirst(/<import.*/, replacement)
}
}
}
new File('build.effective.xml') << buildXmlContent
</groovy>
</target>
</project>
为此,我选择了 groovy(因为我实际学习了它),但您可以用另一种语言创建它。您还可以将此 groovy 代码编译为 ant 任务并将其用作新任务,例如<effectiveant outfile="build.effective.xml">
. 我的示例并不完美,但它显示了其中一种解决方案。