2012-03-05 9 views
5

私はJavaアプリケーションをコンパイルするためにantを使用しています。問題は、開発者の一部は勝利7にあり、他はXPとVista上にあることです。コンパイルの一部は、WIXを使用してmsiをビルドすることです。これはwin7上では1つのディレクトリで、xpとvistaでは別のディレクトリになります。ANTでWindows OSを検出する方法

AntタスクはMavenで制御されます。私は、wixディレクトリを設定するための条件付きタグを持つantのウィンドウズ・オスの違いを伝える方法をとっています。何か案は?

私はそれがこの形式になります知っている:

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

すべてのヘルプは素晴らしいことです。 ANT <condition>は、名前のためのオペレーティングシステムの家族&バージョンをテストすることができますように見えます

+0

[osを検出してプロパティを設定する]の複製が可能です。(http://stackoverflow.com/questions/453170/using-ant-to-detect-os-and-set-property) – oers

+0

私はすでにそれは私がやってみたいことは、それがXPであるかビスタかwin7であるかどうかをチェックすることです。他のオプションはウィンドウがあるかどうかを知るだけです。 – Nathan

+0

@Nathan - あなたは私の答えを使って運がありましたか?私がもっと助けることができるように、Plsは受け入れられたとしてマークするか、私にコメントを落とす。このテクニックは、本番環境の構築システムで使用されますが、あなたの*問題を解決することはできません。 –

答えて

12

:そのリンクに基づいて

を、たちができるOSに関連するいくつかのプロパティがありますクエリ。一つは、共通のコードで使用される通常のfamilyプロパティです:ANTの

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

私のバージョンは${os.family}のための解決された値を出力しません。


もあります:

  • os.name < ---これはあなたが
  • os.arch
  • os.version
をチェックする必要があるものです
<?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> 

この質問に答えるので、上記のコードは、それがWindowsの& Macの間で共有機能を提供している当社の生産ビルドシステム、に昇格されました:0は、ここで私は、これらのプロパティの使用を示すために、作られたデモ・スクリプトです。


@thekbb<antcall target="display_windows" />を削除し、以下のコードに従ってdisplay_windowsに依存するようにターゲット定義を更新するための良い提案をした:antcallは、新しいインスタンスを起動しているという事実に基づいて

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

この新しいJVMのantの一部のユーザーは、この最適化を理解しやすいかもしれません。パフォーマンス上の理由から他の人がこれをやりたいかもしれません。

+1

paste/thisをコピーする場合は、必ずを削除し、ビルドターゲットを表示ウィンドウのターゲットに合わせて変更してください。 antcallは、新しいjvmでantの新しいインスタンスをスピンアップしてウィンドウを表示します。 – thekbb

+0

チップの@thekbb Thx。この例で新しいコピーをスピンオフするのはなぜ悪いことでしょうか?蟻のメソッド呼び出しを偽装する良い方法は何ですか? –

+1

それは主に文体的です - 私はあなたの答えを編集して、私が推薦しているものを表示しました。あなたが同意しない場合は編集し直してください。ビルドファイルが大量になり、antcallが散在すると、ターゲット間で制御がどのように流れるかを把握するのが難しいです。最新のハードウェアでは、新しいバージョンのantを起動するためのコストはごくわずかですが、私はMac上でそれぞれの方法を実行しました。違いは〜0.5秒 – thekbb

関連する問題