背景我在根存储库文件夹中创建了一个Directory.Build.props
,内容如下:
<Project>
<PropertyGroup>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
</Project>
我需要防止在我们的代码库中使用C#8语法,因为它的目标是.Net 4.7.2。上面的文件为解决方案中的每个项目设置LangVersion
属性。
问题
我们的代码库很大。在单个解决方案中的许多项目中,有许多程序员从事不同的工作和/或添加新的程序员,这本身并不是问题,而是任何程序员都可以在其自己的LangVersion
文件中覆盖.csproj
的事实。
我知道我们可以在代码审查阶段中停止这些更改,也可以通过每小时向所有程序员发送提醒,告诉他们不要为该特定项目使用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
的版本,所以我省去了最困难的部分。
请记住,它会在csc
的不同版本中发生变化。