2012-01-29 19 views
3

私は*Pluginと呼ばれる多くのフォルダを含むSVN externalsフォルダを持っています。そして、これらの各フォルダ内にmodulesフォルダとbinariesフォルダがあります。Nantファイルセットbasedir withパターン

は私のために問題がある、私のビルドタスクの中、私は私のプロジェクト内の位置だけでなく、私のプロジェクトでどこかにバイナリの場所から任意の*.plugin.dllへのモジュールから**/*をコピーしたいです。だからここ

はダミーの例です。

- DummyPlugin1 
    |- binaries 
    |- some.assembly.dll 
    |- some.plugin.dll 
    |- modules 
    |- some-named-folder 
     |- some-sub-folder 
      |- some.content.xml 
     |- some-other-sub-folder 
      |- yet-another-folder 
       |- some.more.content.jpg 
- DummyPlugin2 
    |- binaries 
    |- some.other.plugin.dll 
    |- modules 
    |- another-named-folder 
     |- content.xml 
     |- image.jpg 
    |- yet-another-named-folder 
     |- some-web-page.html 

したがって、この例では、私は基本的にコピーするとよいでしょう:

  • some.plugin.dll
  • some.other.plugin.dll

与えられた出力ディレクトリに、モジュールディレクトリから私は取ると思う:

  • いくつかの名前のフォルダ(およびすべてのコンテンツ)
  • 別の名前のフォルダ(およびすべてのコンテンツ)
  • まだ別の名前のフォルダ(およびすべてのコンテンツ)

そのすべてを別の出力ディレクトリに入れてください。

私はこれを行うにしようとしていた。

<copy todir="${dir.projects.dynamic.binaries}"> 
    <fileset basedir="${dir.plugins}/**/binaries"> 
     <include name="*.plugin.dll" /> 
    </fileset> 
</copy> 
<copy todir="${dir.projects.dynamic.modules}"> 
    <fileset basedir="${dir.plugins}/**/modules"> 
     <include name="**/*" /> 
    </fileset> 
</copy> 

私はファイルセットのbasedirには、**または他の無効記号を含めることができないことを私に告げるエラーを取得しておくが。あなたがファイルセットベースでパターンを使うことができるかしないかに関しては、ドキュメントは少し曖昧ですが、私はこのエラーの後にはできないと仮定しています。

問題は、私が代わりにこの方法を行うにした場合:

<copy todir="${dir.projects.dynamic.binaries}"> 
    <fileset basedir="${dir.plugins}"> 
     <include name="**/binaries/*.plugin.dll" /> 
    </fileset> 
</copy> 
<copy todir="${dir.projects.dynamic.modules}"> 
    <fileset basedir="${dir.plugins}"> 
     <include name="**/modules/**/*" /> 
    </fileset> 
</copy> 

しかし、それをコピー親フォルダ、すなわちDummyPlugin1/binaries/some.assembly.dll、私が欲しいDummyPlugin2/binaries/some.other.plugin.dllだけではなく、DLL。モジュールと同じです...

DummyPlugin1/binaries、DummyPlugin2/binariesを含むようにbasedirを変更することができますが、ビルドを頻繁に変更しなくても、そこに何個のフォルダがあるかわかりませんスクリプトなので、私はむしろそれをダイナミックに保つので、そこにあるかもしれない、あるいはそうでないかもしれない各プラグインフォルダのコピーを作るのではなく、プラグインとモジュールがそこにあります。

私のケーキを食べてここで食べる方法はありますか?

答えて

3

basedirは単一のディレクトリでなければなりませんが、すべての入力ファイルを単一の出力ディレクトリに置く(基本的にはパスを無視して)flattenオプションを使用してください。

質問をもう一度読み終えたら、これを試すことができますか?

<copy todir="${dir.projects.dynamic.binaries}" flatten="true"> 
    <fileset> 
     <include name="${dir.plugins}/**/binaries/*.plugin.dll" /> 
    </fileset> 
</copy> 
<copy todir="${dir.projects.dynamic.modules}"> 
    <fileset basedir="${dir.plugins}"> 
     <include name="/**/modules/**/*" /> 
    </fileset> 
</copy> 
+0

問題は、私は、ディレクトリそのままモジュール内からフォルダ構造を維持する必要がありますです。そこに私はルートフォルダとすべての内容をファイルのセットだけではなくコピーしています。 – Grofit

+0

おそらく、NAnt 'foreach'を使って別々のファイルセットを生成する方が適していますか?最初にディレクトリのファイルセットを取得し、それを繰り返し実行します。 – skolima

+0

どのように動作するかを示すための例やリンクがありますか、最近Nantのドキュメントは少し疎です。私はRakeを使うつもりだったが、ルビーとレーキに依存することを望んでいなかった。 – Grofit

1

答えは、すでにあなたの質問に含まれていた:<foreach>ループを使用します。

<foreach item="Folder" property="binaries.path"> 
    <in> 
    <items basedir="${dir.plugins}"> 
     <include name="**/binaries" /> 
    </items> 
    </in> 
    <do> 
    <copy todir="${dir.projects.dynamic.binaries}"> 
     <fileset basedir="${binaries.path}"> 
     <include name="*.plugin.dll" /> 
     </fileset> 
    </copy> 
    </do> 
</foreach> 
<foreach item="Folder" property="modules.path"> 
    <in> 
    <items basedir="${dir.plugins}"> 
     <include name="**/modules" /> 
    </items> 
    </in> 
    <do> 
    <copy todir="${dir.projects.dynamic.modules}"> 
     <fileset basedir="${modules.path}"> 
     <include name="**/*" /> 
     </fileset> 
    </copy> 
    </do> 
</foreach>