Как вытащить подстроку в Ant - PullRequest
34 голосов
/ 03 июня 2009

Есть ли способ извлечь подстроку из свойства Ant и поместить эту подстроку в собственное свойство?

Ответы [ 5 ]

36 голосов
/ 15 октября 2010

Я использую scriptdef для создания тега javascript для подстроки, например:

 <project>
  <scriptdef name="substring" language="javascript">
     <attribute name="text" />
     <attribute name="start" />
     <attribute name="end" />
     <attribute name="property" />
     <![CDATA[
       var text = attributes.get("text");
       var start = attributes.get("start");
       var end = attributes.get("end") || text.length();
       project.setProperty(attributes.get("property"), text.substring(start, end));
     ]]>
  </scriptdef>
  ........
  <target ...>
     <substring text="asdfasdfasdf" start="2" end="10" property="subtext" />
     <echo message="subtext = ${subtext}" />
  </target>
 </project>
22 голосов
/ 03 июня 2009

Вы можете попробовать использовать PropertyRegex от Ant-Contrib .

   <propertyregex property="destinationProperty"
              input="${sourceProperty}"
              regexp="regexToMatchSubstring"
              select="\1"
              casesensitive="false" />
10 голосов
/ 09 февраля 2012

Так как я предпочитаю использовать vanilla Ant, я использую временный файл. Работает везде, и вы можете использовать replaceregex, чтобы избавиться от той части строки, которую вы не хотите. Пример манипулирования сообщениями Git:

    <exec executable="git" output="${git.describe.file}" errorproperty="git.error" failonerror="true">
        <arg value="describe"/>
        <arg value="--tags" />
        <arg value="--abbrev=0" />
    </exec>
    <loadfile srcfile="${git.describe.file}" property="git.workspace.specification.version">
        <filterchain>
           <headfilter lines="1" skip="0"/>
           <tokenfilter>
              <replaceregex pattern="\.[0-9]+$" replace="" flags="gi"/>
           </tokenfilter>
           <striplinebreaks/>
        </filterchain>
    </loadfile>
2 голосов
/ 03 июня 2009

Я бы пошел с грубой силой и написал бы пользовательское задание Ant:

public class SubstringTask extends Task {

    public void execute() throws BuildException {
        String input = getProject().getProperty("oldproperty");
        String output = process(input);
        getProject().setProperty("newproperty", output);
    }
}

Осталось реализовать String process(String) и добавить пару сеттеров (например, для значений oldproperty и newproperty)

0 голосов
/ 05 сентября 2009

я бы использовал для этой цели скрипт, я предпочитаю ruby, пример отрезать первые 3 символа =

<project>
  <property name="mystring" value="foobarfoobaz"/>  
   <target name="main"> 
    <script language="ruby">
     $project.setProperty 'mystring', $mystring[3..-1]
    </script>
    <echo>$${mystring} == ${mystring}</echo>
   </target>    
  </project>

вывод =

main:
     [echo] ${mystring} == barfoobaz

использование ant api с методом project.setProperty () в существующем свойство перезапишет его, так что вы можете обойти стандартный муравей поведение означает, что свойства после установки неизменны

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