Azure DevOps Pipeline的代码格式任务

4
TL;DR - 在构建过程中是否有一个 Azure DevOps 管道任务来格式化代码?我找不到这样一个任务,但我认为它非常有用。
我的团队使用免费的 CodeMaid Visual Studio 扩展程序来“美化”(格式化)C# 代码。虽然这个扩展程序很好用,但是依靠开发人员在 Visual Studio 中自己格式化代码有几个限制:
  • 开发人员经常忘记运行工具。
  • 启用“保存时自动运行文件清理”可能在编写代码时会令人沮丧,因为它会重新组织代码,可能会破坏思路。
  • 开发人员可以按照自己的喜好更改格式设置,而不是遵守团队的格式标准,这可能会导致代码合并问题和格式战争。
我认为一个更好的解决方案是在 Azure DevOps 中设置一个管道任务,在构建过程中运行类似 Code Maid 的工具。这将确保没有丑陋、未格式化的代码进入源代码控制,并确保所有代码都按照构建时启用的任何标准进行格式化。
3个回答

2
你可以在命令行上运行一个本地命令 dotnet-format,它可以实现你想要的功能。你可以在流水线中运行此命令。需要注意的是,它需要安装,可能会增加构建时间。
使用以下命令进行安装:
dotnet tool install -g dotnet-format

要在当前目录中格式化当前项目或解决方案,请使用:

dotnet format

仅修复代码风格分析器警告,您也可以使用此命令:

dotnet format --fix-style warn

完整的命令列表可在项目的GitHub上找到。

Azure DevOps云服务器上可以安装自定义工具吗?除了运行任务外,我认为不能在构建服务器上安装自定义应用程序。 - PoorInRichfield
是的,您可以在管道中使用步骤将它们加载到容器中。这是我在我的管道中使用的工具。dotnet命令行实用程序已经加载,因此您只需要添加工具,而不是整个二进制文件。 - Martyn C

2
在我看来,触发构建的提交应该是不可变的。如果你添加了一些格式化代码的内容,你需要推送一个新的提交到仓库中以实际纳入更改。因此,你是否要再次触发CI构建呢?
我的建议可能是将格式化工具自动化为流水线的一部分。如果它发现任何将被更改的内容(意味着有人在推送到远程之前没有运行该工具),则会使构建失败。让通过测试的构建成为合并拉取请求的必要条件。如果人们不能通过正常流程完成工作,他们就会排队等候。在流水线中配置的设置将成为标准,这样就可以解决开发人员选择制表符或空格的问题。:)
Code Maid可能不是最佳选择。我看到一个关于它在命令行自动化方面不太好的GitHub票证。它与Visual Studio相当紧密地耦合。此外,它可能需要一些较大的努力,但我想你会希望有人对整个源代码运行格式化,以便每个人都可以从头开始。

2
我非常确定我已经使用Resharper完成了这个任务。 - Matt
1
越想,我越同意你的观点,Matt。也就是说,改变代码格式会在构建时需要一个新的Git提交,这会有些奇怪。如果管道上有某种“门闩”,一旦检测到未运行格式化程序,就会使管道失败,那将是理想的。目前我正在使用CodeMaid,只因为它是免费的,而我的当前客户不会支付Resharper之类许可证的费用。 - PoorInRichfield
如果您在管道或编码单元测试中无法运行CodeMaid,可以对StyleCop进行评估。我相信它是开源的,并且与c#配合得很好。 - Matt
在Pull或Merge请求中需要额外的提交。许多开源社区都这样做,这是可以接受的。尽管如此,他们所做的是设置一个检查器,如果有格式问题就会失败。但是他们有机器人来触发新提交的格式化。 - Pato Sandaña

0
我认为更好的解决方案是在Azure DevOps中设置一个管道任务,作为构建过程的一部分运行Code Maid等工具。这将确保没有丑陋、未格式化的代码进入源代码控制,并确保所有代码都按照构建过程中启用的标准进行格式化。
Azure DevOps没有这样的管道任务来格式化文件。而且在管道运行期间更改git仓库不被推荐。
正常情况如下:
1.我们在Azure DevOps中托管了git仓库,有人正在本地使用dev分支进行开发。
2.有人进行了一些更改并提交了更改(修改代码或添加额外的源文件)。
3.同步提交到远程仓库,远程仓库中的更改触发相应的管道运行。(CI检查代码是否正确,CD用于部署新更改)

现在如果你在管道过程中修改源文件,将会导致无尽的触发,除非你禁用CI。相反,你可以使用分支策略来改进该过程,你可以为主分支设置分支策略。因此,任何通过PR对主分支进行的更改都应该得到审核人员的批准。而特定的评审人员可以帮助检查代码格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接