问题 在我们的组织中,我们正在运行具有不同 Web 服务的多个 GitHub 存储库。所有这些项目都需要代码样式的通用规则。我们采取了正确的方式并创建了一个服务模板项目,它是所有 .NET 解决方案的基础并定义了一个通用架构。它包含一组具有正确命名和引用的项目。但是,我们移动了错误的方式并将 文件复制到了每个新存储库。只要 文件不符合开发人员的需要,就会很想对其进行修改。我们犯了这个错误。 .editorconfig .editorconfig Internet 上没有太多关于如何创建通用 文件并将其分发到多个存储库的信息。上帝的感觉告诉它一定是一个NuGet包。经过长时间的谷歌搜索,我们找到 解决方案。感谢 为他的项目解决了同样的问题。 .editorconfig 了这个 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 文件中指定的 作为构建的一部分进行检查; EnforceCodeStyleInBuild 代码样式规则 ,但将其设置为 true 以支持早期版本的 .NET; EnableNETAnalyzers 对于 .NET 5.0 默认为 true 由于 EditorConfig 的限制之一是某些规则具有 并且不能在 EditorConfig 文件中指定。如果您不像我们那样使用 Global AnalyzerConfig 文件,您可以选择在 文件中禁用这些规则: Location.None .props <PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup> 指定要从 NuGet 包文件夹结构中复制的 文件的位置: .editorconfig <ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup> 请注意不同平台上文件路径字符串中的 和 符号。我们确实花了很多时间来弄清楚为什么 文件没有被复制。 \ / .editorconfig 使用 MSBuild 任务将文件复制到正在构建的 .NET 项目的文件夹中。此目标定义为在 MSBuild 目标之前执行。 Copy 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 包发布到本地存储并验证它是否有效。 在 项目文件夹中执行以下命令打包一个 NuGet 包: MyProject.EditorConfig 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 包添加到我们的所有项目中,并避免所有存储库中的代码样式不同步。