【发布时间】:2012-09-20 14:19:50
【问题描述】:
我正在尝试找出一种无需显式声明 ItemGroup 即可从上下文访问项目的方法。
目前正在尝试复制任务:
<Copy SourceFiles="C:\blabla\**\*.*" DestinationFiles="%(?.RecursiveDir)" />
我可以用什么来代替“?”在上下文中选择项目?
原因是,我有一个通过 XSLT 生成的 MSBuild 项目文件,并且有未知数量的文件夹和文件(其中一些在目标文件夹下遵循不同的结构 - 在这种情况下,我打算使用不同的元数据代替输入 XML 中的 RecursiveDir)。是否可以在不需要声明大量 Itemgroups(或具有很多 Items 的 Itemgroup)的情况下实现这一点?
我尝试搜索这个,但我发现的都是声明了 Itemgroups 的帖子。
【问题讨论】:
-
您想引用项目元数据而不明确地删除项目本身,所以我怀疑您能否做到这一点。复制任务也要求 SourceFiles 应该是 ITaskItem[] 类型(字面意思 - 它需要项目集合)。实际上,复制任务的 msdn 描述 (msdn.microsoft.com/en-us/library/3e54c37h.aspx) 有您可以遵循的确切示例,但您应该在里面声明带有嵌套项目子句的 itemgroup。
-
谢谢阿列克谢。但是明确的声明正是我试图避免的。如果我错了,请纠正我,但我的观察是,与文件数量较少的文件集相比,拥有一个包含大量文件的项目(一个巨大的文件集)会使 MSBuild 变慢.
-
这取决于 =)。你在巨大的文件集下的意思是什么数字=)。确实,msbuild 引擎会发出并评估内存中的每个项目组,并且可能巨大的文件集可能会导致更大的内存占用。但是 msbuild 不适合用作您选择的脚本语言(即使 powershell 在一个目录中存在 250K+ 文件的问题,Windows 本身也是如此)。如果您只需要在不访问完整元数据的情况下执行复制(递归目录除外)- 使用 Exec 任务并调用 robocopy.exe - 它比其他任何东西都好用(考虑到可用的开箱即用工具)。
-
作为补充 - 在我们声明具体工具不可接受之前,应该测试和评估大量数据。我认为一旦 msbuild 可以处理大型解决方案 - 它可能会处理相当大的文件集。它只是资源\速度问题。但任何工具也都有其不可逾越的局限
-
Robocopy MSBuild 扩展似乎工作得稍微快一些。感谢那!但是具有 UseHardlinksIfPossible 属性的副本工作得最快。每个构建的文件集大约为 18-19 GB(大约 20k 个文件)。我可能会将 UseHardlinksIfPossible 与 ItemGroup/Item 一起使用。再次非常感谢。我会将您对 robocopy 的评论标记为有帮助。
标签: msbuild metadata itemgroup