如何区分VSCode中Roslyn LSP诊断编译与显式dotnet构建?
区分Roslyn LSP诊断编译与显式构建的MSBuild属性方案
确实有内置的MSBuild属性可以帮你区分这两种场景,无需额外添加命令行参数,具体内容如下:
核心区分属性:
DesignTimeBuild
Roslyn LSP(包括VSCode的C# Dev Kit)或OmniSharp在执行实时诊断(即输入时显示错误/警告波浪线的自动编译)时,会自动将该属性设为true;而手动执行dotnet build或通过VSCode构建任务执行时,这个属性值为false。实际使用示例
你可以在csproj文件中通过条件判断,为不同场景配置专属元素:<!-- 仅在IDE诊断场景生效的编译常量 --> <PropertyGroup Condition="'$(DesignTimeBuild)' == 'true'"> <DefineConstants>$(DefineConstants);IDE_DIAGNOSTICS_MODE</DefineConstants> </PropertyGroup> <!-- 仅在显式构建时执行的自定义目标 --> <Target Name="PostBuildCustomTask" Condition="'$(DesignTimeBuild)' != 'true'" AfterTargets="Build"> <Message Text="这是只有显式构建才会执行的任务" Importance="High" /> </Target>补充:
BuildingInsideVisualStudio属性
这个属性也会被VSCode的Roslyn LSP设为true,但它仅用于标记是否在IDE环境内运行,精准度不如DesignTimeBuild——比如IDE内触发实际构建任务时,BuildingInsideVisualStudio仍为true,但DesignTimeBuild会变为false。因此优先用DesignTimeBuild区分诊断编译与实际构建场景。
内容的提问来源于stack exchange,提问作者geekley
相关产品推荐
相关产品推荐

