En nuestra organización, ejecutamos varios repositorios de GitHub con diferentes servicios web. Todos estos proyectos requieren reglas comunes para el estilo del código. Nos movimos en la dirección correcta y creamos un proyecto de plantilla de servicio que es la base para todas las soluciones .NET y define una arquitectura común. Contiene un conjunto de proyectos con nombres y referencias correctos. Sin embargo, nos movimos por el camino equivocado y copiamos el archivo .editorconfig
en cada repositorio nuevo. Existía la tentación de modificar el archivo .editorconfig
cada vez que no se ajustaba a las necesidades del desarrollador. Y nosotros hicimos esta falla.
No hay mucha información en Internet sobre cómo crear un archivo .editorconfig
común y distribuirlo en varios repositorios. El sentimiento de dios dijo que debe ser un paquete NuGet. Después de mucho tiempo de buscar en Google el problema, encontramos esta solución. Gracias a Adam Craven que resolvió el mismo problema para su proyecto.
EditorConfig ayuda a mantener estilos de codificación coherentes para varios desarrolladores que trabajan en el mismo proyecto en varios editores e IDE. El proyecto EditorConfig consta de un formato de archivo para definir estilos de codificación y una colección de complementos de editor de texto que permiten a los editores leer el formato de archivo y adherirse a los estilos definidos. Los archivos EditorConfig son fáciles de leer y funcionan bien con los sistemas de control de versiones.
En el mundo .NET, las reglas de análisis de código tienen varias opciones de configuración. Estas opciones se especifican como pares clave-valor en uno de los siguientes archivos de configuración del analizador:
Archivo EditorConfig : opciones de configuración basadas en archivos o carpetas.
Archivo Global AnalyzerConfig : opciones de configuración a nivel de proyecto. Útil cuando algunos archivos de proyecto residen fuera de la carpeta del proyecto.
Puede establecer la gravedad de las advertencias del compilador o las reglas del analizador en un archivo EditorConfig con la siguiente sintaxis:
dotnet_diagnostic.<rule ID>.severity = <severity>
Establecer la gravedad de una regla en un archivo EditorConfig tiene prioridad sobre cualquier gravedad establecida en un conjunto de reglas o en el Explorador de soluciones.
En algunos proyectos, hay una combinación de archivos de configuración locales y globales. Además, EditorConfg tiene algunas limitaciones en el mundo .NET también especificadas en este artículo en la sección de limitaciones . Probamos en ambos sentidos y avanzamos y retrocedimos con estos dos enfoques. Y finalmente decidimos movernos de una manera simple para usar solo EditoConfig para nuestros proyectos.
Lo primero es lo primero, debe crear un nuevo proyecto de biblioteca C# para el paquete NuGet. Llamémoslo MyProject.EditorConfig
. Este proyecto contendrá los siguientes archivos:
.props
.csproj
.editorconfig
Debe agregar PropertyGroup con las siguientes propiedades establecidas en el valor verdadero:
<PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup>
EnforceCodeStyleInBuild
: permite que las reglas de estilo de código especificadas en el archivo EditorConfig se verifiquen como parte de la compilación;EnableNETAnalyzers
esverdadero de forma predeterminada para .NET 5.0 , pero configúrelo en verdadero para admitir versiones anteriores de .NET;
Como una de las limitaciones de EditorConfig es que algunas reglas tienen Location.None
y no se pueden especificar en un archivo EditorConfig. Si no usa el archivo Global AnalyzerConfig como lo hacemos nosotros, tendría la opción de deshabilitar esas reglas en el archivo .props
:
<PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup>
Especifique la ubicación del archivo .editorconfig
para copiar desde dentro de la estructura de carpetas del paquete NuGet:
<ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup>
Tenga cuidado con los símbolos
\
y/
en la cadena de ruta del archivo en diferentes plataformas. Realmente nos llevó mucho tiempo averiguar por qué no se copia el archivo.editorconfig
.
Utilice la tarea de Copy
de MSBuild para copiar el archivo en la carpeta del proyecto .NET que se está compilando. Este destino está definido para ejecutarse antes que MSBuild BeforeBuild
Target.
<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>
De forma predeterminada, cuando se empaquetan los archivos NuGet que comienzan con un punto, se ignoran. Para evitar eso, debe agregar el siguiente código al archivo .csproj
:
<PropertyGroup> <NoDefaultExcludes>true</NoDefaultExcludes> </PropertyGroup>
Después de eso, debe incluir los archivos .props
y .editorconfig
:
<ItemGroup> <None Include="MyProject.EditorConfig.props" Pack="true" PackagePath="\build" /> <None Include=".editorconfig" Pack="true" PackagePath="\content\Rules" /> </ItemGroup>
Cuando todo el trabajo haya terminado, puede publicar el paquete NuGet en el almacenamiento local y verificar que funciona.
Ejecute el siguiente comando en la carpeta del proyecto MyProject.EditorConfig
para empaquetar un paquete NuGet:
dotnet pack MyProject.EditorConfig.csproj -c Release -o out --no-restore
Publícalo en el almacenamiento local (carpeta). NuGet CLI debe instalarse de antemano:
nuget add out/MyProject.EditorConfig.1.0.0.nupkg -Source /Users/igorlopushko/test_nuget_expand/ -Expand
Especifique una carpeta de destino con el parámetro -Source
.
Registre la ruta del paquete NuGet local:
dotnet nuget add source /Users/igorlopushko/test_nuget_expand/
Para agregar un paquete NuGet local al proyecto de destino, ejecute este comando en la carpeta del proyecto de destino:
dotnet add package MyProject.EditorConfig -s /Users/igorlopushko/test_nuget_expand/
Cuando construya su proyecto de destino, obtendrá el archivo .editorconfig
en el directorio raíz de este proyecto. Se sobrescribirá cada vez que construyas un proyecto. Incluso si se modificó de alguna manera por error, el archivo .editorconfig
se sobrescribirá en la compilación.
La solución es bastante simple, pero facilitó la vida de nuestro equipo. Hemos agregado este paquete NuGet a todos nuestros proyectos y evitamos la desincronización en estilos de código en todos los repositorios.