Ant 计算属性中的点数

Ant 计算属性中的点数,ant,Ant,我有两个表示版本号的属性(比如1.0.2.4)。 我需要比较其中一个属性是否比其他属性多包含一个点 在ANT中实现这一点最简单的方法是什么?使用脚本条件执行测试 <project name="demo" default="run"> <property name="ver1" value="1.0.2.4"/> <property name="ver2" value="1.0.2"/> <condition property="ve

我有两个表示版本号的属性(比如1.0.2.4)。 我需要比较其中一个属性是否比其他属性多包含一个点


在ANT中实现这一点最简单的方法是什么?

使用脚本条件执行测试

<project name="demo" default="run">

   <property name="ver1" value="1.0.2.4"/>
   <property name="ver2" value="1.0.2"/>

   <condition property="ver1.has.more.dots">
      <scriptcondition language="javascript"><![CDATA[
      var count1 = String(project.getProperty("ver1")).split(".").length;
      var count2 = String(project.getProperty("ver2")).split(".").length;

      self.setValue(count1 > count2)
      ]]></scriptcondition>
   </condition>

   <target name="run" if="ver1.has.more.dots">
      <echo message="It works!"/>
   </target>

</project>

计数2)
]]>

使用脚本条件执行测试

<project name="demo" default="run">

   <property name="ver1" value="1.0.2.4"/>
   <property name="ver2" value="1.0.2"/>

   <condition property="ver1.has.more.dots">
      <scriptcondition language="javascript"><![CDATA[
      var count1 = String(project.getProperty("ver1")).split(".").length;
      var count2 = String(project.getProperty("ver2")).split(".").length;

      self.setValue(count1 > count2)
      ]]></scriptcondition>
   </condition>

   <target name="run" if="ver1.has.more.dots">
      <echo message="It works!"/>
   </target>

</project>

计数2)
]]>

马克·奥康纳的回答就足够了。但更纯粹(通用)的Ant解决方案可能如下所示:

<macrodef name="getcount">
    <attribute name="valueToCheck" />
    <attribute name="propertyToSet" />
    <attribute name="characterToCount" />

    <sequential>
        <resourcecount property="@{propertyToSet}">
            <tokens>
                <stringtokenizer delims="@{characterToCount}" />
                <string value="@{valueToCheck}" />
            </tokens>
        </resourcecount>
    </sequential>
</macrodef>

可以像这样使用:

<property name="version1" value="1.2.3.4" />
<property name="version2" value="1.2.3.4.5" />

<target name="init" depends="checkVersions" if="versions.are.different">
    <echo>versions differ!</echo>
</target>

<target name="checkVersions">
    <getcount valueToCheck="${version1}" propertyToSet="ver1.count" characterToCount="." />
    <getcount valueToCheck="${version2}" propertyToSet="ver2.count" characterToCount="." />

    <condition property="versions.are.different">
        <not>
            <equals arg1="${ver1.count}" arg2="${ver2.count}"></equals>
        </not>
    </condition>
</target>

版本不同!

请记住,因为我们使用的是分隔符,像“1.2.3.4”这样的值不会得到5,而是4,因为最后一个分隔符后面没有任何内容。

Mark O'Connor的答案就足够了。但更纯粹(通用)的Ant解决方案可能如下所示:

<macrodef name="getcount">
    <attribute name="valueToCheck" />
    <attribute name="propertyToSet" />
    <attribute name="characterToCount" />

    <sequential>
        <resourcecount property="@{propertyToSet}">
            <tokens>
                <stringtokenizer delims="@{characterToCount}" />
                <string value="@{valueToCheck}" />
            </tokens>
        </resourcecount>
    </sequential>
</macrodef>

可以像这样使用:

<property name="version1" value="1.2.3.4" />
<property name="version2" value="1.2.3.4.5" />

<target name="init" depends="checkVersions" if="versions.are.different">
    <echo>versions differ!</echo>
</target>

<target name="checkVersions">
    <getcount valueToCheck="${version1}" propertyToSet="ver1.count" characterToCount="." />
    <getcount valueToCheck="${version2}" propertyToSet="ver2.count" characterToCount="." />

    <condition property="versions.are.different">
        <not>
            <equals arg1="${ver1.count}" arg2="${ver2.count}"></equals>
        </not>
    </condition>
</target>

版本不同!

请记住,由于我们使用的是分隔符,像“1.2.3.4”这样的值不会产生5,而是4,因为最后一个分隔符后面没有任何内容。

我喜欢两个答案,但更喜欢这个答案,因为它仅为Ant。我喜欢两个答案,但更喜欢这个答案,因为它仅为Ant。