You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDK风格csproj中NSwag生成代码首次构建未被识别该如何解决?

解决SDK-style csproj中NSwag首次构建失败的问题

问题核心:首次构建时,MSBuild在项目评估阶段就确定了要编译的文件列表,此时NSwag还没生成代码文件,这些文件不在初始编译集合里,导致编译报错;第二次构建时文件已存在,评估阶段能识别到,所以成功。

解决步骤

1. 在自定义Target中添加生成文件到编译集合

修改你的NSwag Target,在执行生成命令后,把生成的代码文件明确加入<Compile>项,让MSBuild编译阶段能识别到这些动态生成的文件:

<Target Name="NSwag" BeforeTargets="CoreCompile">
    <!-- 执行NSwag生成命令,替换为你的实际参数 -->
    <Exec WorkingDirectory="$(MSBuildProjectDirectory)" 
          Command="$(NSwagExe_Net70) openapi2csclient -i swagger.json -o Generated/ApiClient.cs -n Namespace.Of.Generated.Code" />
    
    <!-- 将生成的文件添加到编译集合 -->
    <ItemGroup>
        <!-- 单个文件的情况 -->
        <Compile Include="$(MSBuildProjectDirectory)/Generated/ApiClient.cs" />
        
        <!-- 如果生成多个文件,用通配符 -->
        <!-- <Compile Include="$(MSBuildProjectDirectory)/Generated/*.cs" /> -->
    </ItemGroup>
</Target>

2. 可选:添加清理生成文件的Target

为了避免构建残留,可以添加一个Clean Target,在执行dotnet clean时删除生成的代码文件:

<Target Name="CleanNSwagGenerated" BeforeTargets="Clean">
    <Delete Files="$(MSBuildProjectDirectory)/Generated/*.cs" />
</Target>

3. 验证BeforeTargets的正确性

确保BeforeTargets="CoreCompile",这个Target是.NET SDK中负责核心编译的阶段,在它之前执行NSwag生成,能保证代码在编译前生成并被加入编译集合。

为什么之前的尝试无效?

你之前修改BeforeTargets为Compile、Build等,问题在于即使Target执行顺序对了,但MSBuild不知道新生成的文件需要被编译——必须手动将这些文件添加到<Compile>项,否则首次构建时编译阶段不会包含它们。

内容的提问来源于stack exchange,提问作者TorbenJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:35:50