Я хочу вызвать задачу <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
. Преобразование пути вызывает цепочку сопоставления для каждого пути. Если регулярное выражение совпадает, оно принимает, что в противном случае оно принимает идентичность. Регулярное выражение просто говорит, что если мы найдем что-то без пробела, а затем что-то с хотя бы пробелом, заключите его в двойные кавычки.