【问题标题】:MSBUILD: How to transform XML file data into Items?MSBUILD:如何将 XML 文件数据转换为项目?
【发布时间】:2012-01-07 12:47:45
【问题描述】:

我编写了一些 MSBuild 脚本,可以构建数百个项目。一项要求是将文件复制到构建目录中。我有一个 XML 文件,其中包含需要复制的内容以及需要复制到的位置的列表。这个 XML 文件只是我导入到主项目中的一个 ItemGroup,一切正常。

我唯一的问题是包含所有项目的 XML 文件是 巨大的(我有数百个目录可供复制)!这是因为所有项目都必须附加元数据,这意味着每个副本声明必须有 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 文件重新放入我的“项目”文件的困境。我确实发现必须在项目级别完成导入:因此我无法在任务或目标中“转换”我的 xml 文件。这意味着文件必须在处理导入时准备好。因此,无法在我的 Target 中重新评估 xml 文件......所以显然我必须在从命令行调用 MSBuild 之前“转换”我的 xml 文件。这为我的构建过程增加了复杂的步骤。

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

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

谢谢。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    这不是解决您遇到的问题的正确方法(除非我不明白这个问题)。忘记尝试动态生成 MSBuild XML 元素。相反,您应该执行以下操作。

    1. 以适合您需要的任何格式创建 XML 文件
    2. 创建一个自定义 MSBuild 任务,该任务读取 XML 文件并发出 ItemGroup
    3. 将任务添加到您的项目文件并调用它

    创建一个 MSBuild 任务非常简单。使用 MSBuild 4.0+,您甚至可以在 MSBuild 文件中定义整个任务,这样您就不必担心编译它和构建程序集。有关这方面的更多信息,请查看Inline Tasks

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

    【讨论】:

    • 这就是我最终所做的。它接收 XML 文件,并发出带有适当元数据的 ItemGroup。效果很好。
    【解决方案2】:

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

    【讨论】:

    • 这篇文章很有帮助。我已经让 xslt 转换完美地工作,我的新 .xml 文件也很完美。但是现在,我如何在运行时读取它?没有任务可以“读取”相当于 . 的文件
    • 新的 xml 文件应该被转换成 MSBuild 格式。然后可以通过 标签导入,也可以使用 MSBuild 任务调用。
    • 一旦你有了一个文件,你就不能在构建目标中导入它。我已经解决了这个问题,但它没有使用任何这些技巧。
    • 如果您有解决方案,请考虑回答您自己的问题。
    • 尝试使用 MSBuild 任务“导入”它。像这样:
    【解决方案3】:

    我发现MSBuild Extension Pack 对于处理任意 XML 文件,特别是 XmlFile 和 XmlTask​​ 非常有用。我们使用这种东西来管理/暂存数据库更改。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多