Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Msbuild 上下文中的参考项_Msbuild_Metadata_Itemgroup - Fatal编程技术网

Msbuild 上下文中的参考项

Msbuild 上下文中的参考项,msbuild,metadata,itemgroup,Msbuild,Metadata,Itemgroup,我试图找到一种从上下文中访问项的方法,而不必显式声明ItemGroup 当前正在尝试执行复制任务: <Copy SourceFiles="C:\blabla\**\*.*" DestinationFiles="%(?.RecursiveDir)" /> 我可以用什么来代替?要在上下文中选择项目 原因是,我有一个通过XSLT生成的MSBuild项目文件,并且有未知数量的文件夹&其中一些文件夹在目标文件夹下遵循不同的结构-在这种情况下,我打算在输入XML中使用不同的元数据代替Recur

我试图找到一种从上下文中访问项的方法,而不必显式声明ItemGroup

当前正在尝试执行复制任务:

<Copy SourceFiles="C:\blabla\**\*.*" DestinationFiles="%(?.RecursiveDir)" />
我可以用什么来代替?要在上下文中选择项目

原因是,我有一个通过XSLT生成的MSBuild项目文件,并且有未知数量的文件夹&其中一些文件夹在目标文件夹下遵循不同的结构-在这种情况下,我打算在输入XML中使用不同的元数据代替RecursiveDir。不需要声明项目组的负载或包含大量项目的项目组就可以实现这一点吗


我试着搜索这篇文章,但找到的都是声明了Itemgroups的帖子。

@Alexey Shcherbak写道:


您希望在不显式声明项本身的情况下引用项元数据,因此我怀疑您是否能够做到这一点。此外,复制任务要求源文件应为ITaskItem[]类型,确切地说,它需要项集合。实际上,有一个您可以遵循的确切示例,但是您应该使用嵌套的items子句声明itemgroup

您可能想知道,如果您有一个包含大量文件的项,它是否会使MSBuild变慢。 答案是:视情况而定。在大文件集=,下的数字是什么。的确,MSBuild引擎会发出并计算内存中的每个项目组,而且一个巨大的文件集可能会导致更大的内存占用。但是MSBuild不适合作为您选择的脚本语言,即使powershell在一个目录中有250K+个文件的问题,windows本身也是如此。如果您只需要执行复制而不访问除递归目录之外的完整元数据-使用Exec task并调用robocopy.exe-考虑到可用的现成工具,它比任何其他工具都工作得更好

作为补充——在我们宣布具体工具不可接受之前,应该对大量数据进行测试和评估。我认为只要MSBuild能够处理大型解决方案,它就可能处理相当大的文件集。这只是资源/速度问题。但任何工具都有其无法克服的局限性

实际上,我的意思不是robocopy扩展,而是robocopy.exe本身,您可以很容易地用Exec任务调用它。当然,硬链接在复制速度方面是无与伦比的。但请记住,它只在单个磁盘卷上工作,因为它不是实际的拷贝,它只是将另一个文件名添加到同一组字节=。如果您需要实际复制到另一个驱动器或通过网络-robocopy将再次发光=

PS:20k文件远远不是我定义的巨大文件;我们处理了约280k-300k的小文件,汇总容量约为80Gb。用于管道的Powershell和用于实际钻头移动的robocopy赢得了这一轮


您希望引用项元数据而不显式地删除项本身,因此我怀疑您是否能够做到这一点。复制任务还要求源文件应为ITaskItem[]literaly类型-它需要项集合。实际上,复制任务的msdn描述有您可以遵循的确切示例,但您应该在其中声明带有嵌套items子句的itemgroup。谢谢Alexey。但显式声明正是我试图避免的。如果我错了,请纠正我的错误,但我的观察结果是,与文件数较少的文件集相比,具有大量文件的项会使MSBuild的速度减慢。这取决于=。在大文件集=,下的数字是什么。的确,msbuild引擎会发出并计算内存中的每个项目组,而且可能巨大的文件集会导致更大的内存占用。但是msbuild不适合作为您选择的脚本语言,即使powershell在一个目录中也有250K+文件的问题,windows本身也是如此。如果您只需要执行复制而不访问除recursive dir之外的完整meta-使用Exec任务并调用robocopy.exe-考虑到可用的现成工具,它比任何其他工具都工作得好。作为补充-在我们声明具体工具不可接受之前,应对大量数据进行测试和评估。我认为只要msbuild能够处理大型解决方案,它就可能处理相当大的文件集。这只是资源\速度问题。但任何工具都有其不可克服的限制Robocopy MSBuild扩展似乎工作得稍快一些。谢谢你!但是,具有UseHardLinksIfPerbable属性的副本工作得最快。文件集大约为18-19 GB/构建20k文件。我可能会将UseHardLinkSif与ItemGroup/Item一起使用。再次非常感谢。我将把你关于机器人技术的评论标记为有用的。。