使用 dotnet format 格式化代码

使用 dotnet format 格式化代码

Intro

dotnet-format 在之前的版本是一个独立的命令行工具,在 .NET 6 里已经成为了 SDK 的一部分,我们可以使用,使用 dotnet format 我们可以结合 editorconfig 保持代码风格的一致,我们也可以将 dotnet format 作为一个 CI 服务来运行,自动 format 我们的代码或验证代码是否符合我们的代码风格

Editorconfig

EditorConfig 有助于为跨各种编辑器和 IDE 处理同一项目的多个开发人员维护一致的编码风格

Editorconfig 是用来指定文件的格式的,在 .NET 里,微软扩充了 editorconfig 的用法,我们可以把 C# 的一些编码风格甚至一些错误的级别也加入其中,从而可以通过 editorconfig 来统一代码的风格。

很多编辑器和 IDE 都支持 Editorconfig,包括我们常用 VS,Rider、VS Code/Sublime 等

Sample

C# 10 开始支持了 file-scoped namespace,我们可以使用 editorconfig 来配置使用 file-scoped 风格的命名空间声明方式,在之前的文章中,我们曾经介绍过,可以在 editorconfig 中配置 csharp_style_namespace_declarations=file_scoped:suggestion 来使得 VS 创建项目的时候默认使用 file-scoped 风格,这里的 suggestion 是一个提示级别,我们也可以将此级别提高成 info/warning 甚至 error,dotnet format 默认自动 format 级别为 warning 及以上级别的规则

所以我们可以将上面的级别改成 warning,然后在项目目录下运行 dotnet format,然后我们项目中所有类型的命名空间风格就会从传统的风格变成新的 file-scoped 风格,可以参考这个 commit https://github.com/WeihanLi/WeihanLi.Npoi/commit/201427b95f2bc23e97e2be595bc103301b7898e3

下面这个变更就是由 dotnet format 更改的

661d97f9de2346f390a62f46b0510ed3.png

一个命令迁移项目中所有文件的命名空间风格为新的 file-scoped 风格,是不是很方便呢~~

当然不仅仅是命名空间风格,我们还可以在 editorconfig 中定义其他很多的代码风格,甚至我们也可以定义一些第三方分析器的诊断级别,具体规则可以参考微软的这个文档:https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-style-rule-options?view=vs-2019

有一些代码格式在 VS 中也是可以配置的,但是个人更加推荐使用 editorconfig 的方式,这样别人要修改某个项目的时候,也不需要修改 VS 的配置,只需要遵循 editorconfig 的风格就可以了,配置即代码,在任何地方都是一样的,也不需要关注 IDE。

CI Service

我们可以把 dotnet format 做成一个 CI 服务来保证自己的代码风格始终是一致的,我们可以有多个选择

第一种方式,我们只做代码格式的验证,我们可以使用 dotnet format --verify-no-changes 来验证格式是否有问题,如果格式有问题,exitcode 将不会是 0,而是 2,也就意味着会 CI 失败

Github Actions CI 配置示例如下:

name: dotnet-formaton: [pull_request]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v1- name: Setup .NET 6uses: actions/setup-dotnet@v1with:dotnet-version: '6.0.x'- name: buildrun: dotnet build- name: check formatrun: dotnet format --verify-no-changes

第二种,我们可以直接提交一个 commit 来修复不正确的格式,运行 dotnet format 的时候会尝试修复项目的代码格式,修复之后我们把这些修复后的文件变成提交成一个 commit 然后推送到我们的代码库就可以了,Github Actions CI 示例如下:

