大型项目代码格式化的最佳实践

时间:2009-12-23 21:48:56

标签: java maven-2 coding-style hudson maven

我维护了一个大型Java EE / Maven / Hudson / Perforce项目的构建版,其中约有20名开发人员遍布全球。

代码格式化的就地解决方案是在开发人员运行构建时使用Jalopy格式化代码库,从而确保在签入之前格式化任何未格式化的代码。

此解决方案的主要问题是,如果开发人员在签入之前没有运行完整的Maven构建(比如他们从Eclipse运行单元测试),则他们的代码将不会被格式化。然后,编辑该文件的下一个开发人员在运行格式化程序后可能在代码的不相关部分中有许多差异。

在大型项目中,哪种源格式化策略最适合您?我考虑过的另一个选择是使用自动化过程进行夜间格式化。

8 个答案:

答案 0 :(得分:16)

Maven构建应该只使用Checkstyle之类的内容报告格式错误,而不是自动格式化代码。这就是你的描述似乎意味着什么。这样就可以在构建时向开发人员/ Hudson报告错误,并且可以根据需要解决这些错误。

我还建议使用像Sonar这样的工具来记录格式错误的历史记录(请参阅他们的时间机器功能)。

答案 1 :(得分:14)

为了使项目具有一致的格式,您需要配置工具以自动执行。我建议如下:

Eclipse Formatter

对于Eclipse,在Preferences(Java-> Code Style-> Formatter)中有一个选项,您可以在其中配置您希望如何格式化项目。创建一个新的配置文件并将配置放在那里。

完成后,会有一个导出功能(很好地隐藏,点击编辑,然后点击导出)。将配置传递给团队的其他成员,以便可以导入它。

Eclipse保存操作

仍然配置格式化程序并不能保证开发人员在提交之前会格式化代码,因此您需要配置自动格式。

再次转到首选项(Java-> Editor-> Save Actions)并选择Format Source Code。这样,在保存文件时格式化代码。

Eclipse Checkstyle插件

有些开发人员可能会忘记正确执行这些步骤,因此您需要一种方法来找到它。

安装Eclipse的Checkstyle插件:

安装插件后,您可以为其创建配置。然后可以为团队的其他成员导出配置,甚至可以更好地上传到服务器并远程引用配置。

具有远程配置的优点是您还可以通过maven-checkstyle-plugin引用它,它可以通过在CI服务器上启动它来为您提供报告。

如果你想成为核心,你可以将基本配置(由格式化程序自动完成的配置)设置为错误而不是警告,以便具有错误配置的eclipse的开发人员在提交之前看到错误。

预先配置的Eclipse

如果你想进入下一个级别,你需要创建一个预配置的eclipse,并将该版本分发给开发人员,这样他们就不需要做任何事情。

副作用奖励:您可以避免开发平台上的版本不一致。配置管理不仅仅是源代码,也是开发工具。让事情更容易预测。

答案 2 :(得分:6)

处理这种情况的一种方法是使用JalopyJIndent甚至Eclipse内置代码格式化程序(可以{{3})格式化预提交钩子中的代码})。 AFAIK,如果您无法强制人员在提交之前运行自动构建,这是确保版本化代码始终正确格式化的唯一方法。但我不知道Perforce是否支持预提交挂钩。

如果没有,另一种选择是在构建时使用invoke from the command lineJalopy Maven Plugin并在规则被破坏时使构建失败(并让CI引擎报告) 。为化妆品制造失败可能会非常烦人。

因此,确实,运行夜间进程来格式化代码可能是另一种选择。在这种情况下,Maven Checkstyle Plugin或其他提到的工具可能会对您有所帮助,如果您想使用Maven或不使用Maven,它实际上将取决于此工作。

答案 3 :(得分:2)

如果所有(或大多数)开发人员都在使用Eclipse,您可以导出格式规则并将操作保存到团队的喜好中,并让每个人共享相同的首选项。

答案 4 :(得分:2)

我见过的最佳解决方案是CXF采用的方法,详见 Connecting Maven, Eclipse, Checkstyle, and PMD

他们使用另一个回复中提到的Eclipse-cs插件Dimitris将checkstyle与Eclipse集成在一起。这允许Eclipse在代码破坏任何代码格式化规则时生成错误。它们还将checkstyle与Maven集成在一起,因此如果验证步骤不符合checkstyle规则,则验证步骤将失败。它们还在Eclipse中定义了一组冗余的自动格式化规则,这样可以轻松快速地格式化将通过checkstyle标准的代码。

这意味着Eclipse的许多配置。他们通过整合一组Maven插件来自动执行此步骤,这些插件将生成特定于CXF的工作空间,其中包括必要的checkstyle / autoformatting配置。

答案 5 :(得分:1)

您是否可以在Perforce中设置签入规则以格式化签入时的代码?我没有使用perforce所以我无法评论 - 但是当我们讨论团队中的代码格式化执行选项时,我们认为这是合适的。

答案 6 :(得分:0)

这可能没多大帮助,但是Go language source tree会使用他们设置的命令行应用自动格式化您推送的内容。它是在Mercurial中完成的,而不是Perforce。但是,也许你可以看到他们是如何做到的。详细信息必须位于golang.org

答案 7 :(得分:0)

如果正确的格式对您来说很重要,那么将Perforce配置为在签入时执行自己的格式化运行,如果源文件的格式化版本与提交的格式不同,则告诉它拒绝提交。

我个人只是使​​用Eclipse Save Actions,并告诉它在保存时重新格式化。对我们来说足够好了。