1

多くのプロジェクトをビルドするantビルドスクリプトがあります。android

私は、テキストファイルのプロパティによって与えられた特定の順序ですべてのプロジェクトを構築しています。

antビルドスクリプトは、各プロジェクトの独自のbuild.xmlファイルを呼び出して、そのプロジェクトをビルドします。

antプロジェクトのビルドに失敗した場合、エラーが原因でプロジェクトが停止した場所からビルドを続行するにはどうすればよいですか?

基本的に、プロジェクトAを構築している場合、、、、および。そして、ビルドプロセスはで失敗します。開発者がビルドを再開したときに、ビルドプロセスを続行するにはどうすればよいですか?BCDECC

また、ビルドプロセスでは、開発者によって変更されたものを再構築する必要があります。たとえば、の問題はの問題Cが原因でありA、にC依存しAます。Aしたがって、再構築、スキップB、再構築Cして続行する必要があります。oO

アイデアを探している、またはこれを行う何かがすでにあるかどうか。

ありがとう!

4

2 に答える 2

2

Antは、Makeと同様に、中断したときにどこを続行するかを理解するのに非常に優れています。ソースが更新されない限り、<javac>タスクはコードを再コンパイルしません。この<copy>タスクは、デフォルトではファイルを再コピーしません。ただし、ビルドを複数のファイルに分割してから、のパラメーターを使用<ant>する代わりにタスクを使用すると、このシステムが分割されます。depends<target>

独立したプロジェクトABC、およびDがあるとします。あなたbuild.xmlがすることは、それぞれの正しいターゲットを呼び出すことだけです。それぞれがjarファイルを作成するとします。そして、JavaエラーのためにプロジェクトCでプロセスが中断しました。開発者はそれを修正しました。もう一度実行するbuild.xmlと、プロジェクトABが再度呼び出されます。ただし、これらのプロジェクトはすでに構築されているため、何も実行しないでください。ABの呼び出しが表示されますが、何も起こりません。

プロジェクトCでも、ビルドプロセスは中断したところから開始されます。つまり、Antのビルドを理解する能力を壊すために何もしなかった場合です。

Antを壊す方法はたくさんあります。たとえば、ビルドプロセス中にファイルを削除しないでください。ターゲットファイルが存在しない場合、Antはタイムスタンプを使用して何をすべきかを判断できません。

場合によっては、プロセスでビルドを回避するために少しの助けが必要になります。Antには<uptodate>タスクが組み込まれていますが、<outofdate>はるかに使いやすいと思います。たとえば、プロジェクトAがプロジェクトBが使用するjarファイルを生成するとします。jarで使用されるクラスファイルとリソースがjarのタイムスタンプよりも古い場合は、これらのタスクの1つを使用してそのjarをコピーしないようにすることができます。

それ以外の場合、jarをプロジェクトBに盲目的にコピーした場合、プロジェクトBは、クラスファイルが依存するファイルが更新されたことを確認します。したがって、プロジェクトBはすべてを再コンパイルします。次に、すべてをコピーし、構築していたjarファイルまたは戦争を再構築します。Javaクラスファイルを直接更新するサードパーティのタスクに問題があり、コンパイルを2回実行しないように監視ファイルを使用する必要がありました。特に、クラスファイルを変更するタスクを実行する必要がありました。

ちなみに、Antが実行していると言っているターゲットに腹を立てないでください。Antはそれらのターゲットを実行しますが、何かが更新されない限り、それらのターゲットを構成するタスクは実行されません。


更新:<outofdate>FromAnt-Contribの使用

マスタープロジェクトファイルに、次のターゲットがあるとします。

<target name="build"
    description="Builds every sub project">
    <ant antfile=${project.a.dir}/build.xml target="build"/>
    <ant antfile=${project.b.dir}/build.xml target="build"/>
    <ant antfile=${project.c.dir}/build.xml target="build"/>
    <ant antfile=${project.d.dir}/build.xml target="build"/>

使用<outofdate>

<target name="build"
    description="Builds every sub project">

    <outofdate>
       <sourcefiles>
           <fileset dir="${project.a.srcdir}"/>
       </sourcefiles>
       <targetfiles>
           <fileset dir="${project.a.dir}/target">
              <include name="*.jar"/>
           </fileset>
       </targetfiles>
       <sequential>
           <ant antfile=${project.a.dir}/build.xml
               target="build"/>
       </sequential>
    </outofdate>

    <outofdate>
       <sourcefiles>
           <fileset dir="${project.b.srcdir}"/>
       </sourcefiles>
       <targetfiles>
           <fileset dir="${project.a.dir}/target">
              <include name="*.jar"/>
           </fileset>
       </targetfiles>
       <sequential>
           <echo>CALLING PROJECT: ${project.b.dir}</echo>
           <ant antfile=${project.b.dir}/build.xml
               target="build"/>
       </sequential>
    </outofdate>

    <etc, etc, etc/>

正しく設定されていれば、おそらくAnt-Contrib<for>ループですべてを実行できるので、サブプロジェクトごとにこれを実行する必要はありません。

これがもっと速いかどうかはわかりません。タスクは<outofdate>引き続きすべてのファイルを調べて日付を比較する必要がありますが、少なくとも、サブプロジェクトファイル内のすべてのターゲットを呼び出すことはありません。

于 2012-10-26T03:18:17.450 に答える
1

可能な限り、個々のプロジェクトのビルドをべき等にするようにしてくださいつまり、ビルドを再実行し、前回から何も変更されていない場合は、すべてを再構築する必要はありません)。たとえば、このようjavacな標準的なタスクは、対応するよりも新しいファイルのみを再コンパイルします。独自の依存関係チェックを行わない場合は、タスクを使用して自分でチェックを行うことができます。これを行う方法を示す最新のマニュアルページに例があります。copyjavac.java.classuptodate

アイデアは、すべてを最新の状態にするために必要な最小限の作業を各ビルドに実行させることです。これを達成できれば、C原因Aを再構築して再B実行するかどうかは問題ではありません。実際に何もする必要がない場合は、非常に迅速に完了するからです。

于 2012-10-25T22:10:26.203 に答える