gpt4 book ai didi

ant - 在 Ant 中在运行时创建一个具有动态内容的 Union 和 Macrodef 样式的元素

转载 作者:行者123 更新时间:2023-12-03 17:56:41 26 4
gpt4 key购买 nike

我有一个用 Ant 构建的构建脚本,它有一个宏定义,它接受一些默认参数、目标、根等,然后是可选的两个参数,extrasrc-f 和 extrasrc-c。他们进来后,我喜欢对所有相关资源进行最新检查,然后仅在目标已过期时才进行构建。

我目前所拥有的,

<?xml version="1.0" encoding="UTF-8"?>
<project name="Custom build" default="default">

<taskdef resource="net/sf/antcontrib/antlib.xml"
classpath="C:/dev/ant/ant-contrib/ant-contrib-1.0b3.jar"/>

<macrodef name="checkuptodate">
<attribute name="target" />
<element name="resource" />
<sequential>
<condition property="needbuild">
<and>
<resourcecount when="greater" count="0"> <resource /> </resourcecount>
<not>
<uptodate targetfile="@{target}">
<srcresources> <resource /> </srcresources>
</uptodate>
</not>
</and>
</condition>
</sequential>
</macrodef>

<macrodef name="projbuild">
<attribute name="root" />
<attribute name="target" />

<element name="extrasrc-f" optional="true" />
<element name="extrasrc-c" optional="true" />
<sequential>
<local name="needbuild" />
<checkuptodate target="@{root}/bin/@{target}">
<resource>
<union>
<extrasrc-f />
<fileset dir="@{root}/src" includes="**/*.java" />
</union>
</resource>
</checkuptodate>

<if>
<istrue value="${needbuild}" />
<then>
<javac
srcdir="@{root}/src"
destdir="@{root}/bin"
includeantruntime="false"
>
<extrasrc-c />
</javac>
</then>
</if>

</sequential>
</macrodef>

<target name="default">

<projbuild root="." target="EntryPoint.class">
<extrasrc-f>
<fileset dir="Proj2/src" includes="**/*.java" />
<fileset dir="Proj3/src" includes="**/*.java" />
</extrasrc-f>
<extrasrc-c>
<classpath location="Proj2/src" />
<classpath location="Proj3/src" />
</extrasrc-c>
</projbuild>

</target>

</project>

但是正如你所看到的,在这个时间点,对我来说效率低下,做我想做的事,我必须创建并传递至少一个文件集和多个类路径。我真正想做的只是传入一个目录列表,然后根据该信息动态创建 extrasrc-f 和 extrasrc-c 元素,但对于我的生活,我不知道我是怎么做的我能够做到这一点。

我已经阅读了很多关于 Ant 和 Ant-Contrib 时髦类的文章,但是我没有读到任何可以让我做这样的事情的东西,我觉得这很奇怪,因为对我来说这看起来很明显。

我是在以一种非常错误的方式处理这个问题,还是我遗漏了什么?如果我真的误用了 Ant,我会喜欢关于如何正确执行此操作的正确方向的指针,在测试多个源的宏定义(或目标,如果这是唯一的方法)中创建一个包罗万象的模板构建文件针对一个构建的文件,同时也传递额外的类或库路径,最好是在一个列表中。

最佳答案

也许你可以使用几个 <scriptdef> 任务来帮助分解这些宏。

第一种,采用逗号分隔的目录列表并生成 <union>从他们。您提供 refid你想用 id 来引用联合属性。有可选的包含和排除。

<scriptdef name="dirs2union" language="javascript">
<attribute name="dirs" />
<attribute name="id" />
<attribute name="includes" />
<attribute name="excludes" />
<![CDATA[
var dirs = attributes.get( "dirs" ).split( "," );
var includes = attributes.get( "includes" );
var excludes = attributes.get( "excludes" );

var union = project.createDataType( "union" );
project.addReference( attributes.get( "id" ), union );

for ( var i = 0; i < dirs.length; i++ ) {
var fs = project.createDataType( "fileset" );
fs.setDir( new java.io.File( dirs[i] ) );
if ( includes )
fs.setIncludes( includes );
if ( excludes )
fs.setExcludes( excludes );

union.add( fs );
}
]]>
</scriptdef>

第二个 - 非常相似 - 脚本与路径生成等效:
<scriptdef name="dirs2path" language="javascript">
<attribute name="dirs" />
<attribute name="id" />
<![CDATA[
var dirs = attributes.get( "dirs" ).split( "," );

var path = project.createDataType( "path" );
project.addReference( attributes.get( "id" ), path );

for ( var i = 0; i < dirs.length; i++ ) {
var pe = project.createDataType( "path" );
pe.setLocation( new java.io.File( dirs[i] ) );
path.add( pe );
}
]]>
</scriptdef>

一个示例使用可能是这样的:
<property name="dirs" value="Proj2/src,Proj3/src" />

<dirs2union dirs="${dirs}" id="my.union" includes="**/*.java" />
<dirs2path dirs="${dirs}" id="my.path" />

... later (e.g.) ...

<union refid="my.union" />
<classpath refid="my.path" />

然后您可以修改您的宏以采用 dirs属性并在内部生成联合和类路径,或者可能在其他地方生成一次并传递引用。

我没有尝试包含 @{root}图中的目录,但应该可以为此调整上述内容。

关于ant - 在 Ant 中在运行时创建一个具有动态内容的 Union 和 Macrodef 样式的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10489186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com