我有一个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
所以在这个例子中我想基本上复制:
到给定的输出目录,然后从我想要的modules目录:
并将所有内容放在另一个给定的输出目录中。
我试图这样做:
<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.dll
,DummyPlugin2/binaries/some.other.plugin.dll
,而不仅仅是我想要的dll。与模块相同......
我知道我可以更改basedir以包含DummyPlugin1 /二进制文件,DummyPlugin2 /二进制文件,但我不知道有多少个文件夹将存在,或者他们的名字将不会不断改变构建脚本,所以我宁愿保留它动态,所以它只会为我提取任何插件和模块,而不是我必须复制EACH插件文件夹,可能会或可能不在那里。
那么我有什么方法可以在这里吃蛋糕吗?
答案 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>