name: dotnet-formaton:push:branches: [ dev ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v1- name: Setup .NET 6uses: actions/setup-dotnet@v1with:dotnet-version: '6.0.x'include-prerelease: true- name: buildrun: dotnet build- name: formatrun: dotnet format- name: check for changesrun: |if git diff --exit-code; thenecho "has_changes=false" >> $GITHUB_ENVelseecho "has_changes=true" >> $GITHUB_ENVfi- name: Commit and Pushif: ${{ env.has_changes == 'true' }}shell: bashrun: |git config --local user.name "github-actions[bot]"git config --local user.email "weihanli@outlook.com"git add -ugit commit -m "Automated dotnet-format update from commit ${GITHUB_SHA} on ${GITHUB_REF}"git log -1remote_repo="https://${GITHUB_ACTOR}:${{secrets.GITHUB_TOKEN}}@github.com/${GITHUB_REPOSITORY}.git"git push "${remote_repo}" HEAD:${GITHUB_REF}

这里的 CI 直接运行了 dotnet format 命令,然后会通过 git 命令来检查是否有文件变更,如果有文件变更就会生成一个 commit 并推送到代码库

前面的变更就是 CI 自动提交的 commit  的一部分,当我提交代码时就会自动跑 dotnet format 如果有变更就会提交到仓库一个新的格式化的提交,下面两个commit 就是 CI 自动提交的一个示例

b1829c79b54d7bb7b13ba154222cfafb.png

Github actions 可以参考

  • https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/.github/workflows/dotnet-format.yml

  • https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/.github/workflows/dotnet-format-pr-validation.yml

More

除了上面的这些基本用法,dotnet format 还有更多的选项,可以通过 --severity 指定严重等级,默认是 warning,也可以手动指定为 info 或者 error,另外可以只 format 空格 dotnet format whitespace、代码风格 dotnet format style 或者第三方的分析器 dotnet format analyzers

更多可以参考 dotnet format 的介绍:https://github.com/dotnet/format/blob/main/README.md

总体上使用下来,感觉还是挺不错的,但是目前有遇到两个问题,一个是在使用框架条件编译的时候

也就是代码里有 #if NET6_0 类似代码时格式可能会有问题,出现一段被注释的代码,这里有一个示例,但是手动改了以后似乎没有这个问题了,只遇到过一次,而且 review 了更改的代码也没什么问题

7702c5f6b4025ea4ed444f3340bf1c28.png

代码太多了截图了一部分,感兴趣的可以直接看对应 commit 的文件:https://github.com/WeihanLi/WeihanLi.Common/blob/3b080c08c87fa24d99a938a8b3173fb7ec3e92de/src/WeihanLi.Common/Helpers/SecurityHelper.cs

另外一个问题是项目中有 source generator 的时候会 format 失败,提了一个 issue,暂时还没有解决方案,感兴趣的可以参考:https://github.com/dotnet/format/issues/1461

References

  • https://github.com/dotnet/format

  • https://github.com/dotnet/format/issues/1268

  • https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-style-rule-options?view=vs-2019

  • https://github.com/dotnet/format/blob/main/docs/Supported-.editorconfig-options.md

  • https://github.com/WeihanLi/WeihanLi.Npoi/commit/201427b95f2bc23e97e2be595bc103301b7898e3

  • https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/.github/workflows/dotnet-format.yml

  • https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/.github/workflows/dotnet-format-pr-validation.yml

  • https://github.com/dotnet/format/issues/1461

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机管理用户和组无法访问,同一工作组无法访问如何解决【详解】

在生活中,不知道你是否和小编一样:计算机会出现各种各样,千奇百怪的问题,其中最常见的是同一工作组无法访问的问题。由于某种不知名的原因,在打开计算机网上邻居时,计算机会弹出讨人厌的提示——无法访问。…

关于Asp.net core配置信息读取的源码分析梳理

概述我们都知道asp.net core配置信息的读取离不开IConfigurationSource和IConfigurationProvider这两个类,ConfigurationSource可以提供一个ConfigurationProvider,然后去读取信息。究竟他们之间有着怎样的千丝万缕,我们一起来看看源码。首先…

MCGS与PLC通讯不上

为什么80%的码农都做不了架构师?>>> 组态串口参数错误 应为偶校验 转载于:https://my.oschina.net/5star/blog/118301

MySQL案例分析--QueryCache

QueryCache联动内容:http://blog.itpub.net/29510932/viewspace-1694922/ -------------------------------------------------------------------------------------------------正文--------------------------------------------------------------------------------------…

Android之PowerManager简介

android.os. PowerManager 通过 PowerManager 类我们可以对设备的电源进行管理。对该类API的使用将影响到电池寿命。只有在必须使用WakeLocks的时候,才使用WakeLocks,且在不使用它的时候要及时释放(release). 默认情况下,当用户对手机有一段时间没有操作后࿰

什么时候告白最合适?

1 电饭煲吐血了!(素材来源网络,侵删)▼2 比冰淇淋掉地上更悲剧的事(素材来源网络,侵删)▼3 老师的火气又上去了▼4 什么时候最适合告白(via.银教授,侵删)▼…

helloworld:一个完整的WCF案例

服务端 1.创建一个空的解决方案:WCFDemo: 2.创建一个宿主控制台程序:Host 3.右击Host项目,选择“添加”--“新建项”,选择“WCF服务”创建名为“Service1.cs”的服务 如此:VS2010已经为我们创建了 IService1.cs Service1.cs a…

极简实用的Asp.NetCore模块化框架决定免费开源了

背景在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块效率也很高。但不得…

我做的OSC界面

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/hotbain/blog/118542

Fragment生命周期

通过Android Studio创建包含两个Fragment的Activity:QuestListFragment、QuestInputFragment 调用的过程如下: 打开APPQuestListFragment﹕ onAttachQuestListFragment﹕ onCreateQuestListFragment﹕ onCreateViewQuestListFragment﹕ onViewCreatedQue…

使用Nagios监控esx、esxi、vcenter

系统环境:Centos6.3 最小化安装环境准备yum install –y libxml2-devel make gcc1、安装前准备 (1)创建nagios用户和用户组 [rootlocalhost ~]#useradd -s /sbin/nologin nagios [rootlocalhost ~]#mkdir /usr/local/nagios [rootlocalhost ~…

龙芯上市是自主路线被广泛认可的风向标

日前,龙芯通过科创板上市委员会审核,此次计划募资35.12亿元。其中,12.58亿元用于先进制程芯片研发及产业化项目,10.54亿元用于高性能通用图形处理器芯片及系统研发项目;12亿元用于补充流动资金。公开材料还披露了很多细…

量子计算机是程序员的未来,研究者:量子计算机一旦成功问世,时间也许会失去存在的意义...

贝尔实验室的科学家索尔,自从在1994年35界计算科学基础年会上提出量子算法后,立刻引起全世界科学界的轰动,量子计算机的研究热潮自此到来。量子计算机的运行方式以及存储计算方式,都与经典计算机存在着很大不同。经典计算机的存储…

.NET 现代化动态 LINQ 库 Gridify

动态 LINQ大家好,我是等天黑, 这次继续介绍开源项目,Gridify 是一个现代化动态 LINQ 库,它以最简单的方式将您的字符串转换为 LINQ 查询,并且有出色的性能。它还提供了一种使用基于文本的数据应用过滤、排序和分页的简单方法&…

brew mysql 添加修改mysql配置

为什么80%的码农都做不了架构师?>>> brew安装的MySQL是没有默认配置文件的,因此Mysql使用默认配置启动。我们需要手动创建my.cnf去覆盖默认配置。在/usr/local/opt/mysql 下确实有 my.cnf 但是并没有在启用中,应该是作为一个示例…

LINUX BASH SHELL,小小学习一下

注意点要注意的: 整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x $x 1" 或者 xexpr $x 1 两个比较表格要记得: 对应的操作 整数操作 字符串操作 相同 -eq 不同 -ne ! 大…