JavaScript + проблема ANT - PullRequest
       17

JavaScript + проблема ANT

1 голос
/ 23 ноября 2011

работает над файлом сборки ANT, где у меня определены два макроса и мне нужно вызывать один макрос из другого.

Вот что мне нужно сделать (я упростил весь сценарий для облегчения понимания). Моя главная цель вызывает FirstMacro с двумя параметрами. Первый макрос должен сделать «что-то» с двумя полученными параметрами и сделать встроенный вызов SecondMacro.

Одним из параметров, передаваемых FirstMacro, является путь к файлу с обратной косой чертой (). Когда я печатаю его в макросе с помощью echo, он печатается нормально. Но когда я передаю тот же параметр в SecondMacro через JavaScript, обратная косая черта исчезает (вместо 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>

1 Ответ

0 голосов
/ 24 ноября 2011
<firstMacro param1="C:\\TestFolder/TestFile" param2=""/>

печать

main:

[echo] firstMacro первый параметр: C: \ TestFolder / TestFile
[echo] firstMacro второй параметр:
[echo] secondMacro param: C: \ TestFolder / TestFile.out

Это должно быть проблемой вашего кода JS.Я мало знаю о JS, но обратная косая черта означает «это символ перехода» на большинстве языков.Поэтому, когда JS видит одну обратную косую черту, он может рассматривать его как escape-символ и выполнять какое-то преобразование ... Даже если вы используете бобовую оболочку или что-то еще, подобное может произойти.

ДляЧтобы решить эту проблему, вы можете попытаться изменить свой код JS (что я не могу помочь, извините) или попробовать использовать косую черту (/) вместо обратной косой черты .

Обновить: вы можете использовать задачу if из ant-contrib.
Вот пример версии 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>
...