从 Mac 下的包管理和安装工具说起( 二 )


在 JavaScript 的世界里最常用的是 NPM 。事实上 , 不管是外界的什么工具 , 在 JavaScript 的世界里 , 总是能找到相应的一份 。后来了解到了它的一个替代工具 , 叫做 Yarn , 。有趣的是 , 似乎 JavaScript 社区内部要友善得多(跟“同源”有关系?) , 你可以通过 NPM 安装 Yarn , 看起来竞争对手其实也不是那么讨厌对吧——错了 , 你有本事通过 Homebrew 安装 MacPorts 试试?
Java 的话则是 Maven , 而如同前面的划分一样 , 它的前身 , 也是没有服务端功能的弱化版本是 Ant 。印象中还用过一个 Gant , 好几年前写过 一点点东西。
不过相较于这些 , 我倒想重点说说 Python 世界里的的 pip 。
说这个是因为最近跟 Python 干上了 , 项目的原因 , 我也是被迫 今年开始学的 Python 。
最近知道一个很有意思的事情 , Google 的搜索指数上看 , Python 已经成功登顶 了 , 可谓最火的语言:
可是去传统的 TIOBE 看看 , 哪有啊 , 势头不错 , 但是距离登顶还远着哪:
其实谁都没有问题 , 这里恰恰反映了一个有趣的事实 , Python 未必是最流行和使用最广泛的 , 但却是特别需要”use the fucking Google” 的 , 或者说 , 有很多人在使用 Python 的时候 , Google 一下去寻找某一个 Python 问题的解决方案 。
想起来我们的项目也多为 Python 完成 , 有的项目代码规模还不小了 , 这里面五味杂陈 。既有代码简洁、直接 , 执行容易 , 和 Linux 脚本亲和度高的好处 , 也有从工程上看零零散散 , 缺乏有效规划、组织、测试等等的问题 。发自内心地感受 , Python 是如此地便捷 , 可我依然不觉得 Python 是“正规军” 。随着规模的增大 Python 代码带来的风险和 Java 之类的传统货比起来 , 还明显让人不放心 。
呃 , 抱歉……好像又扯远了 。
【从 Mac 下的包管理和安装工具说起】现在回到 pip 上面 。讲到 pip 必须提一提 easy_install 。pip 始于 2008 年 , 而 easy_install 始于 2004 年 , 二者的关系就如同 Yum 和 rpm 一样 , 是后者的替代品 , 功能更强大 , 但最重要的一点是有了服务端的支持——对版本库的支持和依赖的解决 。下面这张表来自于 PyPA 的这个链接。
在实际项目中 , 我们把 Python 的包仓库配置到公司内部的服务器 , 然后在需要的时候根据 requirements.txt 的内容下载依赖包:
pip install -r requirements.txt一个更全面的执行过程是:
virtualenv venv;
source venv/bin/activate;
pip install --trusted-host=artifactory.xxx.xxx -i https://artifactory.xxx.xxx/api/pypi/global-release-pypi/simple -U xoxo -r requirements.txt;

其实 , 这些工具对于包的仓库、依赖、冲突解决、依赖树生成、版本比较、状态迁移、本地替换等等功能支持得有强有弱(似乎多数包管理工具指支持到这个列表的仓库和依赖 , 可能还加上简单的状态迁移 , 而其它的功能都不支持) 。老实说 , 到现在为止我觉得最强的包管理工具还是 Amazon 内部的 Brazil(而且比其它强很多) , 很可惜它并不开源 。关于这方面的机制 , 大有文章可做 , 以后有机会再讲 。

推荐阅读