2017-06-09 20 views
0

私はAnt 1.10を使用しています。ファイルが存在する場合は、現在の場所からディレクトリ構造の上にファイルのパスを見つける必要があります。私たちは既にビルド環境でant-contribを使用していますので、それを使用した勧告に問題はありません。利用可能なファイルを使用してAntからファイルのパスを取得

例えば、私は、次のディレクトリ構造を持っている:

~/repos/proj/ 
      --/build.root 
      --/common/math/ 
         --/build.xml 
         --/ivy.xml 
      --/build/tools/ 
         --/build-shared.xml 
         --/ivy-stuff.xml 
      --/products/ 
        --/prodA/ 
         --/build.xml 
         --/ivy.xml 

私が取得する必要があるパス(私は、このプロパティbuildrootdirを呼び出す)、絶対パスとして~/repos/projです。次に、buildrootdirbuild-shared.xmlのパスから構築されたプロパティを作成します。現在、ルートへのパスは、一連の相対パス(../../../)としてハードコードされています。私たちはまもなくコードの再編成を行うつもりです。ハードコードされた相対パスを「動的な」ルックアップで取り除きたいと思います。

私の現在の解決策は、再帰的なantcallbackをプロパティを設定するfindroot.xml内のターゲットに使用することです。私は、ルートレベルに達するまで、親ディレクトリを通して検索を制限するロジックを用意しています。それはうまくいきますが、それはwazooのコード複製を引き起こします。すべてのbuild.xmlには、近くのfindroot.xmlがあります。そうでなければ、共通のfindroot.xmlファイルへのハードコーディングされた相対パスがあり、私の目的を逸してしまいます。私はこのような何かたくないん

~/repos/proj/ 
      --/build.root 
      --/common/math/ 
         --/build.xml 
         --/ivy.xml 
         --/findroot.xml 
      --/build/tools/ 
         --/build-shared.xml 
         --/ivy-stuff.xml 
         --/findroot.xml 
      --/products/ 
        --/prodA/ 
         --/build.xml 
         --/ivy.xml 
         --/findroot.xml 

を私はavailableタスクを見て、私は真の「searchparents」フラグを設定することができ、それが再帰的に上方向に検索しますことに気づきました。私は使用することができます

これは、ファイルが利用可能であると言うように動作します。しかし、私はそれを利用可能にする方法を知りません。私はavailable doxygenavailable source code見てきましたし、可能であるようには見えない

[available] Searching /home/user/repos/proj/common/math 
[available] Found: build.root in /home/user/repos/proj 

:私は、私は次の行を参照して、デバッグ出力を見てください。

何か不足していますか? availableに代わるものがありますが、それは私にこの望ましい動作をさせるでしょうか?

答えて

0

propertyタスクには、ファイルの標準パスを構築する 'location'属性があります。

<property name="project.dir" location="build.root" /> 

このプロパティは、ファイルが存在しない場合でも、設定されますので、それが懸念される場合は、もう少し複雑な何かをする必要がありますことに注意してください、、。ファイルが見つからない場合は、ビルドに失敗したり、別の場所を見たいかどうかはわかりません。

あなたが失敗する場合は、条件としてavailableを使用することができます。

<property name="project.dir" location="build.root" /> 

<fail message="build.root not found"> 
    <condition> 
     <available file="${project.dir}" /> 
    <condition> 
</fail> 

あなたはそれにそれがあるどんなにを見つけたい場合は、私がfilesetを使用したい:

<fileset dir="${basedir}" includes="**/build.root" /> 

resourcecountタスクを使用して、1つのファイルのみが見つかったと仮定して(それが必要であると仮定して)、実際にファイルをパス参照ではなくプロパティに設定する必要がある場合はpathconvertとすることができます。

可能であれば、ant-contribを避けることをお勧めします。

+0

私はあなたが提案した3番目のオプション( 'fileset' one)を手に入れたいと思っています。書かれているように、私は '/ proj/common/math /'フォルダから 'ant build 'を実行するので、ファイルセットはそれを検索のルートとして使用し、build.rootファイルを見つけるために下に行く(常に失敗する) 。私はそれを別の方法(親ディレクトリの方へ)にする必要があります。 開発者のマシンまたは継続的なインテグレーションマシンのビルド構造の場所が変更されるため、柔軟性が必要です。任意のヒント? –

+0

その場合、ファイルセットの 'dir'属性を' $ {basedir} /../ .. 'のような相対パスに設定するだけです。 "project.root.dir"のような名前のプロパティを 'location =" $ {basedir} /../.. "でスクリプトを初期化する(つまり、このタスクをターゲット外に置く)その場所を指す必要があるときはいつでも使用できます。 – CAustin

関連する問題