Sådan registreres Windows OS i ANT

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger mr til at kompilere en Java-applikation. Problemet er nogle af dev devs er på win 7 og andre er på xp og vista. En del af kompileringen er at opbygge en msi ved hjælp af WIX, på win7 er dette en mappe og på xp og gem det i en anden.


Myrens opgave styres i Maven. Jeg er efter en måde at fortælle forskellen mellem windows os i ant med et betinget tag til at indstille wix-biblioteket. Nogle ideer?


Jeg ved, at det vil være i dette format:


<if>
   <condition property="isWin7">
    Check for windows 7
   </condition>
   <then>
    set wix path to win 7 installation
   </then>
   <else>
    set to vista/xp wix installation
   </else>
 </if>


Enhver hjælp ville være fantastisk.

Bedste reference


Det ser ud til, at ANT <condition> kan teste for navn, familie & version af operativsystem:



  • Ant Opgaver - betingelser



Baseret på dette link er der nogle egenskaber relateret til OS, som vi kan forespørge om. Den ene er den normale family ejendom, der anvendes i den fælles kode: [11]


<!-- CHECK FOR WINDOWS FAMILY OS -->
<condition property="is\_windows">
    <os family="windows"/>
</condition>


Min version af ANT udskriver ikke en løst værdi for ${os.family}.





Der er også:



  • os.name < --- dette er det du skal kontrollere

  • os.arch

  • os.version






Her er et demo script, jeg lavede for at vise brugen af ​​disse egenskaber:


<?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="build" >

    <!-- CHECK FOR WINDOWS FAMILY OS -->
    <condition property="is\_windows">
        <os family="windows"/>
    </condition>

    <condition property="is\_windows\_7">
        <os name="Windows 7"/>
    </condition>

    <!-- DISPLAYS WINDOWS OS -->
    <target name="display\_windows" if="is\_windows" >
        <echo message="OS Family is:       Windows" />
    </target>


    <target name="build" >

        <antcall target="display\_windows" />

        <echo message="OS Name is:         ${os.name}" />
        <echo message="OS Architecture is: ${os.arch}" />
        <echo message="OS Version is:      ${os.version}" />

    </target>

</project>


Siden besvarelsen af ​​dette spørgsmål er koden ovenfor blevet forfremmet til vores produktionsbyggesystem, hvor den leverer delt funktionalitet på tværs af Windows & Mac.





@thekbb lavede et godt forslag til at fjerne <antcall target="display\_windows" /> og opdatere måldefinitionen for at afhænge af display\_windows som pr. nedenstående kode:


    <target name="build" depends="display\_windows">

        <echo message="OS Name is:         ${os.name}" />
        <echo message="OS Architecture is: ${os.arch}" />
        <echo message="OS Version is:      ${os.version}" />

    </target>


Dette er baseret på, at antcall lancerer en ny forekomst af maur i en ny JVM. Nogle brugere kan finde denne optimering lettere at forstå; andre vil måske gerne gøre dette for præstationsårsager.