【问题标题】:Is there a way to throw a custom compilation error if some MsBuild property is set in any project within a solution file?如果在解决方案文件中的任何项目中设置了某些 MsBuild 属性,有没有办法引发自定义编译错误?
【发布时间】:2019-11-29 21:26:55
【问题描述】:

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

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

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

问题

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

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

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

【问题讨论】:

  • 在最坏的情况下,您可以添加一个自定义验证构建步骤,检查(更改?).props/.csproj 文件中没有一个具有 LangVersion > 7.3
  • 感谢@EugenePodskal,我已经认为在预构建事件命令行中运行的自定义脚本可能会解决问题。但是我可能更喜欢更简洁的东西..

标签: c# .net msbuild csproj sln-file


【解决方案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),其中一些将取决于@987654328 的版本@,所以我省略了困难的部分。

基本上,您需要在此处复制逻辑: https://github.com/dotnet/roslyn/blob/97123b393c3a5a91cc798b329db0d7fc38634784/src/Compilers/CSharp/Portable/LanguageVersion.cs#L353-L364

请记住,它会随着 csc 的不同版本而变化。

【讨论】:

  • 不用担心,我正在考虑制作一个 nuget 包,它可以使用我描述的额外智能来完成此操作。作为前团队负责人,请注意这些专横的政策,希望这个构建警告能引发一些健康的讨论,而不是硬性规定。
  • 刚刚在最后添加了一条关于缺少逻辑的评论。
  • 我确实是那些大胆的程序员之一,一旦在最新的 Visual Studio 更新☹️中支持 .net 4.7(至少有一些功能)就使用 C#8。所以我在这里有点像harakiri-我自己......
  • 好文章!我喜欢这个:“所以好消息是您可以在其他目标上启用 C# 8.0,但是它是“不受支持的”,即这可能不是一个好主意。
猜你喜欢
  • 2021-12-22
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2011-01-18
  • 2022-01-04
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多