我有一个java项目和一个ANT脚本来构建,然后使用简单的复制命令将项目分发到其他项目。
我只想在ant脚本的标题中将复制到文件的位置命名为一次,并且对于依赖于此项目的每个项目都没有明确的copy-task。
我在ANT中找不到类似数组的内容,那么将内容分发到多个目录的最简洁方法是什么?
答案 0 :(得分:1)
我不相信你有很多可行的选择:copy
任务只接受一个目录。
我真的对将项目推送到其他项目犹豫不决,因为这假设这些项目将与新推出的代码一起使用。 IMO“子”项目应该做出决定,如果他们想要新版本。
对我而言,这听起来更像是依赖管理问题,使用Ivy / Maven / Gradle(或其他Maven-like)可以更好地处理。
所有这一切,听起来你想做选项1,创建一个接受目标目录列表的自定义Ant任务;可以很容易地扩展现有的复制任务以获得其所有功能 - 只需添加“todirs”属性。
答案 1 :(得分:1)
您可以考虑在复制任务中使用scriptmapper
enablemultiplemappings
为真。
首先,列出属性中的目标目录并从中创建filelist
。 (您可以使用dirset,但API for filelist更简单。)然后运行副本,并使用scriptmapper设置多个目标。
<property name="dest.dirs" value="/dir/one,/dir/two,/dir/thr/ee" />
<filelist id="dests" dir="/" files="${dest.dirs}" />
<copy todir="/" enablemultiplemappings="yes">
<fileset dir="${srd.dir}" />
<scriptmapper language="javascript">
<![CDATA[
// Obtain a reference to the filelist
var filelist = project.getReference( "dests" );
var dests = filelist.getFiles( project );
for ( var i = 0; i < dests.length; i++ )
{
self.addMappedName( dests[i] + "/" + source );
}
]]>
</scriptmapper>
</copy>
答案 2 :(得分:1)
根据我在Martin的回答中评论的内容,我想将我的解决方案版本作为另一种选择发布。我正在使用Martin的答案中的属性名称来表达清楚。
<target name="deploy" >
<property name="dest.dirs" value="/dir/one,/dir/two,/dir/thr/ee" />
<for list="${dest.dirs}" param="dest.dir" parallel="true" delimiter="," >
<sequential>
<copy todir="@{dest.dir}" >
<fileset dir="${srd.dir}" />
</copy>
</sequential>
</for>
</target>
请注意“for”是一个Ant-Contrib任务,它在后面使用Macrodef所以你应该使用@ {}来引用“dest.dir”; “dest.dirs”将被分隔符拆分为一个列表(可能是String [])。这里我们用逗号分割它(默认值为分隔符是逗号)。我还添加了“parallel”以使其同时将文件复制到所有“dest.dirs”,但是,如果要复制的项目很大,则应删除“parallel”。
请检查http://ant-contrib.sourceforge.net/tasks/tasks/for.html 和http://ant-contrib.sourceforge.net/tasks/tasks/foreach.html了解更多信息。