Hack: 支持多个repo的cyg-apt

原本是为了在Cygwin下面安装deepgrep这个工具(见介绍 deepgrep: grep nested archives with one command ),但我发现自己编译它有点麻烦,然后又发现Cygwin Ports这个非官方仓库里面有这个strigi包。

但这个strigi包的依赖又有点多,用cygwin setup下载很有点受不了:cygwin setup缺省会下载所有的更新,虽然可以选择不管它们,但界面操作起来可有点麻烦,本来一次性麻烦一点也就罢了,但因为这个镜像很不稳定,一旦在某个包上卡死,或者发现它正在下某个我不想下载的大软件包(比如emacs24),就得重来。。。

也试用了apt-cyg-multi,但它不支持跨repo的包依赖,比如这个strigi的依赖里有几个包是在官方仓库里的,而我没有安装,它就一会儿又报告一个错误,我把缺的安装上了,再跑它,它又报告一个错误,我又得去装缺的那个。。。

算了,还是自己动手吧,看了一下apt-cyg-multi的代码,用bash写的,我觉得可读性不是太好,调试也比较麻烦,不想在这个上面改。

于是又拿起了自己简单修改过的cyg-apt,是python写的,bootstrap代价有点大,但对我而言python是必装的,也不是大问题了。

完成的代码在这里: http://code.google.com/p/bamanzi-misc/source/browse/trunk/cygwin/cyg-apt,还没有在cyg-apt原项目网站上提交patch。

支持多repo的方法是在~/.cyg-apt里面添加一个mirrors配置项,格式为python的dict格式,例如:

mirrors = { 'main': 'http://ftp.cn.debian.org/cygwin', 'ports': 'http://downloads.sourceforge.net/cygwin-ports' }

然后执行:

cyg-apt update
cyg-apt install strigi

就等着安装完成吧。

(不过,尚不支持同一类仓库的多个mirror——如果想一个mirror连不上时,转向另一个mirror去下载,目前是不支持的。因为我觉得暂时没有太大必要,因为在~/.cyg-apt里换一个mirror就是了,至于原来下载下来的包虽说是按mirror url分目录存放的,但手工挪一下倒也不难)

另外,我改掉了cyg-apt原本每次都去自动更新setup.ini的行为,改为cyg-apt update时才更新,这跟Debian apt-get的行为一致 —— 不过cyg-apt原本的对某些子命令(比如install)会自动更新setup.ini行为并未删除,而是改到配置项auto_update(或者命 令行选项'-a')上了。

posted @ 2012-09-08 22:22  巴蛮子  阅读(1317)  评论(1编辑  收藏  举报