正在处理ANT构建文件,其中定义了两个宏,需要从另一个宏调用一个宏。
这是我需要做的(为了便于理解,我简化了整个场景)。我的主要目标用两个参数调用FirstMacro。First Macro需要使用接收到的两个参数做"某事",并对SecondMacro进行嵌入式调用。
传递给FirstMacro的参数之一是带有"反斜杠"()的文件路径。当我在宏中使用echo打印它时,它打印得很好。但是当我通过JavaScript将相同的参数传递给SecondMacro时,反斜杠就不见了(而不是C:Test我看到的是C:Test)。保留反斜杠或用正斜杠替换它们的解决方案是什么?
请注意,我正在使用ANT 1.7,我已经尝试过string.replace(//g,"/")等
还请注意,您可以复制粘贴下面的整个代码,将其保存为build.xml,并尝试运行主任务以查看运行中的问题。
<?xml version="1.0"?>
<project name="build" basedir="." default="main">
<description>
==========================
Macro: Second Macro
==========================
</description>
<macrodef name="secondMacro">
<attribute name="param"/>
<sequential>
<echo>secondMacro param: @{param}</echo>
</sequential>
</macrodef>
<description>
==========================
Macro: FirstMacro
==========================
</description>
<macrodef name="firstMacro">
<attribute name="param1"/>
<attribute name="param2"/>
<sequential>
<echo>firstMacro first param: @{param1}</echo>
<echo>firstMacro second param: @{param2}</echo>
<script language="javascript">
<![CDATA[
var ext = "@{param2}";
if ("".equals(ext)) {
ext = "out";
}
macrotask = project.createTask("secondMacro");
macrotask.setDynamicAttribute("param", "@{param1}" + "."+ext );
macrotask.perform();
]]>
</script>
</sequential>
</macrodef>
<description>
==========================
Target: main target
==========================
</description>
<target name="main">
<firstMacro param1="C:TestFolder/TestFile" param2=""/>
</target>
</project>
<firstMacro param1="C:\TestFolder/TestFile" param2=""/>
打印
主:[echo] firstMacro第一个参数:C:TestFolder/TestFile
[echo] firstMacro第二个参数:
[echo] secondMacro参数:C:TestFolder/TestFile。
这应该是你的JS代码的问题。我对JS知之甚少,但反斜杠在大多数语言中表示"这是一个转义字符"。因此,当JS看到单个反斜杠时,它可能会将其视为转义字符并进行一些转换…即使你使用beanshell或其他东西,也可能发生类似的事情。
要解决这个问题,你可以尝试修改你的JS代码(我不能帮助,对不起)或尝试使用斜杠(/)而不是反斜杠。
更新:你可以从ant-contrib中使用if任务
下面是if-task版本"firstMacro"的示例。
<macrodef name="firstMacro">
<attribute name="param1"/>
<attribute name="param2"/>
<sequential>
<echo>firstMacro first param: @{param1}</echo>
<echo>firstMacro second param: @{param2}</echo>
<if>
<equals arg1="@{param2}" arg2="" />
<then>
<property name="param" value="@{param1}.out" />
</then>
<else>
<property name="param" value="@{param1}.@{param2}" />
</else>
</if>
<secondMacro param="${param}" />
</sequential>
</macrodef>