热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

除掉构建脚本中的气味

文章标题:除掉构建脚本中的气味。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类
    您把多少时间花在维护项目构建脚本上?也许远远超出您预期的或者可以忍受的时间。其实大可不必遭受如此痛苦的经历。在这一期的让开发自动化 中,开发自动化专家 Paul Duvall 将演示如何改进很多常见的妨碍团队创建一致的、可重复的、可维护的构建的实践。

    当描述代码之类的东西时,我不喜欢 “气味(smell)”这个词。因为用拟人的手法来谈论比特和字节往往令人觉得很怪异。并不是说“气味”这个词不能准确地反映出某种表明代码可能有错误的症状,只是我觉得这样听起来很滑稽。然而,我依然选择再次用这种令人厌烦的方式来描述软件构建,坦白说,这是因为这些年我见过的很多构建脚本都散发着难闻的气味

    在创建构建脚本时,即使是伟大的程序员也常常会遇到困难。就好像最近才学会如何编写程序性 代码似的 —— 他们还会编写庞大的单块构建文件、通过复制-粘贴编写代码、对属性进行硬编码等等。我总是很想知道为什么会这样。也许是因为构建脚本没有被编译成客户最终会使用的东西?然而我们都知道,要创建客户最终使用的代码,构建脚本是中心,如果那些脚本败絮其中,那么要想有效地创建 软件,就需要克服重重挑战。

    幸运的是,您可以轻松地在构建(不管是 Ant、Maven 还是定制的)之上部署一些实践,它们虽然可以帮助您创建一致的、可重复的、可维护的构建,但其过程会很长。学习如何创建更好的构建脚本的一种有效的方法是搞清楚哪些事情不要 去做,理解其中的道理,然后看看做事的正确 方法。在本文中,我将详细论述您应该避免的 9 种最常见的构建中的气味,为什么应该避免它们,以及如何修复它们:

  • 惟 IDE 的构建
  • 复制-粘贴式的编写脚本方法
  • 冗长的目标
  • 庞大的构建文件
  • 没有清理干净
  • 硬编码的值
  • 测试失败还能构建成功
  • 魔力机
  • 格式的缺失
关于本系列
作为一名开发人员,我们的工作就是为用户将过程自动化。然而,我们当中有很多人却忽视了将我们自己的开发过程自动化的机会。为此,我编写了 让开发自动化 这个系列的文章,专门探索软件开发过程自动化的实际应用,并教您何时以及如何成功地应用自动化。

    这里无意给出完整的列表,不过这份列表的确代表了近年来我读过的和写过的构建脚本中,我遇到的较为常见的一些气味。有些工具,例如 Maven,是为处理与构建有关的很多管道而设计的,它们可以帮助减轻部分气味。但是无论使用什么工具,还是有很多问题会发生。

避免惟 IDE 的构建

    惟 IDE(IDE-only)的构建是指只能通过开发人员的 IDE 执行的构建,不幸的是,这似乎在构建中很常见。惟 IDE 的构建的问题是,它助长了 “在我的计算机上能运行”问题,即软件在开发人员的环境中可以运行,但是在任何其他人的环境中就不能运行。而且,由于惟 IDE 构建自动化程度不是很高,因而为集成到持续集成(Continuous Integration)环境带来极大的挑战。实际上,没有人为的干预,惟 IDE 常常无法自动化。

    我们要清楚:使用 IDE 来执行构建并没有错,但是 IDE 不应该成为构建软件的惟一环境。特别是,一个完全用脚本编写的构建,可以使开发团队能够使用多种 IDE,因为只存在从 IDE 到构建的依赖性,而不存在相反方向的依赖性,如图 1 所示:


图 1. IDE 与构建的依赖关系
IDE 与构建的依赖关系

    惟 IDE 的构建有碍自动化,清除的惟一方法就是创建可编写脚本的构建。有足够的文档和太多的书籍可以为您提供指导(见 参考资料),而像 Maven 之类的项目也为从头开始定义构建提供了极大的方便。不管采用何种方法,都是选择一种构建平台,然后尽快地让项目成为可编写脚本的。

