Phing中toString结合fileset无插值结果问题求助
解决Phing中${toString:sourcefiles}无法插值的问题
嘿,刚接触Phing遇到这种小坑很正常,我来帮你搞定这个问题~
为什么你的写法不生效?
你遇到的核心问题是:Phing的<echo>任务默认不能直接解析${toString:sourcefiles}这种特殊的fileset引用语法。这种语法更多是在其他任务(比如<copy>、<delete>)中直接引用fileset时使用,但在echo中需要先把fileset的内容显式转换成普通属性,才能正常输出。
正确的写法示例
修改你的build.xml,通过<toString>任务先把fileset的内容转成属性,再在echo中引用这个属性:
<project default="dist"> <property name="BUILD_DIR" value="./buildTest"/> <target name="dist"> <!-- 定义fileset,注意include路径不需要加./,因为dir已经指定了基准目录 --> <fileset id="sourcefiles" dir="${BUILD_DIR}"> <include name="*.*" /> <!-- 如果要递归匹配所有子目录的文件,改成 <include name="**/*.*" /> --> </fileset> <!-- 关键步骤:把fileset的内容转换为普通属性 --> <toString property="sourcefiles_list" refid="sourcefiles"/> <!-- 现在可以正常输出文件列表了 --> <echo>files in build dir: ${sourcefiles_list}</echo> <echo>build dir: ${BUILD_DIR}</echo> <echo>OS: ${os.name}</echo> </target> </project>
关于文档的疑问
文档并没有错误~你看到的示例是在直接引用fileset的任务场景下使用的(比如用fileset作为某个任务的输入),这种情况下${toString:sourcefiles}是可以直接生效的。但<echo>属于属性插值场景,需要先通过<toString>任务完成转换,两者的使用场景不同而已。
另外补充两个小细节:
- 你尝试的单行fileset写法
<fileset id="sourcefiles" dir=".build" includes="**/*.txt"/>,同样需要搭配<toString>任务才能在echo中输出内容; - 确保
BUILD_DIR对应的目录确实存在,否则fileset会是空的,输出自然也没有内容。
内容的提问来源于stack exchange,提问作者Robert Wildling
相关产品推荐
相关产品推荐

