MSBuild忽略Target.Inputs和Outputs,不执行最新检查如何解决?
问题原因与解决方案
你的问题核心在于自定义Target没有被集成到MSBuild的默认构建流程中,导致MSBuild在检查项目是否"最新"时,不会自动验证这个Target的Inputs和Outputs状态——仅首次构建时因为输出不存在才执行,后续直接忽略了该Target的增量检查。
具体解决步骤
- 为Target添加构建阶段依赖
MSBuild的自定义Target需要明确绑定到默认构建流程的某个阶段,通过BeforeTargets或AfterTargets属性关联到标准构建目标(比如Build),这样每次构建时MSBuild都会主动检查该Target的增量状态。
修改你的BuildCss Target定义,添加阶段绑定:
<Target Name="BuildCss" Inputs="Pages/pages.css" Outputs="wwwroot/css/styles.css" BeforeTargets="Build"> <Copy SourceFiles="@(Inputs)" DestinationFiles="@(Outputs)" OverwriteReadOnlyFiles="true" /> </Target>
BeforeTargets="Build"表示在主构建任务执行前触发该Target,你也可以根据需求改为AfterTargets="Build"
- 完善任务可靠性(可选)
如果输出目录wwwroot/css可能不存在,可在Copy任务前添加目录创建逻辑,避免复制失败:
<Target Name="BuildCss" Inputs="Pages/pages.css" Outputs="wwwroot/css/styles.css" BeforeTargets="Build"> <MakeDir Directories="wwwroot/css" /> <Copy SourceFiles="@(Inputs)" DestinationFiles="@(Outputs)" OverwriteReadOnlyFiles="true" /> </Target>
- 排查增量构建日志(若问题仍存在)
开启Visual Studio的详细构建日志,查看MSBuild对BuildCssTarget的判断逻辑:
- 打开
工具 > 选项 > 项目和解决方案 > 构建并运行 - 将
MSBuild项目构建输出详细程度设为详细 - 重新构建,在日志中搜索
BuildCss,确认MSBuild是否正确识别了输入输出文件的时间戳变化。
内容的提问来源于stack exchange,提问作者synergetic
相关产品推荐
相关产品推荐

