Есть ли способ вытащить подстроку из свойства Ant и поместить эту подстроку в ее собственное свойство?
Как вытащить подстроку в Ant
Ответ 1
Я использую 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>
Ответ 2
Вы можете попробовать использовать PropertyRegex из Ant -conrtib.
<propertyregex property="destinationProperty"
input="${sourceProperty}"
regexp="regexToMatchSubstring"
select="\1"
casesensitive="false" />
Ответ 3
Так как я предпочитаю использовать vanilla Ant, я использую временный файл. Работает повсюду, и вы можете использовать replaceregex, чтобы избавиться от той части строки, которую вы не хотите. Пример для munging 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>
Ответ 4
Я бы пошел с грубой силой и написал пользовательскую задачу 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
)
Ответ 5
я использовал бы задачу script для этой цели, я предпочитаю ruby, example отрезать первые 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>
output =
main:
[echo] ${mystring} == barfoobaz
с помощью ant api с методом project.setProperty() на существующем свойство перезапишет его, таким образом вы сможете работать со стандартным ant поведение, означает, что свойства, заданные после набора, являются неизменяемыми.