现在的位置: 首页 > 综合 > 正文

一个“dirt simple”download-and-install CPAN的副本

2014年04月26日 ⁄ 综合 ⁄ 共 2338字 ⁄ 字号 评论关闭

Wednesday, May 25, 2005

A "dirt simple" download-and-install CPAN clone

 

似乎CPAN副本(clone)要推迟发布了。昨天,Ian Bicking在这发布一则消息称他正在开发自动化下载工具。而今天便有了一个关于UragaPlanet Python帖子某些人正在开发的一个CPAN副本。

于是我想到一个问题,这个东西到底能简单到什么程度?我和Bob Ippolito曾讨论过关于使用eggs进行这方面开发的事,目标是使其生成一些能告诉人们在哪里下载的manifest文件。然而就今天而言,已有一些“manifest文件”发布到网上而且应用得很好,即网页和目录列表。例如,SourceForge下载页面里包含了很多跳转到含有“SomePackage-1.0.zip”一类网址的链接。由于Python egg文件名也包含了Python版本和相关平台的信息,你要做的是找到链接里所包含的文件只需解析HTML页面然后进行跳转就行了。

为了试验这个理论的实用性,我到PyPI上随即抽取了43个页面,研究了他们的下载链接。得到如下结果:

 

l         15个包没有下载网址

l         2个包有跳转到了它们主页的下载网址而没有直接下载文件的链接

l         10个包有直接指向.zip, .tgz, .tar.gz, .tar.bz2文件且文件名含有版本号的下载网址

l         10个包有跳转到含有HTML目录列表并列出了不同版本文件链接的下载网址

l         6个包有跳转到“最新版本”(不包含确切版本号)归档(archive)或.py文件的下载网址

 

总之,大约一半的包本可以通过对指定版本号进行蜘蛛搜索(spider hunting)来完成处理。而这其中有一半可以通过简单地添加.egg文件到它们的下载列表就完成了。真有趣啊。

当然,不是所有的包发布者都愿意为不同平台制作eggs,所以一个真正实用的工具可能需要能够下载源归档文件(source archive)然后构建成一个egg

现在你可能要问了,为什么要构建一个egg?你如果非要从源文件中构建的话,为何不直接安装这个包呢?这是因为eggs—即使是未打包的会使你在系统中保留一个包的多个版本然后在运行时激活它们。

所以现在我就想,或许对于distutils还应该有个install_egg命令,它为你基本完成了构建egg和在site-packages中安装。之后我们就可以将它用在假想的PyPI蜘蛛中以制作一个完整的fetch-and-install工具中。

一旦我们有了这个东西,就会有人想要做出一堆可用的包作为他们平台的eggs。他们只需运行这个fetch-and-install将其安装到可访问的web目录中,而该目录的内容会以列表的形式呈现出来。现在,那个将目录的网址添加到其蜘蛛的搜索网址中的人就将能找到并下载所需的预构建eggs,而不用再作任何构建。

这开始听起来就像每个人都在试图做一个厉害的抽签,不是吗?那么我们需要的架构组件又是什么呢?

 

l         “阅读器”:一个HTML阅读器,可以扫描一个网页中含有符合标准distutils命名规范的名字的eggs/或源归档的链接

l         “探测器”:一个工具,用于获得一系列候选的起始网址并调用读取它们的阅读器来搜索指定的包从而抓取得出的索引数据

l         “源目录”:一个工具,由已知包名从PyPI中搜索下载URL并判断该传递给阅读器的是归档还是链接

l         “获取器”:已知欲得到的包,该工具询问探测器和源目录,尝试下载适用于平台的egg,回退搜索源归档并构建一个egg

l         “构建器”:已知源归档网址,对其进行下载和提取,找到setup.py并构建/安装egg

l         一些确定该构建/安装哪个版本的包的方法,若有多个版本可用(如,只选择稳定版)

 

有趣的是,完成根据合理的外部链接深度在PyPI中进行爬行之后,可能只需使已有的Python web蜘蛛重新确认去做这一大堆事情就能构建一个指向下载URL的包+版本的索引。实际上你可以使用这个蜘蛛创建一个包含所有下载链接的简单的HTML页面。

有了egg运行时的已知性能,且假设一个已有的解析HTML的蜘蛛(或浏览器的仿真器)可以获取和解析并能完成所有东西的配置。对我来说似乎还有很多策略方面的问题,从琐碎的(将egg放在哪)到重要的(允许哪个版本?代码签名?校验和?有哪些信任的下载站点?)

然而我认为所有这些之中最有意思的就是,从某种程度上说我们已经有了一个CPAN:它叫做web。现在我们所需的是有一个足够聪敏的客户来使用它。 :)

同时,我实际已挤出一些时间和精力放在Python Eggs和对应的文档工作上了。虽然现在目录扫描、依赖性管理甚至是名字空间包等特性中的某些部分才进行到最小化测试,但毕竟它们都已实现了。而文档尽管还有很多部分要完成也算经历了一次重点修补,而尚未完成的只是去解释利用当前运行时版本可以做哪些事情。

 

补充:我为"mechanize" 和它的依赖性构建了eggs,发现它只是用一些代码来获取并分析下载目录的链接,比如PEAK项目下载目录或一个Sourceforge文件列表。当然,实际的列表下载和分析会比较慢,所以一个“满足最终用户质量”的下载工具可能需要做大量细致的工作来使其运行过程更友好,尤其是对于像我这类没耐性的人而言。

 

(原文链接网址:http://dirtsimple.org/2005/05/dirt-simple-download-and-install-cpan.html 

抱歉!评论已关闭.