Как правильно указывать путь в задаче ant?

#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> документ.