我编写了一些MSBuild脚本,允许我构建几百个项目。一个要求是将文件复制到构建目录中。我有一个XML文件,其中包含需要复制的内容以及需要复制到的位置。这个XML文件只是我导入到主项目中的ItemGroup,一切都很好。
我唯一的问题是我的XML文件包含所有项目 huge (我有数百个要复制的目录)!这是因为所有项目都必须附加元数据,这意味着每个复制声明必须有3行代码和3个XML元素。即。
<copy_to_build Include="$(FooDir)/BAZ/CoreDataFiles/*">
<Destination>$(BuildDir)//BAZ/</Destination>
</copy_to_build>
这相当于我的副本脚本的大小增加了三倍,这意味着很难维护。
好的,所以我将XML转换为这种格式,在另一个文件中:
<copy_to_build Source="$(FooDir)/BAZ/CoreDataFiles/*" Destination="$(BuildDir)//BAZ/" />
这更简洁,因为每个复制命令有一个xml元素。它更容易阅读。
唯一的问题是我不能在MSBuild中将它们用作“项目”,因为缺少元数据,而且项目不能具有“目标”属性。
因此,我编写了一个工具,将我的简洁XML“转换”为详细的MSBuild格式。然后,我面临着如何将这个转换后的XML文件恢复到我的“项目”文件中的困境。我确实发现Imports必须在项目级别完成:因此我无法在任务或目标中“转换”我的xml文件。这意味着在处理导入时必须准备好文件。因此,我的目标中无法重新评估xml文件...所以显然我必须在从命令行调用MSBuild之前“转换”我的xml文件。这为我的构建过程添加了复杂的步骤。
所以我的最后一个问题是,如何读取我的(一个元素)XML文件数据并将其转换为目标或任务中的(三个元素)项?
我听说过动态项目,但我仍然对msbuild有足够的新意,我不知道如何使用它们,或者它们是否与我的问题相关。
感谢。
答案 0 :(得分:1)
尝试在输入的单元素XML文件上使用XSLT转换,将其转换为MSBuild脚本中使用的三元素XML文件。 Here是一篇很好的文章,介绍如何在MSBuild中使用XSLT转换。
答案 1 :(得分:1)
这不是解决您遇到的问题的正确方法(除非我不理解问题)。忘记尝试动态生成MSBuild XML元素。相反,你应该做的是以下几点。
创建MSBuild任务非常简单。使用MSBuild 4.0+,您甚至可以在MSBuild文件中定义整个任务,这样您就不必担心编译它并构建程序集。有关详细信息,请查看Inline Tasks。
如果采用这种方法,它将更容易实施和维护,并且总体上是更好的方法。如果您想了解有关如何创建任务的更多详细信息,则最佳资源为my book。
答案 2 :(得分:1)
我发现MSBuild Extension Pack对于处理任意XML文件非常有用,特别是XmlFile和XmlTask。我们使用这种方法来管理/暂存数据库更改。
那就是说,我的建议只是回答“我如何使用MSBuild将XML转换为项目?”的问题。 @ Sayed关于它是否适合你手头的问题的观点完全是另一回事 - 值得思考。