在 Visual Studio 中,我可以让一个文件运行另一个文件的自定义工具吗? (在本例中使用 Xsd2Code)

发布于 2025-01-06 17:03:06 字数 669 浏览 1 评论 0原文

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

我的场景是这样的:

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

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

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

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

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

I am trying to work out if it is possible, when using a Custom Tool in Visual Studio, to have a change in the contents of one file, trigger the Custom Tool of another.

My scenario is this:

In a Visual Studio C# project, I have an "master.xsd" xml schema which includes several other other xsd files. I am using the Xsd2Code Visual Studio Custom Tool to generate a .cs from the schema. This works fine when the master.xsd itself changes, but I would like the custom tool to run on the file master.xsd when one of the other xsds changes.

Is there any way of one file triggering another's Custom Tool?

[EDIT - more detail on why I'm looking into using a custom tool for this]

At present we have a GenerateFiles.bat file that calls Xsd2Code from the command line to generate the code fiels from the schemas (as suggested by MattDavey below). This works, is just too slow.

The problem is that on every build Xsd2Code will, run but because lots of other projects depend on this project with the schemas, they will all recompile too even though probably nothing has changed. The practical upshot is that even a minor change to a unit test involves half the projects recompiling. This is why we've been looking at the custom tool approach to only generate the code files if the schema changes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

走野 2025-01-13 17:03:06

我以这种方式经常使用 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:导入其他架构),或者您可以单独在每个架构文件上运行该命令。

这样做的优点是,如果我更改 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 会重建整个项目链。

I use Xsd2Code a lot in this way, but my approach is to add a pre-build event which calls the Xsd2Code command line and regenerates the xml on each build..

My pre-build event looks like this:

$(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+

In your case you could run this pre-build step only on the master xsd (which i'm guessing xsd:Imports the other schemas), or you could run the command on each of your schema files individually.

The advantage for this is that, if I change the XSD schema, I get very useful compile time errors :)

Hope that gives you some ideas!

EDIT

I spent some time thinking about the issue you highlighted regarding build time and modified the pre-build script like so:

$(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

So Xsd2Code is now generating the source code into a temporary file, which is only overwriting the existing .cs file if it is different. This should mean that if the .xsd hasn't changed at all, neither will the generated .cs :)

You're still taking the hit of running xsd2code, but you're not taking the hit of msbuild rebuilding an entire chain of projects if the generated source was the same..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文