#ant #quotes #proguard
#ant #кавычки #proguard
Вопрос:
Я хочу вызвать <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 использует свойства для передачи различных путей JARS в proguard, и моя проблема заключается в том, как правильно указывать отдельные пути для -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», я бы хотел разделить компоненты пути, указать их отдельно и воссоздать свойство. Я знаю, как это сделать в сценарии оболочки, но синтаксис ant для меня намного более загадочен 🙂 О, и, конечно, это должно работать на всех платформах (ну, по крайней мере, Windows, Mac и Linux), учитывая тот факт, что разделитель путей меняется, но это нормально, для этого где-то есть константа в ant-скрипте.
[Обновить] Спасибо за ответ @ martin, я нашел идеальный способ сделать именно то, что я хотел, используя pathconvert с внутренней цепочкой картографов:
<pathconvert property="dest.path" refid="source.path">
<firstmatchmapper>
<regexpmapper from='^([^ ]*)( .*)$$' to='"12"'/>
<identitymapper/>
</firstmatchmapper>
</pathconvert>
Это преобразует C:pathjar 1;C:my pathjar2;C:pathjar3
в "C:pathjar 1";"C:my pathjar2";C:pathjar3
. Преобразование пути вызывает цепочку сопоставления для каждого пути. Если регулярное выражение совпадает, оно принимает это, в противном случае оно принимает идентификатор. Регулярное выражение просто говорит, что если мы найдем что-то без пробела, за которым следует что-то, содержащее хотя бы пробел, заключите это в двойные кавычки.
Ответ №1:
Одним из вариантов было бы использовать задачу proguard ‘full-XML’, тогда каждый jar был бы отдельным элементом, но в целом для отображения путей к свойствам вы бы использовали pathconvert
задачу Ant. Например:
<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>
Комментарии:
1. Вы также можете добавить необходимые кавычки внутри тегов <proguard>: <proguard>-injars «${injars}»</proguard>
2. Спасибо @martin. Это был идеальный указатель, и в итоге я нашел решение, прочитав
<mapper>
документ.