Как преобразовать свойство в несколько аргументов для задачи <exec> - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть свойство, содержащее несколько значений, и я хочу выполнить команду с отдельным аргументом "-j" для каждого значения в свойстве.

Например, <property name="arguments" value="foo bar hello world"/>

Должен выполнить: mycommand -j foo -j bar -j hello -j world

Я использую Ant 1.7.1, поэтому я не могу использовать атрибут "prefix" (Ant 1.8) на <arg> элемент <exec> задачи.

Один из обходных путей - вставить вручную «-j» в свойство вручную, а затем использовать атрибут «line» <arg>:

<property name="args" value="-j foo -j bar -j hello -j world"/>
<exec executable="mycommand">
    <arg line="${args}"/>
</exec>

... Но я предпочитаю, чтобы свойство было простым списком без встроенных аргументов.

Редактировать : На самом деле мои аргументы - это пути в файле XML, поэтому болееточный список аргументов будет:

<property name="arguments" value="/foo/bar /hello/world /a/very/long/path"/>

Я бы хотел, чтобы команда затем выполнялась с аргументами: "-j / foo / bar -j / hello / world -j / a / very / long / path",Обратите внимание, что косые черты остаются косыми чертами даже под Windows (это аргументы команды, а не имена файлов).

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Для этого вы можете использовать инструментальные средства Ant.

<property name="arg_list" value="foo bar hello world"/>    
<resources id="arguments">
  <mappedresources>
    <string value="${arg_list}" />
    <filtermapper>
      <replacestring from=" " to=" -j "/>
    </filtermapper>
  </mappedresources>
</resources>
<property name="arguments" value="-j ${toString:arguments}" />

Приведенное выше приведёт к получению свойства arguments со значением -j foo -j bar -j hello -j world, которое затем может быть использовано в exec argline.

Альтернативно pathconvert task может помочь в этом отношении:

<property name="arg_list" value="foo bar hello world"/>    
<pathconvert property="arguments" pathsep=" ">
  <chainedmapper>
    <flattenmapper />
    <regexpmapper from="(.*)" to="-j \1" />
  </chainedmapper>
  <filelist files="${arg_list}" />
</pathconvert>

Если у вас есть абсолютные пути, а не только строки в списке, тогдаудалите flattenmapper.

Если у вас есть относительные пути, замените строку flattenmapper на:

<globmapper from="${basedir}/*" to="*" />

, чтобы предотвратить преобразование путей в абсолютные.

В случае, если у вас есть UNIX-подобные пути в arg_list в системе Windows, настройки по умолчанию для pathconvert не будут работать - пути преобразуются в стиль Windows.Вместо этого для обработки списка используйте:

<pathconvert property="arguments" pathsep=" " targetos="unix">
  <chainedmapper>
    <regexpmapper from="C:(.*)" to="-j \1" />
  </chainedmapper>
  <filelist files="${arg_list}" />
</pathconvert>

Обратите внимание на настройку targetos и пересмотренное выражение regexmapper from.

0 голосов
/ 02 февраля 2012

Не уверен, что вы чувствуете себя комфортно с языками сценариев, но вы также можете встроить сценарий для выполнения анализа / повторной сборки:

http://ant.apache.org/manual/Tasks/script.html

Я скажу, я думаю, что это немного хрупко, потому чтоу вас есть явная ссылка на название проекта ANT, но до вас:

<?xml version="1.0" encoding="utf-8"?>
<project name="ScriptProj" basedir=".">

    <property name="arguments" value="foo bar hello world"/>

    <target name="test">

        <script language="javascript">
            <![CDATA[

                argsParm = ScriptProj.getProperty("arguments");
                argsParmAmend = "";
                args = argsParm.split(" ");

                for (i = 0; i < args.length; i++)
                    argsParmAmend = argsParmAmend + "-j " + args[i] + " ";

                // remove trailing string
                ScriptProj.setProperty("arguments.amended", argsParmAmend.substr(0, argsParmAmend.length-1));
            ]]>
        </script>

        <echo>${arguments}</echo>
        <echo>${arguments.amended}</echo>

    </target>

</project>
0 голосов
/ 02 февраля 2012

Используйте некоторые для цикла, вот решение на основе Ant Аддон Флака :

<project name="demo" xmlns:fl="antlib:it.haefelinger.flaka">

 <!-- make standard ant tasks like i.e. exec understand EL expressions -->
 <fl:install-property-handler/>

 <property name="arguments" value="foo bar hello world"/>

 <fl:for var="arg" in="split('${arguments}',' ')">
  <exec executable="mycommand">
   <arg line="#{arg} -j"/>
  </exec>
 </fl:for>

</project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...