MSBUILD:如何将XML文件数据转换为项?

MSBUILD:如何将XML文件数据转换为项?,msbuild,Msbuild,我已经编写了一些MSBuild脚本,允许我构建几百个项目。一个要求是将文件复制到构建目录中。我有一个XML文件,其中包含需要复制的内容以及需要复制到哪里的列表。这个XML文件只是我导入到主项目中的一个项目组,一切都很好 我唯一的问题是我的XML文件和所有的项目都是巨大的(我有数百个目录要从中复制)!这是因为所有项都必须附加元数据,这意味着每个副本声明必须有3行代码和3个XML元素。i、 e <copy_to_build Include="$(FooDir)/BAZ/CoreDataFile

我已经编写了一些MSBuild脚本,允许我构建几百个项目。一个要求是将文件复制到构建目录中。我有一个XML文件,其中包含需要复制的内容以及需要复制到哪里的列表。这个XML文件只是我导入到主项目中的一个项目组,一切都很好

我唯一的问题是我的XML文件和所有的项目都是巨大的(我有数百个目录要从中复制)!这是因为所有项都必须附加元数据,这意味着每个副本声明必须有3行代码和3个XML元素。i、 e

<copy_to_build Include="$(FooDir)/BAZ/CoreDataFiles/*">
  <Destination>$(BuildDir)//BAZ/</Destination>
</copy_to_build>

$(BuildDir)//BAZ/
这相当于将复制脚本的大小增加了三倍,这意味着它很难维护

好的,我在另一个文件中将XML转换成这种格式:

<copy_to_build Source="$(FooDir)/BAZ/CoreDataFiles/*" Destination="$(BuildDir)//BAZ/" />

它更简洁,因为每个copy命令有一个xml元素。它更容易阅读

唯一的问题是,我无法在MSBuild中将它们用作“项”,因为缺少元数据,并且项不能具有“Destination”属性

因此,我编写了一个工具,将简明的XML“转换”回详细的MSBuild格式。然后,我面临着如何将转换后的XML文件恢复到我的“项目”文件的难题。我确实发现导入必须在项目级别完成:因此我无法在任务或目标中“转换”我的xml文件。这意味着文件必须在处理导入时准备就绪。因此,无法在我的目标中重新计算xml文件。。。因此,显然,在从命令行调用MSBuild之前,我必须“转换”xml文件。这给我的构建过程增加了复杂的步骤

所以我的最后一个问题是,如何读取(一个元素)XML文件数据并将其转换为目标或任务中的(三个元素)项

我听说过动态项,但我对msbuild还很陌生,不知道如何使用它们,或者它们是否与我的问题相关


谢谢。

尝试对输入的单元素XML文件使用XSLT转换,将其转换为MSBuild脚本中使用的三元素XML文件。这是一篇关于如何在MSBuild中使用XSLT转换的好文章

这不是解决问题的正确方法(除非我不理解这个问题)。忘记尝试动态生成MSBuild XML元素。相反,你应该做的是以下几点

  • 以任何适合您需要的格式创建XML文件
  • 创建自定义MSBuild任务,该任务读取XML文件并发出ItemGroup
  • 将任务添加到项目文件并调用它
  • 创建MSBuild任务非常简单。使用MSBuild 4.0+甚至可以在MSBuild文件中定义整个任务,这样就不必担心编译它和生成程序集。有关这方面的更多信息,请查看

    如果您采用这种方法,它将更容易实现和维护,并且总体上是一种更好的方法。如果您想了解有关如何创建任务的更多详细信息,最好的资源是。

    我发现,对于处理任意XML文件(特别是XmlFile和XmlTask)非常有用。我们使用这种方法来管理/暂存数据库更改


    也就是说,我的建议只是为了回答“如何使用MSBuild将XML转换为项目?”@Sayed关于它是否适合您手头的问题的观点是另一个完全值得思考的问题。

    本文很有帮助。我已经使xslt转换工作得非常好,我的新.xml文件也非常好。但是现在,我如何在运行时读取这些信息呢?没有任务“读取”等效于的文件。应将新xml文件转换为MSBuild格式。然后可以通过标记导入该文件,也可以使用MSBuild任务调用它。一旦有了文件,就不能在生成目标内部导入该文件。我已经解决了这个问题,但是它没有使用任何一个提示。如果你有一个解决方案,考虑回答你自己的问题。尝试使用MSBug任务来“导入”它。就像这样:这就是我最终所做的。它接收XML文件,并发出一个包含正确元数据的ItemGroup。它工作得很好。