Как правильно указать путь в задаче муравья? - PullRequest
3 голосов
/ 11 мая 2011

Я хочу вызвать задачу <proguard> в Ant, и мне нужно передать ей пути к различным файлам JAR, например, эквивалент:

<proguard>
   -injars /some/path/jar1;/some other path/jar2
</proguard>

Проблема в том, что некоторые из этих путей могут содержать пробелы или специальные символы, их необходимо заключать в кавычки, как описано в руководстве по proguard :

<proguard>
  -injars /some/path/jar1;"/some other path/jar2"
</proguard>

Это не работает, чтобы процитировать весь аргумент, отдельные пути нужно указывать отдельно. Файл ant, который я изменяю, использует свойства для передачи различных путей JAR для продвижения, и моя проблема заключается в том, как правильно процитировать отдельные пути для -injars и -libraryjars. Пример:

<property name="libraryjars" refid="some.classpath" />
<proguard>
   @${proguard.config}
   -libraryjars  ${libraryjars}
</proguard>

Я только что изменил свойство так:

<property name="libraryjars.unquoted" refid="some.classpath"/>
<property name="libraryjars" value="'${libraryjars.unquoted}'"/>

но это все еще хрупко, не так ли? Есть ли способ лучше? Что касается того факта, что у меня есть свойство с «path1; path2», я бы хотел разделить компоненты пути, заключить их в кавычки и воссоздать свойство. Я знаю, как это сделать в сценарии оболочки, но синтаксис муравья для меня гораздо более загадочный :-) Да, и, конечно, он должен работать на всех платформах (ну, по крайней мере, в Windows, Mac и Linux), имея в виду тот факт, что разделитель пути изменяется, но это нормально, где-то есть константа для этого в скрипте ant.

[Обновить] Спасибо за ответ @ martin, я нашел идеальный способ сделать именно то, что хотел, используя pathconvert с внутренней цепочкой картографических данных :

<pathconvert property="dest.path" refid="source.path">
  <firstmatchmapper>
    <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
    <identitymapper/>
  </firstmatchmapper>
</pathconvert>

Это преобразует C:\path\jar 1;C:\my path\jar2;C:\path\jar3 в "C:\path\jar 1";"C:\my path\jar2";C:\path\jar3. Преобразование пути вызывает цепочку сопоставления для каждого пути. Если регулярное выражение совпадает, оно принимает, что в противном случае оно принимает идентичность. Регулярное выражение просто говорит, что если мы найдем что-то без пробела, а затем что-то с хотя бы пробелом, заключите его в двойные кавычки.

1 Ответ

2 голосов
/ 11 мая 2011

Один из вариантов - использовать задачу proguard 'full-XML', тогда каждый jar будет отдельным элементом, но в целом для рендеринга путей к свойствам вы должны использовать задачу Ant pathconvert, Например:

<fileset id="some.classpath" dir=".">
    ...
</fileset>

<pathconvert property="injars.inner" refid="some.classpath" pathsep='"${path.separator}"' />
<property name="injars" value='"${injars.inner}"' />

Обратите внимание на добавление начальных и конечных двойных кавычек - pathsep применяется только между элементами пути. Затем используйте его так, как вы упомянули:

<proguard>
  -injars ${injars}
</proguard>
...