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
相关产品推荐
相关产品推荐

