paint-brush
如何使用 Common EditorConfig 作为 NuGet 包by@igorlopushko
6,320
6,320

如何使用 Common EditorConfig 作为 NuGet 包

Igor Lopushko1m2022/06/17
Read on Terminal Reader
Read this story w/o Javascript

EditorConfig 有助于为跨各种编辑器和 IDE 处理同一项目的多个开发人员保持一致的编码风格。 EditorConfig 文件易于阅读,并且可以与版本控制系统很好地配合使用。 EditorConfg 在 .NET 世界中有一些限制,也在本文的 [限制] 部分中指定。 EditorConfig 项目由用于定义编码样式的文件格式**和一组文本编辑器插件**组成,使编辑器能够读取文件格式并遵守定义的样式。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 如何使用 Common EditorConfig 作为 NuGet 包
Igor Lopushko HackerNoon profile picture

问题

在我们的组织中,我们正在运行具有不同 Web 服务的多个 GitHub 存储库。所有这些项目都需要代码样式的通用规则。我们采取了正确的方式并创建了一个服务模板项目,它是所有 .NET 解决方案的基础并定义了一个通用架构。它包含一组具有正确命名和引用的项目。但是,我们移动了错误的方式并将.editorconfig文件复制到了每个新存储库。只要.editorconfig文件不符合开发人员的需要,就会很想对其进行修改。我们犯了这个错误。


Internet 上没有太多关于如何创建通用.editorconfig文件并将其分发到多个存储库的信息。上帝的感觉告诉它一定是一个NuGet包。经过长时间的谷歌搜索,我们找到了这个解决方案。感谢Adam Craven为他的项目解决了同样的问题。

为什么选择 EditorConfig

EditorConfig 有助于为跨各种编辑器和 IDE 处理同一项目的多个开发人员保持一致的编码风格。 EditorConfig 项目由用于定义编码样式的文件格式和一组文本编辑器插件组成,这些插件使编辑器能够读取文件格式并遵守定义的样式。 EditorConfig 文件易于阅读,并且可以很好地与版本控制系统配合使用。


在 .NET 世界中,代码分析规则具有各种配置选项。您可以在以下分析器配置文件之一中将这些选项指定为键值对:

  • EditorConfig文件:基于文件或基于文件夹的配置选项。

  • 全局 AnalyzerConfig文件:项目级配置选项。当某些项目文件位于项目文件夹之外时很有用。


您可以使用以下语法在 EditorConfig 文件中设置编译器警告或分析器规则的严重性:

dotnet_diagnostic.<rule ID>.severity = <severity>


在 EditorConfig 文件中设置规则的严重性优先于在规则集或解决方案资源管理器中设置的任何严重性。


在某些项目中,混合了本地和全局配置文件。此外,EditorConfg 在 .NET 世界中也有一些限制,也在本文的限制部分中指定。我们尝试了两种方法,并在这两种方法中来回移动。最后决定移动一种简单的方法,只在我们的项目中使用 EditoConfig。

解决方案

首先,您需要为 NuGet 包创建一个新的 C# 库项目。我们称之为MyProject.EditorConfig 。该项目将包含以下文件:

  • .props文件
  • .csproj文件
  • .editorconfig文件

.props 文件

您必须添加 PropertyGroup 并将以下属性设置为 true 值:

 <PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup>



由于 EditorConfig 的限制之一是某些规则具有Location.None并且不能在 EditorConfig 文件中指定。如果您不像我们那样使用 Global AnalyzerConfig 文件,您可以选择在.props文件中禁用这些规则:

 <PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup>


指定要从 NuGet 包文件夹结构中复制的.editorconfig文件的位置:

 <ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup>


请注意不同平台上文件路径字符串中的\/符号。我们确实花了很多时间来弄清楚为什么.editorconfig文件没有被复制。


使用 MSBuild Copy任务将文件复制到正在构建的 .NET 项目的文件夹中。此目标定义为在 MSBuild BeforeBuild目标之前执行。

 <Target Name="CopyEditorConfig" BeforeTargets="BeforeBuild"> <Message Text="Copying the .editorconfig file from '@(EditorConfigFilesToCopy)' to '$(SolutionFolder)'"></Message> <Copy SourceFiles="@(EditorConfigFilesToCopy)" DestinationFolder="$(SolutionFolder)" SkipUnchangedFiles="true" UseHardlinksIfPossible="false" /> </Target>

.csproj 文件

默认情况下,打包以句点开头的 NuGet 文件时会被忽略。为避免这种情况,您必须将以下代码添加到.csproj文件中:

 <PropertyGroup> <NoDefaultExcludes>true</NoDefaultExcludes> </PropertyGroup>


之后,您必须包含.props.editorconfig文件:

 <ItemGroup> <None Include="MyProject.EditorConfig.props" Pack="true" PackagePath="\build" /> <None Include=".editorconfig" Pack="true" PackagePath="\content\Rules" /> </ItemGroup>

构建和测试 NuGet 包

完成所有工作后,您可以将 NuGet 包发布到本地存储并验证它是否有效。


MyProject.EditorConfig项目文件夹中执行以下命令打包一个 NuGet 包:

 dotnet pack MyProject.EditorConfig.csproj -c Release -o out --no-restore


将其发布到本地存储(文件夹)。必须预先安装NuGet CLI

 nuget add out/MyProject.EditorConfig.1.0.0.nupkg -Source /Users/igorlopushko/test_nuget_expand/ -Expand

使用-Source参数指定目标文件夹。


注册本地 NuGet 包路径:

 dotnet nuget add source /Users/igorlopushko/test_nuget_expand/


要将本地 NuGet 包添加到目标项目,请在目标项目的文件夹中执行以下命令:

 dotnet add package MyProject.EditorConfig -s /Users/igorlopushko/test_nuget_expand/


构建目标项目时,您将在该项目的根目录中获得.editorconfig文件。每次构建项目时都会覆盖它。即使它以某种方式被错误地修改, .editorconfig文件也会在构建时被覆盖。

结论

解决方案非常简单,但它使我们团队的生活更轻松。我们已将此 NuGet 包添加到我们的所有项目中,并避免所有存储库中的代码样式不同步。