我对支持软件开发过程的工具非常感兴趣,这些工具会自动生成无聊的内容。 Walkmod是一个可以朝这个方向发展的系统,它是一种智能工具,可以重构Java项目并强制执行代码约定。 它是一个非常强大的工具,应该引起越来越多的关注。
TL; DR:像Sonar这样的工具会在您的代码中找到问题,Walkmod会为您解决
我有机会与首席开发人员Raquel Pau联系,因为我们都是JavaParser的贡献者。 我无法抗拒,所以我开始向她询问有关该项目的很多问题,我认为分享她的答案会很好。 因此,它们在这里。
在本文的结尾,还有一个示例,在JavaParser上应用walkmod来删除未使用的导入。
嗨,拉奎尔,您能告诉我们一些有关您自己和您的兴趣的事情吗?
我是巴塞罗那的一名软件工程师,我的兴趣与使用规范语言的软件建模,元模型转换,语言解释器和编译器有关。 除此之外,我还想了解人们如何通过艺术来解释自己的想法和激情。
您能告诉我们Walkmod试图解决哪个问题吗?
根据一组代码约定自动更正代码。
您认为在哪种情况下使用Walkmod有意义? 那仅适用于大型项目还是小型项目可以从中受益?
所有涉及多个开发人员的项目都可以从Walkmod中受益。 但是,很容易看出项目的规模直接影响了开发人员的数量。
这里有一些有趣的收养故事:
- 遍布世界的传播公司MetricStream在过去的10个月中一直在使用Walkmod,并且为WalkMod创建了自己的插件以自动重构代码。 他们主要感兴趣的是自动更正一系列声纳问题,并使用Walkmod能够更正数千行代码。 目前,他们正在努力在GitHub上发布其插件。 尽管是MetricStream的一部分,但是oughWorks在其一个开源项目中也使用了一些Walkmod库,这也有助于提高我们工具的质量。
- 另一方面,有咨询公司。 他们处于一个有趣的位置,因为他们与客户使用相同的代码库。 我知道其中一些人也使用过Walkmod (我不确定我能不能提到他们的名字 )。 在一种情况下,他们还开发了插件,以将Walkmod与其他工具(例如Gradle)集成在一起。
- 诸如JUnit,Guava,Arquilian和Apache项目之类的开源Java项目可以从Walkmod中受益匪浅,因为其中涉及到许多开发人员,并且它们始终在变化。 实际上,即使在某些文档中指定了某些代码约定,也很难对其进行管理和检查。 但是,我从他们那里了解到,在一次提交中将代码约定应用于整个项目(例如,根据其自己的规则应用Eclipse格式化程序)意味着要检查的代码过多,因此存在风险。 因此,他们拒绝此类提交。 实际上,这是当前版本的walkmod允许的主要原因:
- 为一组文件应用代码约定。
费德里科:我明白了。 是的,最近我一直在进行大量代码审查,当要审查的代码被与样式相关的许多次要更改所污染时,这很累人并且使人分心。 我可以看到自动应用这些更改并在代码检查期间仅检查实际更改的好处。 这将使生活变得更加轻松,并将更多的注意力转移到实际的更改上,而这些更改通常会被忽略,因为所有注意力都集中在运算符之间的空格数上,或者发现偶尔出现的制表符在一次提交中出现。
Walkmod与现有解决方案相比如何?
当前,公司控制人员正在使用PMD或Sonar应用自己的约定。 但是,这种软件只是检查是否满足规则,即使解决起来非常简单,也不会纠正代码。
另一方面,IDE具有一组通用的自动修复程序(例如,删除未使用的导入)。 但是,编辑器很多,每个人都有其喜欢的编辑器。 因此,特别是在开放源代码项目中,您不能阻止人们在推送代码之前不执行特定编辑器的快速修复。
Federico:酷,Walkmod不仅比编辑器中提供的更多自动快速修复功能强大,而且可以由命令行触发,并且即使每个人都在使用不同的IDE,它也可以在项目中保持一致。
定制和开发新转换有多容易? 我以前使用过QVT之类的M2M语言,它们很痛苦
我有设计模型到模型和模型到文本的转换(例如,使用ATL)的经验。 考虑到这种经验,我决定不将Walkmod与任何特定的转换语言结合使用。 我认为,如果我们希望人们通过代码转换为创建代码约定做出贡献,那么Walkmod不需要学习任何其他语言。 因此,我设计了3种方法来设计代码转换:
- 使用Visitor模式:人们只需要为要修改的type元素添加一个称为visit的函数。 之后,开发人员应将其访问者作为Java库上载到Maven存储库。
- 使用模板:许多Java开发人员都具有使用模板技术(例如JSP,Velocity,Freemaker或Groovy)的经验。 我们选择Grovy模板系统(GStringTemplateEngine)作为Walkmod的默认模板技术。
- 使用脚本: Groovy是Java开发人员首选的脚本语言,它易于与Maven集成。
谁应该进行转型? 应该是软件架构师,还是应该由单个开发人员来做?
约定应由项目负责人管理,但任何Java开发人员都可以创建转换。
您是否认为转换往往是非常普遍的并且可以在项目之间共享,还是更典型地针对项目?
我认为通常,软件体系结构是为特定项目配置或参数化的几种通用解决方案的组成。 因此,我认为,如果对转换进行了良好的编码,则它们往往是通用的,并且项目的代码约定包括配置这些通用转换。
Walkmod如何与其他工具集成? 它通常与Jenkins或Travis等CI工具一起使用吗?
Walkmod可以集成在Forge,Eclipse,Maven或Gradle中,并且可以在本地执行。 如果开发人员将Walkmod添加为Maven或Gradle插件并通过持续集成工具运行它,则可以在某些源文件未遵循其约定的情况下通知他们。
转换保留空白吗? 他们保留评论吗?
当前,Walkmod允许多种方式将更改应用到代码中:使用Eclipse格式化程序,或仅应用转换所进行的最小更改。 在第二种情况下,转换是防止空格的。
在解析过程中,所有注释始终保留为源代码的任何部分。
是仅基于AST进行转换还是知道符号解析? 我可以定义诸如“所有扩展该基类的类都应具有默认构造函数的规则”吗?
如果访问者类具有批注@RequiresSemanticAnalysis,则转换会意识到符号解析。 因此,在执行代码转换时,所有声明类型和表达式都具有节点所引用的反射元素( java.reflect.Class,java.reflect.Method,java.reflect.Field等 )。
将Walkmod用于其他语言(如Python或Ruby)有多困难?
Walkmod体系结构完全独立于编程语言,因为它可以通过插件完全扩展。 如果人们想使用另一种语言,则应该为过程的某些部分(例如,解析过程)创建带有实现的插件。
Walkmod是一个开源工具,您能告诉我们一些有关社区的信息吗? 您有什么样的用户? 您得到什么反馈?
Walkmod于2014年宣布推出,从那时起,我们的社区开始涉及MetricStream,ThoughtWorks和从事咨询服务的开发人员。
社区如何帮助Walkmod? 您是否需要更多插件,开发帮助,更多文档或更多有关WalkMod的成功案例?
主要是,我希望社区通过为Walkmod编写插件并分享他们的反馈来做出贡献。
Walkmod的未来有什么计划?
我们的计划是改善配置样式,使其更易于编写和创建新插件。 此外,我们正在围绕该工具创建服务。
您在开源方面的经验如何? 有负面还是正面的惊喜?
我对那些感谢您创建产品的人以及为解决他们的问题而给予的帮助的人感到非常惊喜。 我最好的体验是在Devoxx UK上介绍Walkmod,当时有个人亲自来对我说声谢谢,感谢我对为Walkmod创建Maven插件的支持,这是他几个月前报告的一个问题。
因此,希望这足以说服您开始使用Walkmod:下一步是访问www.walkmod.com并尝试一下!
示例:在JavaParser源代码上使用walkmod删除未使用的导入
好的,我们描述了walkmod的酷炫之处,列出了许多功能,等等。下面让我们来实践一下它的工作原理。
我首先从他们的网站下载walkmod(当前版本是1.2.0,可在此处下载 )。 我解压缩并设置了一些环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre
export WALKMOD_HOME=/home/federico/tmp/walkmod-1.2.0
export PATH=$PATH:$WALKMOD_HOME/bin
然后,我将walkmod配置为执行一项操作:删除无用的导入。 我刚刚在项目的根目录中创建了文件名walkmod.xml :
<!DOCTYPE walkmod PUBLIC "-//WALKMOD//DTD" "http://www.walkmod.com/dtd/walkmod-1.0.dtd" >
<walkmod>
<plugins>
<plugin groupId="org.walkmod" artifactId="walkmod-imports-cleaner-plugin" version="2.0" />
</plugins>
<chain name="example-chain" >
<reader path="/home/federico/repos/javaparser/javaparser-core/src/main/java" />
<transformation type="walkmod:commons:import-cleaner" />
<writer path="/home/federico/repos/javaparser/javaparser-core/src/main/java"/>
</chain>
</walkmod>
在这一点上,我要做的就是从项目的根目录运行walkmod apply :
花了一些时间来检索一些依赖项,但随后它很快通过了项目的源代码,并找到了三个要纠正的文件。 作为自然的反射,我进行了测试,并且都通过了:walkmod所做的更正是正确的。 然后,我检查了更改的文件,并发现walkmod重新格式化了文件,保留了所有注释(很好),但使用了三个空格的缩进,这让我很震惊。
幸运的是,自定义格式化程序的行为非常容易:打开walkmod-1.2.0 / config / formatter.xml并浏览属性以了解需要更改的内容。 例如,我对表格大小和缩进大小(以下两个屏幕快照中的两个属性值为3)感到不满意:
现在,如果要对一个简单项目使用walkmod,则只需更改适当的值即可。 如果您打算将其用于几个项目,这些项目具有不同的格式准则,这些准则将不起作用。 您可以改为在walkmod文件中指定一个前臂配置(有关详细信息,请参阅此处 )。
然后我想起了JavaParser对Eclipse有自己的格式配置,而Walkmod使用相同的格式,所以我只是在配置中指定了该文件的路径。 我恢复了对源代码的更改(以便恢复了重复的导入),然后重新运行Walkmod:我获得了正确的文件并且格式正确。
故事以新的Pull-Request发送到JavaParser结束:
我必须说,我对Walkmod的印象是非常积极的,我将定期使用它来确保代码正确格式化,并且不会在我与之合作的项目中产生混乱(例如未使用的导入)。
在最近的几天里,他们还启动了walkmodhub:它是一项可以用作GitHub的webhook的服务。 每次将一些代码推送到存储库中时,walkmod都会运行,如果违反了编码准则,则会向您发送“拉取请求”。 我想我会喜欢这个。