1

我正在尝试创建 2 个 zip 文件作为 ant 任务的一部分。两者相似,但其中包含一些额外的数据。因此,为了减少代码,我想定义一个文件集并引用它。唯一的问题是会产生错误。

任务:

<target name="create-zips" depends="cleanup, compile, package-jar">

    <zipfileset id="zipfiles">
        <zipfileset dir="${ant.project.name}-dist" includes="${jarname}.jar" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram_gui" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram_gui.command" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram.bat" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram_gui.bat" filemode="755" prefix="${title}"/>
        <zipfileset dir="${docs.dir}" includes="myprogram_readme.txt" prefix="${title}"/>
    </zipfileset>

    <zip destfile="${deploy.dir}/myprogram_${version}.zip" whenempty="fail" defaultexcludes="true">
         <zipfileset refid="zipfiles"/>
        <zipfileset dir="${otherdata.dir}" includes="other/*.*" prefix="${title}"/>
    </zip>
    <zip destfile="${deploy.dir}/myprogram_noother_${version}.zip" whenempty="fail" defaultexcludes="true">
        <zipfileset refid="zipfiles"/>
    </zip>
</target>

任务运行时:

    create-zips:

BUILD FAILED
/path/to/my/buildfile/build-tools.xml:119: Problem opening /path/to/my/data/docs/myprogram_readme.txt

我已经验证该文件存在。删除自述文件只会使错误发生在不同的文件上。此外,如果我只是将 zipfileset 复制并粘贴到 2 个单独的标签中,一切正常。但我宁愿不那样做。

编辑:2011 年 10 月 14 日编译的 Apache Ant(TM) 版本 1.8.2,Mac OS X 10.7。其他平台没试过。

4

1 回答 1

1

我曾经尝试做同样的事情,但无济于事。Afileset不接受嵌套fileset。当您尝试作弊并zipfileset用作外集时,ant 会将其内容视为 zip 文件。当 ant 尝试解压缩您的文件时,您会收到打开错误

一个fileset必须有的dir属性。此目录必须是所有文件集组件的父目录。悲伤但真实。

我最终找到了解决方法。创建 X 文件集。这些文件集可以指定为zip任务的嵌套元素。如果在给定的情况下您需要少于 X,则为所有 X 文件集设置默认值,并始终压缩所有 X。

<!-- define X empty filesets -->
<fileset dir="c:\temp\1" includes="asdfasdf.neverhappens" id="nullfileset" />
<fileset id="zipfileset2" refid="nullfileset" />
<fileset id="zipfileset3" refid="nullfileset" />

<!-- here go real sets -->
<zipfileset dir="${scripts.dir}" includes="myprogram" />

小心 ant 文件集。它们是可变的。我曾经写过一个关于它的“问题”,但有人删除了它。干得好安静的工作,堆栈的人,“谢谢”。

EDIT1:在 Linux 上,可以尝试使用dir="/"嵌套在. 我在 Windows 上遇到问题,所以我不能这样做。Windows 上没有“/”,我正在从不同的驱动器收集文件。selectorfileset

于 2012-02-29T08:32:12.280 回答