选择正确MSBuild目标,解决C#生成代码需重复构建问题
解决方法
你的问题核心是当前构建流程中没有将刚生成的.cs文件纳入编译范围,导致必须重新构建才能被识别。只需做以下关键调整即可解决:
让MSBuild即时识别生成的文件
在codegen目标中,生成文件后显式将generated目录下的.cs文件添加到项目的编译集合里。修改后的配置如下:<!-- 自动处理库所需的代码生成 --> <Target Name="codegen" BeforeTargets="GenerateAdditionalSources"> <Message Text="Running code generators" Importance="high" /> <Exec command="echo This will be a script that generates .cs files" /> <!-- 将生成的文件加入编译项,确保当前构建能直接识别 --> <ItemGroup> <Compile Include="generated/**/*.cs" /> </ItemGroup> </Target>精准控制执行时机(可选)
如果希望更贴合编译流程的时序,可以把BeforeTargets改为BeforeCompile——这是编译阶段的直接前置目标,能确保代码生成在所有编译准备工作完成前执行:<Target Name="codegen" BeforeTargets="BeforeCompile"> <!-- 内容同上 --> </Target>增量构建优化(可选)
为避免每次构建都重复执行脚本,可添加输入输出依赖,让MSBuild仅在脚本或输入源文件变化时才重新生成代码:<Target Name="codegen" BeforeTargets="GenerateAdditionalSources" Inputs="your-script-path.sh;path/to/input-template.txt" Outputs="generated/**/*.cs"> <Message Text="Running code generators" Importance="high" /> <Exec command="your-actual-script-command" /> <ItemGroup> <Compile Include="generated/**/*.cs" /> </ItemGroup> </Target>
调整后,执行一次dotnet build就能完成代码生成并直接编译新文件,无需重复构建。
内容的提问来源于stack exchange,提问作者TheButlah
相关产品推荐
相关产品推荐

