【问题标题】:Ant publish stuff to different locationsAnt 将东西发布到不同的位置
【发布时间】:2011-12-27 16:01:58
【问题描述】:

我有一个 java 项目和一个 ANT 脚本来构建,然后使用简单的复制命令将项目分发到其他项目。

我只想在 ant 脚本的标头中将复制到文件的位置命名为一次,而不是为依赖于该项目的每个项目指定一个明确的复制任务。

我在 ANT 中找不到类似数组的东西,那么将某些东西分发到多个目录的最干净的方法是什么?

【问题讨论】:

  • 我同意戴夫的观点。听起来您应该发布到 Maven 存储库管理器(例如 Nexus 或 Artifactory),然后让其他项目将您的构建输出作为依赖项拉取。看看吧,你永远不会回头

标签: java deployment ant build copy


【解决方案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”将被分隔符分割成一个列表(可能是字符串[])。这里我们使用逗号来分割它(分隔符的默认值是逗号)。我还添加了“parallel”,使其同时将文件复制到所有“dest.dirs”,但是如果要复制的项目很大,则应该删除“parallel”。

请查看http://ant-contrib.sourceforge.net/tasks/tasks/for.htmlhttp://ant-contrib.sourceforge.net/tasks/tasks/foreach.html 了解更多信息。

【讨论】:

  • 似乎是最直接的解决方案
  • @oers 还是需要下载ant-contrib jar,放到classpath下,加个“taskdef”:P
【解决方案2】:

我不相信你有很多可行的选择:copy 任务只接受一个目录。

  1. 创建您自己的包含目录列表的复制任务。
  2. 执行执行复制的脚本/程序。
  3. 让子项目进行拉动。

我真的很犹豫是否将一个项目推送到其他项目,因为这会假设这些项目将使用新推送的代码。 IMO 的“子”项目应该决定是否需要新版本。

对我来说,这听起来更像是一个依赖管理问题,最好使用 Ivy/Maven/Gradle(或其他类似 Maven)来处理。

话虽如此,听起来您想要执行选项 1,创建一个接受目标目录列表的自定义 Ant 任务;扩展现有的复制任务以获取其所有功能可能很容易——只需添加一个“todirs”属性。

【讨论】:

    【解决方案3】:

    您可以考虑在您的复制任务中使用scriptmapper 并设置enablemultiplemappings 为真。

    首先,在属性中列出目标目录并从中创建一个filelist。 (您可以使用 dirset,但 API for filelist 更简单。)然后运行副本,脚本映射器设置多个目标。

    <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>
    

    【讨论】:

    • ANT-contrib 任务“foreach”和“for”也有帮助吗?就像您示例中的 dest.dirs 一样,使用逗号将其拆分并为“foreach”或“for”中的每个副本进行复制。在我的环境中,“foreach”用于将 Grinder 部署到不同的机器上。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2019-03-01
    相关资源
    最近更新 更多