注:标题中「Fabric」指的是 Fabric( http://www.fabfile.org ),一个 Python 社区常用的远程/本地自动化执行工具。
讲 Fabric 之前,先讲讲我的 Python 开发环境。
- 很久以前,那会还在用 Python 2,Fabric 也是 Python 2 环境下的,当时我基于 Fabric 写一些部署和自动化脚本,很方便,也没有什么问题;
- 去年,我把我的生产环境都升级至了 Python 3,当时发现了 Fabric 不支持 Python 3,它是一个 Python 2 Only 的工具。当时搞了一个最简便的方式继续使用 Fabric——在 virtualenv 环境内跑我的 Python 3 环境,在 virtualenv 环境外,继续用 Python 2 执行 Fabric 脚本。两者继续相安无事。
然而最近,麻烦来了…我不一小心,通过 homebrew 把 Fabric 升级了,升级到了 Fabric 2,一个好消息是,它支持 Python 2 & Python 3 了,一个坏消息是,它是重写的版本,不再兼容 1.x 版本的 fabfile,这意味着我得重写我的部署脚本们。
由于我暂时不想花那么多时间去基于 Fabric 2 的新规范去重写我的 fabfile,但又想要项目能尽快运行起来,咋办?我想到用 homebrew 安装旧版本的 Fabric,发现不方便。似乎只有一招,就是继续用 Python 2 安装 fabric 1.x 版本然后运行的方式了。
就在我决定用这招时,我发现了一个能运行在 Python 3 上的 Fabric 1.x 的 fork:
PyPI 上有三个 Fabric 相关的包,这里我总结一下:
- Fabric,当前版本号 2.0.1,也就是目前最新的,官方的 Fabric 2.0.1,兼容 Python 2 & Python 3,但不兼容 Fabric 1.x 的 fabfile;
- fabric2,当前版本是 2.0.1,和前面的 Fabric 实际上是一样的。为啥要提供这么一个包?为了平滑迁移,也就是说,当你为了让 1.x 和 2.x 共存时,可以继续用 Fabric 的包安装旧的版本,然后用 Fabric2 的包作为新版本。
- Fabric3,当前版本是 1.14.post1,是一个基于原来的 Fabric 1.x 的 fork,兼容 Python 2 & Python 3,兼容 Fabric 1.x 的 fabfile。
你可能被上面的总结绕晕了…没事,Python 社区就是这样,Python 2 和 Python 3 估计还要共存两年呢。
总之,如果你想向我一样,继续用 Fabric 1.x 的 fabfile(暂时不想改),又因为项目已经是 Python 3,那么现在在 virtualenv 环境中,统一安装 fabric3 这个包就可以了。
同时,可以再安装一个 fabric2,然后慢慢地把 fabfile 迁移至新的格式。但这是后话了。
希望没有 Python 2 的世界早日到来!