我有以下ant构建文件,它试图连接一堆JavaScript文件,这样我就可以编写模块化代码,但只提供一个js文件。每次我在项目中保存文件时,Eclipse都会自动运行该脚本,这大大简化了我的工作流程。
我的问题
当Eclipse执行构建脚本时,一切都很好。如果我尝试直接从命令行运行ant,我会收到一条错误消息:
/home/formigone/html5voodoo/build.xml:38: file attribute is null!
这是我的剧本:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Build example" default="all" basedir=".">
// ...
<property name="SRC_JS_DIR" value="${basedir}/js/hvdoo" />
<property name="DIST_JS_DIR" value="${basedir}/js/out" />
<property name="DIST_JS_TMP" value="${basedir}/js/out/tmp" />
// ...
<property name="JS_OUT_DEF" value="${DIST_JS_TMP}/__def.js" />
<property name="JS_OUT_CODE" value="${DIST_JS_TMP}/__code.js" />
<property name="JS_OUT_LINKED" value="${DIST_JS_TMP}/__out.js" />
<target name="makeDef">
<concat destfile="${JS_OUT_DEF}">
<fileset dir="${SRC_JS_DIR}"
includes="**/__def.js" />
</concat>
</target>
<target name="makeCode">
<concat destfile="${JS_OUT_CODE}">
<fileset dir="${SRC_JS_DIR}"
includes="**/*.js"
excludes="**/__*.js" />
</concat>
</target>
<target name="link">
<concat destfile="${JS_OUT_LINKED}">
<file name="${JS_OUT_DEF}" />
<file name="${JS_OUT_CODE}" />
</concat>
</target>
// ...
<target name="quick" depends="makeDef, makeCode, linkToOut"></target>
(我故意遗漏了这里没有问题的脚本的其他部分)
错误消息引用链接目标中的此行:
<concat destfile="${JS_OUT_LINKED}">
文件属性为空!在这种情况下是什么意思? 如果我,我可以看到我想要的文件的路径是正确的。那么为什么它可以在Eclipse中运行,而不是com CLI?
谢谢!
答案 0 :(得分:4)
事实证明,问题是<concat>
块缺少<filelist>
来包装单个文件。现在工作脚本如下所示:
<target name="link">
<concat destfile="${JS_OUT_LINKED}">
<filelist dir="${DIST_JS_TMP}">
<file name="${JS_OUT_DEF}" />
<file name="${JS_OUT_CODE}" />
</filelist>
</concat>
</target>
我仍然不确定Eclipse是如何运行脚本的,但我想我并不在乎,因为它可以双向运行。