在我考虑如何构建一个dirt-simple CPAN的副本(clone)的不到两周时间,除脚本以外所有东西都即将要用上了。现在,安装一个Python包简单的就如同键入"easy_install SQLObject
",然后你可以就大声地宣布搞定了。干净地卸载或更新包也几乎是如此这般简单。
EasyInstall目前的版本号为 0.4a 1,所以对于许多特性我仍有一些工作要做。其中最重要的是脚本处理和自动化依赖安装(automatic dependency installation)。文档可以使用一个“让你的包与EasyInstall很好地配合”部分。而且我也很愿意做一些重构,使得它可以使用logging模块并支持可插入的下载器(pluggable downloaders),这也使得GUI或基于螺旋式(Twisted-based)的程序可以控制实际的下载过程。
在增加所有这些新特性的过程中,我也在刻苦钻研Python Eggs to-do list,还特别更新了Eggs开发者文档。我还想撰写一部分内容,关于使用Eggs创建插件应用程序框架(application plug-in architectures)并详述更多一些API的相关内容,但是事实上它应该已经是很好用的了。
所有要解决的问题之中最棘手的部分已在安装过程中被逐一地解决着。一旦EasyInstall有能力处理脚本,他便可以实现自我升级,而初始的安装程序可以通过过时的“setup.py install
”方法来完成,所以那是无关紧要的。(实际上,如果你有Python2.4并用“python -m easy_install
”来运行它,EasyInstall现在就可以自我升级。)
但是,那些依赖使用一个较新(或较老)版本的setuptools来完成他们自身安装的包该怎么办呢?那是一直在令我头疼的。包仍旧很迅速地变化着,这很难都告诉人们,“确保你安装了X版本的setuptool”。另一方面,如果你只是在安装脚本里“'import pkg_resources
”和“'require("setuptools>=
0.4a
1")
”,那么他将适当地以一个ImportError、DistributionNotFound或VersionConflict退出。或者你可以捕获那些错误并通过弹出一个要求用户安装(或升级)setuptools的信息来退出。我估计那大概才是处理它的最安全和完善的方法,我或许应当在文档页面里添加一些代码示例来说明如何去做。
与此同时在,我写这篇文章间歇的时候去尝试着了看能否找到一种方法来使setuptools/EasyInstall以一个egg来安装他自己,即使是你使用distitils第一次安装它的时候。唉,结果是distutil本身可以利用'extra_path
'的双参数形式(two-argument form)来完成这些。现在,setuptools的CVS版本使用一个'setuptools.pth
'文件进行安装,并被安装到一个名为'setuptools
-0.4a
1.egg
'的目录,因此创建了一个不带元数据的“poor man's egg”,然而其目录名字里面的信息足以使egg运行时系统(runtime system)能够把它当作一个真正的egg来对待。然后'setuptools.pth
'文件会确保包总是能够被导入,但它比'easy-install.pth
'的优先级要低一些。因此,如果你使用EasyInstall来升级setuptools,较新的版本将会过时,setuptools.pth
将变成一个相对无害的“剩饭”。
实际上setuptools的版本无论何时发生变化,每个已安装的版本和extra_path设置将仍会各自可用。唯一的问题是实际上你无法在运行时改变版本,这是由于有效的Python程序里面在重载模块时会总出些常见的问题。在将easy-install.pth文件改为指向setuptools新版本之后,egg运行时版本之间的更替将需要解释器的重启。然而,在内部使用EasyInstall到“更新插件(update plugins)”的应用程序一般将会在激活其他库的升级之前进行这样的重启,所以,那可能是无关紧要的:setuptools在那方面与程序的其他库相比将真的没什么差别。
Whew,只是利用Python标准库里面的东西就可以完成的事情有时候真的让我很吃惊。Setuptools和EasyInstall可进行zip和tarfile处理、HTTP下载、HTML抓屏、subversion checkouts以及一大堆其他事情。而到目前为止我只是花了两个周末在EasyInstall上面。
现在,开始有人问我为啥不早点写出来这些东西。:)
(原文链接网址:http://dirtsimple.org/2005/06/cpan-goodies-for-all.html)