第九章 管理真实的程序(五) -分发包

分发包

分发包就是由数据和模块组成的集合,它是发行、测试和安装的基本单位。遵循CPAN的约定可以最容易地实现分发包的配置、构建、打包、测试和安装。这些约定涵盖了如何打包发行、如何解决依赖问题、代码和文档应该安装到哪、如何验证分发包是否能正常工作、如何显示文档、如何管理存储库(repository)等等内容。成千上万的贡献者从数十万计的实际项目工作经验中总结出了这些指导内容,掌握了这些我们就站在了前人的肩膀上。

分发包要在不同的Perl版本、不同的硬件平台上进行测试,为了完成这些工作光上传就需要花费好几小时,如果测试发现了错误还得报告给作者---然而,只要你的分发包遵循了CPAN约定所有这些工作都可以自动完成!CPAN是Perl的秘密武器。

出于某些原因,你可能不希望以公共CPAN分发包的方式来公开发行你的代码,但这并不妨碍你利用CPAN工具和CPAN约定来管理你的代码(意思就是使用CPAN的工具并不强制你一定要公开自己的代码)。Perl社区有着强大的基础设施,要好好利用它。

分发包的属性

分发包除了有模块,还包含有一些其他的文件和目录:

  • Build.PL或Makefile.PL
    这是一个控制着配置、构建、测试、捆绑、安装等过程的程序
  • MANIFEST*
    上面记录着分发包的文件清单。有助于验证包的完整性。
  • META.yml或META.json
    里面记录了分发包的依赖信息和一些元数据。
  • README
    一些描述信息,可能包含分发包的作用、意图、版权和许可信息。
  • lib/
    模块的目录
  • t/
    测试文件的目录
  • Changes
    记录了分发包的重大变化。

一个好的分发包必须包含一个唯一的名称和版本号(通常来自包的主模块),任何你从CPAN下载的分发包都符合这个标准。公共服务CPANS会评估每一个上传包是否违反了标准约定。注意,CPANS并不涉及代码行为,它是为了让你的分发包适用于CPAN工具。

管理分发包的CPAN工具

Perl核心包含了几个用于管理分发包的工具:

  • CPAN.pm是正式的CPAN客户端。默认的,客户端会从公共库CPAN来安装发行包,当然你也可以配置成指定的库来代替或补充公共库(CPAN)。
  • ExtUtils::MakeMaker是个复杂但好用的工具,用于打包、构建、测试和安装分发包,它和Makefile.PL一起工作。
  • Test::More用于编写自动化测试,使用最广泛的基础模块。
  • TAP::Harness和prove用来运行测试,解析和报告测试结果。

另外还有一些非核心的模块也很有用:

  • App::cpanminus是一个无需配置的CPAN客户端,它可以处理最常见任务,使用很少的内存并且运行得很快。
  • App::perlbrew可以帮助你管理多个Perl版本。
  • CPAN::Mini和cpanmini命令允许你创建自己的CPAN镜像。你可以将自己的分发包放到私有镜像库里面,还可以进行版本管理。(有些情形下非常有用,比如针对自己公司指定哪些版本可用)
  • Dist::Zilla可自动执行一些分发包相关任务。利用Module::Build或 ExtUtils::MakeMaker进行工作,避免你直接使用它们。这里有相关的教程:http://dzil.org/
  • Test::Reporter报告分发包自动化测试的结果,给作者提供更详细的故障细节。
  • Carton和Pinto是2个新项目,它们旨在帮助你管理和安装代码的依赖。尚未被广泛使用,处在积极的开发中。
  • Module::Build功能和ExtUtils::MakeMaker一样,但停止维护了。

设计分发包

如何设计一个分发包?关于这个问题可以单独写一本书了(如《Writing Perl Modules for CPAN》),但也有一些设计原则可能会对你有帮助。可以从使用工具开始,如Module::Starter或Dist::Zilla。一开始就学习配置和规则可能有点难度,但是很有意义,这样就可以保证始终方向正确(这些知识永远不会过时)从而避免做乏味和繁重的无用功。

分发包应该遵循这些原则:

  • 每个分发包有单一而明确的目的。可以将若干个相关的发行包绑定到单一的包中;也可以将你的软件分解成不同的分发包以便管理各自的依赖关系和保持封装性。
  • 每个分发包包含单一的版本号,且版本号总是增长的。
  • 每个分发包提供良好的API,同一个自动化测试套件可以适用于不同版本的分发包。如果你使用本地CPAN镜像来安装你自己的分发包,那就可以重用CPAN的基础设施来测试分发包及依赖,这样就能方便地进行测试集成。
  • 分发包的测试是有用的、可重复的。CPAN基础设施提供了自动测试和报告功能,赶紧用起来。
  • 接口要是简单而有效的。要避免使用全局符号和默认导出:允许别人只使用他们想要的部分,不要污染他们的名字空间。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,565评论 6 525
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,696评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,935评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,327评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,338评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,760评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,085评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,091评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,656评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,657评论 3 348
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,767评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,360评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,088评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,493评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,654评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,374评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,841评论 2 367

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,756评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,495评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,881评论 6 342
  • 下午的时候,朋友叫我出去看电影,我二话没说,果断跑过去。心中还在盘算,如果我做公交车,路上可能会堵车,还得需要等,...
    陈效林阅读 327评论 0 0
  • 1.什么是JSON?  JavaScript 对象表示法(JavaScript Object Notation),...
    work1Y阅读 324评论 0 0