如何在执行`dotnet run`前运行自定义命令或csproj Target,且不在`dotnet test`时触发
解决方法:通过MSBuild目标条件区分
dotnet run和dotnet test场景 你遇到的问题本质是BeforeBuild目标会在所有构建场景(包括dotnet test触发的构建)中执行,而你需要只在dotnet run前运行自定义命令。这里有个无需环境变量或额外参数的可靠方案:
利用MSBuild的IsTargetInCurrentBuild函数,判断当前构建是否包含Run目标(只有dotnet run会触发这个目标),然后在你的自定义Target中添加这个条件。
具体配置如下,把这段代码加到你的csproj文件里:
<Target Name="MyCustomPreRunCommand" BeforeTargets="BeforeBuild" Condition="$([MSBuild]::IsTargetInCurrentBuild('Run'))"> <!-- 替换成你的自定义命令 --> <Exec Command="echo My custom pre-run command executed!" /> </Target>
为什么这个方案有效?
dotnet run会触发MSBuild的Run目标,而Run目标依赖于Build,所以BeforeBuild会在Run之前执行。通过IsTargetInCurrentBuild('Run')判断,只有当Run目标在当前构建计划中时,才会执行你的自定义命令。dotnet test会触发Test目标(同样依赖Build),但不会包含Run目标,所以你的自定义Target会被自动跳过,完全符合你"默认跳过"的需求。
如果你之前尝试BeforeTargets="Run"没效果,大概率是因为你的自定义命令需要在构建前执行(比如生成代码、修改资源),而Run目标是在构建完成后才触发的,所以绑定到BeforeBuild+条件判断才是正确的选择。
内容的提问来源于stack exchange,提问作者Jan Paolo Go
相关产品推荐
相关产品推荐