复制-粘贴就像廉价的香水

    是软件项目当中一个常见的问题。实际上,甚至很多流行的开放源码项目都存在 20% 到 30% 的。代码复制令软件程序更难于维护,同理,构建脚本中的也存在这样的问题。例如,想象一下,假设您需要通过 Ant 的 fileset 类型引用特定的文件,如清单 1 所示:


清单 1. 复制-粘贴 Ant 脚本


  
  


    如果需要在其他地方引用这组文件,例如为了编译、检查或生成文档,那么最终您可能会在多个地方使用相同的 fileset。如果在将来某个时候,您需要对那个 fileset 做出修改(比如说排除 .groovy 文件),那么最终可能需要在多个地方做更改。显然,这不是可维护的解决方案。然而,要除掉这股气味其实很简单。

 

[1] [2] [3] [4] [5] 下一页


推荐阅读
  • 在近期的百度大数据开放会议上,计算机科学领域的专家怀进鹏教授的演讲引发了广泛关注。尽管演讲内容高深复杂,但对于那些对计算机科学和人工智能领域有所了解的人来说,这场演讲无疑揭示了未来技术发展的无限可能性。 ... [详细]
  • Android json字符串转Map
    Androidjson字符串转Map,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文探讨了如何利用脚本文件高效管理Oracle数据库,包括脚本文件的创建、编辑及运行方法,旨在为数据库管理人员提供实用指导。 ... [详细]
  • 探讨了一个关于Windows C++开发中遇到的乱码问题,特别是在处理宽字符时出现的情况。本文通过一个具体的示例——一个简单的窗口应用程序,展示了如何正确地使用宽字符以避免乱码。 ... [详细]
  • 十大排序算法JavaScript实现总结
    十大排序算法JavaScript实现总结,Go语言社区,Golang程序员人脉社 ... [详细]
  • 自从踏入编程领域,设计模式这一术语便频繁出现在耳边。初听时或许感到陌生且高深,但随着经验的积累,逐渐意识到其重要性。本文旨在探讨设计模式的基础知识及其在实际开发中的应用价值。 ... [详细]
  • 评估Kotlin的学习价值及其在大厂面试中的作用
    本文探讨了Kotlin这门编程语言的学习必要性,并分析了其在移动开发领域的地位,特别是在求职大厂时的影响。 ... [详细]
  • 本文将详细介绍Linux系统中的两种主要软件包类型——二进制包和源码包,探讨它们的特点、优势及局限性,帮助读者更好地理解和使用Linux软件包管理系统。 ... [详细]
  • 本文详细介绍如何在Ubuntu 14.04系统中配置GTX1060双显卡,并重新安装显卡驱动。包括下载驱动、切换到开源驱动、卸载旧驱动以及安装新驱动的具体步骤。 ... [详细]
  • 本文探讨了Go语言(Golang)的学习价值及其在Web开发领域的应用潜力,包括其独特的语言特性和为什么它是现代软件开发的理想选择。 ... [详细]
  • 本文档提供了数据结构在C语言中的实现示例,特别是解决二次方程的代码片段,以及《数据结构(用面向对象方法与C++语言描述)第二版》的部分习题答案。 ... [详细]
  • 本文探讨了在多媒体软件开发中处理大型WAV音频文件的策略。由于Windows提供的`sndPlaySound` API仅适用于小文件,对于大型WAV文件,我们介绍了使用MCI(Media Control Interface)命令的一种有效解决方案。 ... [详细]
  • Mario Peshev,自1999年起从事编程工作,现任DevriX首席执行官。本文最初发布于Quora,探讨了计算机技术与编程语言的区别及其对软件开发的影响。 ... [详细]
  • 深入探讨程序员的职业特点、生活状态及发展前景,为有意从事此行业的读者提供实用建议。 ... [详细]
  • 本文探讨了Java异常处理的本质,提出了设计模式以优化异常处理,并分析了在AOP模型中异常处理的应用。文章强调了正确使用Java异常对于提升代码质量和维护性的关键作用。 ... [详细]
author-avatar
杰杰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有