Nant文件集基于模式

时间:2012-01-29 12:39:09

标签: .net filesystems pattern-matching nant

我有一个SVN外部文件夹,其中包含许多名为*Plugin的文件夹,然后在每个文件夹中都有一个modules文件夹和一个binaries文件夹。

对我来说问题是,在我的构建任务中,我想将**/*从模块复制到项目中的某个位置,以及从二进制位置到项目中其他位置的任何*.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

到给定的输出目录,然后从我想要的modules目录:

  • some-named-folder(和所有内容)
  • 另一个命名文件夹(以及所有内容)
  • 尚未命名的文件夹(以及所有内容)

并将所有内容放在另一个给定的输出目录中。

我试图这样做:

<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>

但是我一直收到一个错误,告诉我基于文件集的内容不能包含**或任何其他无效的符号。文档似乎有点模糊,如果你可以或不能在你的文件集中使用模式或不使用模式,但是我假设在这个错误后我不能。

问题是如果我这样做的话:

<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 /二进制文件,DummyPlugin2 /二进制文件,但我不知道有多少个文件夹将存在,或者他们的名字将不会不断改变构建脚本,所以我宁愿保留它动态,所以它只会为我提取任何插件和模块,而不是我必须复制EACH插件文件夹,可能会或可能不在那里。

那么我有什么方法可以在这里吃蛋糕吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>