Vấn đề Trong tổ chức của chúng tôi, chúng tôi đang chạy nhiều kho lưu trữ GitHub với các dịch vụ web khác nhau. Tất cả các dự án này đều yêu cầu các quy tắc chung để tạo kiểu mã. Chúng tôi đã di chuyển đúng cách và tạo một dự án mẫu dịch vụ, dự án này là cơ sở cho tất cả các giải pháp .NET và xác định một kiến trúc chung. Nó chứa một tập hợp các dự án có tên và tham chiếu chính xác. Tuy nhiên, chúng tôi đã di chuyển sai cách và sao chép tệp vào mọi kho lưu trữ mới. Có một sự cám dỗ để sửa đổi tệp bất cứ khi nào nó không phù hợp với nhu cầu của nhà phát triển. Và chúng tôi đã làm lỗi này. .editorconfig .editorconfig Không có nhiều thông tin trên Internet về cách tạo tệp phổ biến và phân phối nó trên nhiều kho lưu trữ. Vị thần bảo rằng nó phải là một gói NuGet. Sau một thời gian dài tìm kiếm sự cố, chúng tôi đã tìm ra giải pháp . Cảm ơn , người đã giải quyết vấn đề tương tự cho dự án của anh ấy. .editorconfig này Adam Craven Tại sao EditorConfig EditorConfig giúp duy trì các kiểu mã hóa nhất quán cho nhiều nhà phát triển làm việc trên cùng một dự án trên nhiều trình soạn thảo và IDE khác nhau. Dự án EditorConfig bao gồm để xác định kiểu mã hóa và một bộ sưu tập các cho phép người chỉnh sửa đọc định dạng tệp và tuân theo các kiểu đã xác định. Các tệp EditorConfig dễ đọc và chúng hoạt động tốt với hệ thống kiểm soát phiên bản. một định dạng tệp plugin trình chỉnh sửa văn bản Trong thế giới .NET, các quy tắc phân tích mã có nhiều tùy chọn cấu hình khác nhau. Bạn chỉ định các tùy chọn này dưới dạng các cặp khóa-giá trị trong một trong các tệp cấu hình trình phân tích sau: : Tùy chọn cấu hình dựa trên tệp hoặc dựa trên thư mục. Tệp EditorConfig Tệp : Tùy chọn cấu hình mức dự án. Hữu ích khi một số tệp dự án nằm ngoài thư mục dự án. Global AnalyzerConfig Bạn có thể đặt mức độ nghiêm trọng cho cảnh báo trình biên dịch hoặc quy tắc phân tích trong tệp EditorConfig bằng cú pháp sau: dotnet_diagnostic.<rule ID>.severity = <severity> Đặt của quy tắc trong tệp EditorConfig sẽ được ưu tiên hơn bất kỳ mức độ nghiêm trọng nào được đặt trong bộ quy tắc hoặc trong Giải pháp Explorer. mức độ nghiêm trọng Trong một số dự án, có sự kết hợp của các tệp cấu hình cục bộ và toàn cầu. Hơn nữa, EditorConfg có một số hạn chế trong thế giới .NET cũng được nêu rõ trong bài viết này trong phần . Chúng tôi đã thử cả hai cách và di chuyển qua lại với hai cách tiếp cận này. Và cuối cùng đã quyết định chuyển sang một cách đơn giản chỉ sử dụng EditoConfig cho các dự án của chúng tôi. giới hạn Giải pháp Điều đầu tiên, bạn cần tạo một dự án thư viện C # mới cho gói NuGet. Hãy gọi nó là . Dự án này sẽ chứa các tệp sau: MyProject.EditorConfig tệp .props tệp .csproj tệp .editorconfig tệp .props Bạn phải thêm PropertyGroup với các thuộc tính sau được đặt thành giá trị true: <PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup> - cho phép được chỉ định trong tệp EditorConfig được kiểm tra như một phần của bản dựng; EnforceCodeStyleInBuild các quy tắc kiểu mã , nhưng thay vì đặt nó thành true để hỗ trợ các phiên bản .NET trước đó; EnableNETAnalyzers theo mặc định là true cho .NET 5.0 Một trong những hạn chế của EditorConfig là một số quy tắc có và không thể được chỉ định trong tệp EditorConfig. Nếu bạn không sử dụng tệp Global AnalyzerConfig như chúng tôi, bạn sẽ có một tùy chọn để tắt các quy tắc đó trong tệp : Location.None .props <PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup> Chỉ định vị trí của tệp để sao chép từ bên trong cấu trúc thư mục gói NuGet: .editorconfig <ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup> Hãy cẩn thận với các ký hiệu và trong chuỗi đường dẫn tệp trên các nền tảng khác nhau. Chúng tôi thực sự mất nhiều thời gian để tìm ra lý do tại sao tệp không được sao chép. \ / .editorconfig Sử dụng Tác vụ MSBuild để sao chép tệp vào thư mục của Dự án .NET đang được xây dựng. Mục tiêu này được xác định để thực thi trước Mục tiêu 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> tệp .csproj Theo mặc định, khi đóng gói các tệp NuGet bắt đầu bằng dấu chấm sẽ bị bỏ qua. Để tránh điều đó, bạn phải thêm mã sau vào tệp : .csproj <PropertyGroup> <NoDefaultExcludes>true</NoDefaultExcludes> </PropertyGroup> Sau đó, bạn phải bao gồm các tệp và : .props .editorconfig <ItemGroup> <None Include="MyProject.EditorConfig.props" Pack="true" PackagePath="\build" /> <None Include=".editorconfig" Pack="true" PackagePath="\content\Rules" /> </ItemGroup> Xây dựng và thử nghiệm gói NuGet Khi tất cả công việc hoàn tất, bạn có thể xuất bản gói NuGet vào bộ nhớ cục bộ và xác minh rằng nó hoạt động. Thực thi lệnh sau trong thư mục dự án để đóng gói gói NuGet: MyProject.EditorConfig dotnet pack MyProject.EditorConfig.csproj -c Release -o out --no-restore Xuất bản nó vào bộ nhớ cục bộ (thư mục). cần được cài đặt trước: NuGet CLI nuget add out/MyProject.EditorConfig.1.0.0.nupkg -Source /Users/igorlopushko/test_nuget_expand/ -Expand Chỉ định một thư mục đích với tham số . -Source Đăng ký đường dẫn gói NuGet cục bộ: dotnet nuget add source /Users/igorlopushko/test_nuget_expand/ Để thêm gói NuGet cục bộ vào dự án mục tiêu, hãy thực hiện lệnh này trong thư mục của dự án mục tiêu: dotnet add package MyProject.EditorConfig -s /Users/igorlopushko/test_nuget_expand/ Khi bạn xây dựng dự án mục tiêu của mình, bạn sẽ nhận được tệp trong thư mục gốc của dự án này. Nó sẽ bị ghi đè mỗi khi bạn xây dựng một dự án. Ngay cả khi nó đã được sửa đổi bằng cách nào đó do nhầm lẫn, tệp sẽ bị ghi đè trên bản dựng. .editorconfig .editorconfig Sự kết luận Giải pháp khá đơn giản, nhưng nó đã giúp cuộc sống của nhóm chúng tôi dễ dàng hơn. Chúng tôi đã thêm gói NuGet này vào tất cả các dự án của mình và tránh đồng bộ hóa trong các kiểu mã trên tất cả các kho lưu trữ.