[英]Is there a way to throw a custom compilation error if some MsBuild property is set in any project within a solution file?
背景我在我的根 repo 文件夹中创建了一个Directory.Build.props
,其中包含以下内容:
<Project>
<PropertyGroup>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
</Project>
我需要防止在我们的代码库中使用 C# 8 语法,因为它针对 .Net 4.7.2 上述文件为解决方案中的每个项目设置了LangVersion
属性。
问题
我们的代码库很大。 一个解决方案中的许多项目与许多程序员在不同的和/或添加新的解决方案中工作,这本身不是问题,而是任何程序员都可以在他们自己的.csproj
文件中覆盖LangVersion
的事实。
我知道我们可以在代码审查阶段停止这些更改,或者每小时向所有程序员发送提醒,告诉他们不要在这个特定项目中使用 C# 8。 但我想知道我是否可以通过给他们一个漂亮而漂亮的编译器错误来庆祝他们的大胆。
也许使用 Roslyn 的自定义代码分析器? 有什么办法吗?
尝试这样的事情:
<Project>
<Target Name="RestrictLangVersion" BeforeTargets="Compile">
<PropertyGroup>
<UnsupportedTarget Condition=" '$(MaxSupportedLangVersion)' == '7.3' AND '$(LangVersion)' == '8.0' ">true</UnsupportedTarget>
</PropertyGroup>
<Error Text="At *YOUR_COMPANY* we discourage the use of C# 8.0 on unsupported targets" Condition=" '$(UnsupportedTarget)' == 'true' " />
</Target>
</Project>
您可以将其弹出到 CI 代理中较高的Directory.Build.targets
中,它应该可以解决问题。
您需要添加用于preview
等的逻辑......(因为LangVersion
其他值会导致8.0
),其中一些将取决于csc
的版本,所以我忽略了困难的部分.
基本上你需要在这里复制逻辑: https : //github.com/dotnet/roslyn/blob/97123b393c3a5a91cc798b329db0d7fc38634784/src/Compilers/CSharp/Portable/LanguageVersion.cs#L353-L364
请记住,它会在不同版本的csc
之间发生变化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.