如何配置MSBuild目标 实现API项目构建时触发NSwag客户端生成
NSwag客户端代码增量生成MSBuild配置方案
当前配置无法按预期触发的核心原因是:自定义NSwag生成任务未声明增量构建依赖的输入、输出项,MSBuild无法判断任务是否需要重新执行,仅能在客户端项目本身文件变更触发重编译时连带执行任务,无法感知API项目的内容变更。
以下配置可同时满足「客户端项目编译前完成代码生成」「仅API项目内容变更时触发重新生成」两个要求:
<ItemGroup> <!-- 保留原有不引用API输出程序集的项目引用,配置构建依赖确保API项目优先构建 --> <ProjectReference Include="..\Backend\Presentation\Web.csproj" ReferenceOutputAssembly="false" SkipGetTargetFrameworkProperties="false" PrivateAssets="all" /> </ItemGroup> <PropertyGroup> <!-- NSwag配置文件路径 --> <NSwagConfigPath>client.nswag.json</NSwagConfigPath> <!-- 生成的客户端代码输出路径,需和nswag配置中指定的output路径完全一致 --> <NSwagOutputPath>Clients/ApiClient.g.cs</NSwagOutputPath> </PropertyGroup> <ItemGroup> <!-- 将API项目所有影响API接口定义的文件列为生成任务的输入项 --> <NSwagInput Include="..\Backend\Presentation\Web.csproj" /> <NSwagInput Include="..\Backend\Presentation\**/*.cs" /> <NSwagInput Include="..\Backend\Presentation\appsettings*.json" /> <NSwagInput Include="$(NSwagConfigPath)" /> </ItemGroup> <Target Name="GenerateNSwagClient" BeforeTargets="BeforeCompile" Inputs="@(NSwagInput)" Outputs="$(NSwagOutputPath)" Condition="'$(CI)' != 'true'"> <!-- 执行生成前先确保API项目为最新构建状态 --> <MSBuild Projects="..\Backend\Presentation\Web.csproj" Targets="Build" Properties="Configuration=$(Configuration)" /> <Exec Command="$(NSwagExe_Net60) run $(NSwagConfigPath) /variables:Configuration=$(Configuration) /variables:OutputType=Exe" /> </Target>
配置注意事项
- Inputs和Outputs是MSBuild增量构建的核心判断依据:只要
Inputs列出的任意文件修改时间晚于Outputs指向的生成文件,MSBuild就会自动执行代码生成任务,无变更时直接跳过,不会额外增加编译耗时 - 若你使用的NSwag生成模式是从启动后的API运行实例拉取OpenAPI文档,而非读取编译后程序集生成代码,可将Target内构建API项目的
MSBuild节点替换为本地启动API实例的命令,输入输出的增量判断逻辑无需修改 - 请将配置中
NSwagOutputPath的取值替换为自身项目中NSwag实际输出客户端代码的文件路径,否则增量构建的时间戳判断会失效 - 如果你的API项目还依赖其他联级项目的代码变更,可以在
NSwagInput项中补充对应联级项目的文件路径,即可把这些项目的变更也纳入生成触发条件
内容的提问来源于stack exchange,提问作者Christian Klemm
相关产品推荐
相关产品推荐

