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 .editorconfig
vào mọi kho lưu trữ mới. Có một sự cám dỗ để sửa đổi tệp .editorconfig
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.
Không có nhiều thông tin trên Internet về cách tạo tệp .editorconfig
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 này . Cảm ơn Adam Craven , người đã giải quyết vấn đề tương tự cho dự án của anh ấy.
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 một định dạng tệp để xác định kiểu mã hóa và một bộ sưu tập các plugin trình chỉnh sửa văn bản 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.
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ệp EditorConfig : 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 Global AnalyzerConfig : 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.
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 mức độ nghiêm trọng 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.
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 giới hạ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.
Đ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à MyProject.EditorConfig
. Dự án này sẽ chứa các tệp sau:
.props
.csproj
.editorconfig
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>
EnforceCodeStyleInBuild
- cho phép các quy tắc kiểu mã được chỉ định trong tệp EditorConfig được kiểm tra như một phần của bản dựng;EnableNETAnalyzers
theo mặc định là true cho .NET 5.0 , nhưng thay vì đặt nó thành true để hỗ trợ các phiên bản .NET trước đó;
Một trong những hạn chế của EditorConfig là một số quy tắc có Location.None
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 .props
:
<PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup>
Chỉ định vị trí của tệp .editorconfig
để sao chép từ bên trong cấu trúc thư mục gói NuGet:
<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.editorconfig
không được sao chép.
Sử dụng Tác vụ Copy
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 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>
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 .props
và .editorconfig
:
<ItemGroup> <None Include="MyProject.EditorConfig.props" Pack="true" PackagePath="\build" /> <None Include=".editorconfig" Pack="true" PackagePath="\content\Rules" /> </ItemGroup>
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 MyProject.EditorConfig
để đóng gói gói NuGet:
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). NuGet CLI cần được cài đặt trước:
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 .editorconfig
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 .editorconfig
sẽ bị ghi đè trên bản dựng.
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ữ.