javascript + ANT issue



正在处理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>

相关内容

  • 没有找到相关文章

最新更新