如何基于输入文件过期状态执行MSBuild(csproj)的自定义Target目标
问题根因与修复方案
你定义的Target未生效核心是自定义Target未关联到MSBuild默认构建流程,同时可补充配置避免路径、输出可见性问题,修复方式如下:
- 给Target添加
BeforeTargets/AfterTargets属性,将其挂载到默认构建链路中,比如指定在默认Build目标执行前运行 - 显式使用
$(MSBuildProjectDirectory)定位项目根目录,避免工作目录异常导致的文件识别错误 - 给
Exec节点添加ConsoleToMSBuild="true"配置,确保命令输出能被VS捕获到构建窗口中
修改后的完整配置如下:
<ItemGroup> <ins Include="$(MSBuildProjectDirectory)\A.txt" /> <outs Include="$(MSBuildProjectDirectory)\B.txt" /> </ItemGroup> <Target Name="ExecuteTarget" Inputs="@(ins)" Outputs="@(outs)" BeforeTargets="Build"> <Exec Command="echo hello world" ConsoleToMSBuild="true" /> </Target>
验证说明
- 删除B.txt后重新构建,首次构建会触发Target执行并输出内容
- 修改A.txt内容后重新构建,会触发执行
- 未修改A.txt且B.txt存在且更新时间晚于A.txt时,构建会跳过该Target,符合预期的增量构建逻辑
如果还是看不到输出,可以调整VS构建输出详细程度:依次打开工具>选项>项目和解决方案>生成并运行,将「MSBuild项目生成输出详细程度」设置为「普通」或更高等级即可。
内容的提问来源于stack exchange,提问作者Anurag S Sharma
相关产品推荐
相关产品推荐

