在我们的组织中,我们正在运行具有不同 Web 服务的多个 GitHub 存储库。所有这些项目都需要代码样式的通用规则。我们采取了正确的方式并创建了一个服务模板项目,它是所有 .NET 解决方案的基础并定义了一个通用架构。它包含一组具有正确命名和引用的项目。但是,我们移动了错误的方式并将.editorconfig
文件复制到了每个新存储库。只要.editorconfig
文件不符合开发人员的需要,就会很想对其进行修改。我们犯了这个错误。
Internet 上没有太多关于如何创建通用.editorconfig
文件并将其分发到多个存储库的信息。上帝的感觉告诉它一定是一个NuGet包。经过长时间的谷歌搜索,我们找到了这个解决方案。感谢Adam Craven为他的项目解决了同样的问题。
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
文件您必须添加 PropertyGroup 并将以下属性设置为 true 值:
<PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup>
EnforceCodeStyleInBuild
- 允许将 EditorConfig 文件中指定的代码样式规则作为构建的一部分进行检查;EnableNETAnalyzers
对于 .NET 5.0 默认为 true ,但将其设置为 true 以支持早期版本的 .NET;
由于 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>
默认情况下,打包以句点开头的 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 包发布到本地存储并验证它是否有效。
在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 包添加到我们的所有项目中,并避免所有存储库中的代码样式不同步。