如果在解决方案文件中的任何项目中设置了某些MsBuild属性,是否可以引发自定义编译错误?

问题描述 投票:1回答:1

背景我在根存储库文件夹中创建了一个Directory.Build.props,内容如下:

<Project>
  <PropertyGroup>
    <LangVersion>7.3</LangVersion>
  </PropertyGroup>
</Project>

我需要防止在我们的代码库中使用C#8语法,因为它的目标是.Net 4.7.2。上面的文件为解决方案中的每个项目设置LangVersion属性。

问题

我们的代码库很大。在单个解决方案中的许多项目中,有许多程序员从事不同的工作和/或添加新的程序员,这本身并不是问题,而是任何程序员都可以在其自己的LangVersion文件中覆盖.csproj的事实。

我知道我们可以在代码审查阶段中停止这些更改,也可以通过每小时向所有程序员发送提醒,告诉他们不要为该特定项目使用C#8,来停止这些更改。但是我想知道是否可以通过给他们一个漂亮而英俊的编译器错误来庆祝它们的大胆。

也许使用Roslyn的自定义代码分析器?有什么办法吗?

c# .net msbuild csproj sln-file
1个回答
1
投票

尝试这样的事情:

<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的不同版本中发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.