How to pull out a substring in Ant

前端 未结 6 1006
隐瞒了意图╮
隐瞒了意图╮ 2020-12-03 16:31

Is there a way to pull a substring from an Ant property and place that substring into it\'s own property?

相关标签:
6条回答
  • 2020-12-03 17:08

    I use scriptdef to create a javascript tag to substring, for exemple:

     <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>
    
    0 讨论(0)
  • 2020-12-03 17:13

    You could try using PropertyRegex from Ant-Contrib.

       <propertyregex property="destinationProperty"
                  input="${sourceProperty}"
                  regexp="regexToMatchSubstring"
                  select="\1"
                  casesensitive="false" />
    
    0 讨论(0)
  • 2020-12-03 17:16

    I guess an easy vanilla way to do this is:

    <loadresource property="destinationProperty">
        <concat>${sourceProperty}</concat>
        <filterchain>
            <replaceregex pattern="regexToMatchSubstring" replace="\1" />
        </filterchain>
    </loadresource>
    
    0 讨论(0)
  • 2020-12-03 17:19

    Since I prefer to use vanilla Ant, I use a temporary file. Works everywhere and you can leverage replaceregex to get rid of the part of the string you don't want. Example for munging Git messages:

        <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>
    
    0 讨论(0)
  • 2020-12-03 17:27

    I would go with the brute force and write a custom Ant task:

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

    What's left it to implement the String process(String) and add a couple of setters (e.g. for the oldproperty and newproperty values)

    0 讨论(0)
  • 2020-12-03 17:27

    i would use script task for that purpose, i prefer ruby, example cut off the first 3 chars =

    <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>
    

    output =

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

    using the ant api with method project.setProperty() on an existing property will overwrite it, that way you can work around standard ant behaviour, means properties once set are immutable

    0 讨论(0)
提交回复
热议问题