2012-01-29 90 views
3

我有一个SVN外部文件夹,其中包含许多文件夹称为*Plugin然后在这些文件夹中有modules文件夹和binaries文件夹。Nant文件集basedir与模式

对我来说,问题是,在我的构建任务中,我想从模块复制**/*到我的项目中的某个位置,以及从二进制文件位置到项目中其他任何位置的任何*.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不能包含**或任何其他无效符号。该文档似乎有点模糊,如果你可以或不可以在你的文件集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.dllDummyPlugin2/binaries/some.other.plugin.dll而不仅仅是我想要的DLL。与模块相同...

我知道我可以更改basedir来包含DummyPlugin1/binaries,DummyPlugin2/binaries,但我不知道有多少个文件夹将会在那里,或者他们的名字将会是什么,而不会不断改变构建脚本,所以我宁愿保持它的动态性,以便只是为我提供任何插件和模块,而不必为每个插件文件夹制作可能或不可能存在的副本。

那么我有什么办法让我的蛋糕在这里吃吗?

回答

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 2012-01-29 13:56:40

+0

也许用NAnt'foreach'生成单独的文件集会更适合吗?首先获取目录的文件集,然后遍历它。 – skolima 2012-01-29 21:27:30

+0

您是否有示例或链接可以说明这种工作方式,Nant文档现在有点稀疏。我打算使用Rake,但并不想要安装ruby和rake的依赖。 – Grofit 2012-01-30 09:29:51

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>