我有一个java项目和一个ANT脚本要构建,然后用一个简单的复制命令将项目分发到其他项目。
我希望在ant脚本的头文件中只命名要复制到文件的位置,而不是为依赖于此项目的每个项目都指定显式的复制任务。
我在ANT中找不到像数组这样的东西,那么将一些东西分发到多个目录的最干净的方法是什么?
根据我在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。
我不相信你有很多可行的选择:copy
任务只接受一个目录。
- 创建自己的复制任务,获取目录列表
- 执行一个脚本/程序进行复制。
- 让子项目做拉。
我真的很犹豫是否要把一个项目推到其他项目上,因为这假设了那些项目将使用新推的代码。在我看来,"子"项目应该决定他们是否需要新版本。
对我来说,这听起来更像是一个依赖管理问题,最好用Ivy/Maven/Gradle(或其他类似Maven的)来处理。
说了这么多,听起来你想做选项1,创建一个接受目标目录列表的自定义Ant任务;扩展现有的复制任务以获得其所有功能可能非常简单——只需添加一个"todirs"属性。
您可以考虑在您的复制任务中使用scriptmapper
, enablemultiplemappings
为true。
首先,在属性中列出目标目录并从中创建filelist
。(您可以使用dirset,但用于文件列表的API更简单。)然后运行副本,使用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>