7

我正在尝试确定在 Visual Studio 中使用自定义工具时是否有可能更改一个文件的内容,触发另一个文件的自定义工具。

我的情况是这样的:

在 Visual Studio C# 项目中,我有一个“master.xsd”xml 架构,其中包括其他几个 xsd 文件。我正在使用Xsd2Code Visual Studio 自定义工具从架构生成 .cs。当 master.xsd 本身发生更改时,这可以正常工作,但是我希望自定义工具在其他 xsds 之一更改时在文件 master.xsd 上运行。

有没有办法让一个文件触发另一个文件的自定义工具?

[编辑-有关我为什么要为此使用自定义工具的更多详细信息]

目前我们有一个 GenerateFiles.bat 文件,它从命令行调用 Xsd2Code 以从模式生成代码文件(如下面的 MattDavey 建议)。这行得通,就是太慢了。

问题是,Xsd2Code 在每次构建时都会运行,但由于许多其他项目依赖于这个项目的模式,即使可能没有任何改变,它们也会重新编译。实际的结果是,即使是对单元测试的微小更改也会涉及到一半的项目重新编译。这就是为什么我们一直在研究仅在架构更改时才生成代码文件的自定义工具方法。

4

1 回答 1

4

我以这种方式大量使用 Xsd2Code,但我的方法是添加一个预构建事件,该事件调用 Xsd2Code 命令行并在每次构建时重新生成 xml。

我的预构建事件如下所示:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs /platform Net40 /collection Array  /sc+ /ap+ /if- /xa+

在您的情况下,您可以仅在主 xsd 上运行此预构建步骤(我猜是 xsd:Imports the other schemas),或者您可以单独在每个架构文件上运行该命令。

这样做的好处是,如果我更改 XSD 架构,我会得到非常有用的编译时错误 :)

希望能给你一些想法!

编辑

我花了一些时间思考您强调的关于构建时间的问题,并修改了预构建脚本,如下所示:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs.temp /platform Net40 /collection Array  /sc+ /ap+ /if- /xa+

fc $(ProjectDir)Api\Schemas\MySchema.cs  $(ProjectDir)Api\Schemas\MySchema.cs.temp

if errorlevel 1 copy $(ProjectDir)Api\Schemas\MySchema.cs.temp $(ProjectDir)Api\Schemas\MySchema.cs /Y

del $(ProjectDir)Api\Schemas\MySchema.cs.temp

所以 Xsd2Code 现在将源代码生成到一个临时文件中,如果它不同,它只会覆盖现有的 .cs 文件。这应该意味着如果 .xsd 根本没有改变,那么生成的 .cs 也不会改变 :)

您仍然会受到运行 xsd2code 的影响,但如果生成的源代码相同,您不会受到 msbuild 重建整个项目链的影响。

于 2012-02-17T09:47:43.730 回答