使用 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,一经查实,立即删除!

相关文章

降低winnt Apache服务的权限,让你的虚拟主机更安全

winnt 安装 Apache 后,在后台的服务默认是以system权限运行的(system是winnt的最高权限),这给服务器带来很大的安全隐患,最近我遇到的就是php的W8C 文件管理既然可以随意浏览,创建和删除winnt分区内的所有文件&#xf…

MySQL relay log 详细参数解释

前言:MySQL进行主主复制或主从复制的时候会在home目录下面产生相应的relay log,本文档总结这些相关参数的定义及解释.1、什么是relay logThe relay log, like the binary log, consists of a set of numbered files containing events that describe dat…

B2B行业网站电话销售应具备的精神

B2B行业网站电话销售人员除了要具备一定的专业知识、销售技巧之外,还需要销售者本身具有一定的精神,才能更好的胜任电话销售的工作。 1 B2B行业网站电话销售的精神:脸皮厚、抗压力强、不达目的不罢休脸皮一定要足够厚,不能说别人…

Android之解决远程拍照不打开activity用其它方式获取surfaceView

关键代码: mSurfaceView new SurfaceView(mContext);mSurfaceHolder mSurfaceView.getHolder();mSurfaceHolder.setType(SurfaceHolder.SURFACETYPE_TYPE_PUSH_BUFFERS)//获取相机缓存数据mmSurfaceHoler.addCallback(mSurfaceCallback);mWindowManag…

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

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

linux去掉某一字符开头的行

grep -v ^# /home/test > /home/test2 转载于:https://www.cnblogs.com/no314/p/3656921.html

关于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

Android之Timer和TimerTask的介绍

在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务。比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask。 Timer是一个普通的类,其中有几个重要的方法&#…

有计算机信号专业吗,计算机医学图像及信号处理

院校选择是考研成功关键的第一步。想考计算机医学图像及信号处理专业,选择哪个学校更好?聚创考研网小编为大家整理了相关内容,详细如下:工学类考研辅导班请咨询:juchuang911计算机医学图像及信号处理考研院校是对计算机…

Fragment生命周期

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