41

条件が満たされた場合にのみ、特定のターゲット内で Ant タスクを実行する必要があります。

タスク レベルではなく、ターゲット レベルで条件を定義する方法を見つけました。IF タスクを実装する投稿も見つけました。

私の質問は、標準の Ant タスクでこの目的を達成する方法を知っていますか?

詳細な説明: Tomcat サーバーが停止している場合に備えて、Tomcat サーバーを開始しようとしています。停止しているかどうかを検出するには、次のコードを使用します。

<echo message="Checking whether Tomcat is running"/>
<condition property="tomcat.running">
  <socket server="${tomcat.host}" port="${tomcat.port}"/> 
</condition>

このターゲットでの次のタスクは、${tomcat.running}が false の場合にのみ実行される exec タスクです。そして、私が言ったように、ターゲットに単一のタスクを追加して、unless プロパティを使用したくありません。

4

4 に答える 4

58

Ant ターゲットには、オプションのiforunless節を含めることができます。これは、プロパティが句で設定されているか、句で設定解除されている場合にのみタスクを実行することを意味しifます1。興味深いことに、そのor句は、依存タスクが最初に実行された後にチェックされます。unlessifunless

つまり、特定の条件が満たされた場合にのみ Ant タスクを実行する方法として、標準の Ant でこれを行うことができます。

 <target name="test.if.tomcat.is.running">
      <condition property="tomcat.running">
          <socket server="${tomcat.host}" port="${tomcat.port}"/> 
      </condition>
</target>

<target name="my.target"
    if="tomcat.running"
    depends="test.if.tomcat.is.running">
    <yaddah/>
    <yaddah/>
    <yaddah/>
</target>

Ant に Target を実行させることを指定しますmy.target。Antはターゲットにmy.target依存することを認識し、それを最初に実行します。Tomcat が実際に実行されている場合、タスクはプロパティtest.if.tomcat.is.runningtest.if.tomcat.is.running設定します。tomcat.runningそれ以外の場合、そのプロパティは設定されません。

最後に、Ant はターゲットに戻りmy.target、プロパティtomcat.runningが設定されているかどうかを確認し、設定されている場合にのみターゲットを実行しmy.targetます。

または、Ant-contrib タスクを使用して、ビルド プロセス全体を理解しやすくすることもできます。

Ant-Contrib ルートに行きたい場合は、Ant-Contrib をセットアップする簡単な方法があるため、Ant-contrib jar は実際にはプロジェクトの一部です。誰かがバージョン管理システムからプロジェクトをチェックアウトすると、Ant-contrib jar も取得されるため、Ant-Contrib を自分でインストールする必要はありません。

Ant-Contrib jar をダウンロードし、プロジェクトのルートにある というディレクトリに配置しますantlib/acFindbugsや PMDantlibなど、あらゆる種類のオプションのタスク jar に使用できます。オプションの Ant jar をそれぞれ独自のディレクトリの下に配置するだけです(ディレクトリの下に Ant-Contrib を配置したように)。antlibac

次に、 でbuild.xml、Ant-Contrib タスクを次のように指定します。

<taskdef resource="net/sf/antcontrib/antlib.xml">
   <classpath>
       <fileset dir="${basedir}/antlib/ac"/>
   </classpath>
</taskdef>

これで、特定のマシンにインストールされているかどうかを気にすることなく、Ant-Contrib タスクを使用できます。プロジェクトをチェックアウトすると、それらのタスクに自動的にアクセスできます。


1.そうです、if/unless句はプロパティが設定されているかどうかをチェックし、true/ではなくfalse、多くの混乱を引き起こす可能性があります。false開発者がプロ​​パティをorに設定しているのを見たことがありますが、句が false に設定されているnoため、ターゲットが実際に実行されているのはなぜだろうかと考えています。if

于 2013-01-28T17:07:15.660 に答える
13

バージョン 1.9.1以降(*) ant は、 project 要素内で必要な名前空間を宣言する場合、任意の taskでより細かい方法でif- 条件と until 条件を持つことをサポートします。

(*) ant の最新バージョン (この記事の執筆時点では 1.9.6) を使用してください。バージョン 1.9.1 には、ユーザー @Rebse が親切に指摘したように、この新機能に関する欠陥が含まれているためです。

以下の例では、プロパティのコメント/コメント解除をいじることができます...

<project name="test"
         xmlns:if="ant:if"
         xmlns:unless="ant:unless">

  <property name="is.good" value="hohoho"/>
  <!--property name="hide.base" value="boo"/-->

  <target name="foo">
     <echo unless:set="hide.base">${basedir}</echo>
     <echo if:set="is.good">GOOD</echo>
  </target>
</project>

...そして、次のような出力を観察します。

Buildfile: D:\test\ant\taskcondition\build.xml
foo:
     [echo] D:\test\ant\taskcondition
     [echo] GOOD
BUILD SUCCESSFUL
Total time: 191 milliseconds
于 2015-08-28T09:57:17.110 に答える
6

「if else」タイプの実装が必要な場合:

<target name="test.if.tomcat.is.running">
      <condition property="tomcat.running" value="true" else="false">
          <socket server="${tomcat.host}" port="${tomcat.port}"/> 
      </condition>
</target>

<target name="my.target.running"
    if="${tomcat.running}"
    depends="test.if.tomcat.is.running">
...
</target>

<target name="my.target.ifnotrunning"
    unless="${tomcat.running}"
    depends="test.if.tomcat.is.running">
   .....
</target>
于 2014-02-21T17:54:18.710 に答える