转自:http://codingpy.com/article/a-better-pip-workflow-recommended-by-kenneth/

现在大家开发Python应用时,在代码库的根目录中添加一个requirements.txt文件已经成了标准实践。

这个文件用处挺多,一般有以下两种形式:

  • 项目的顶层依赖包清单(top-level dependencies),通常不会指定版本号
  • 项目的全部依赖包清单,每个依赖包都指定版本号

方法1:简单的requirements文件

项目的顶层依赖包清单,通常不会指定版本号。

$ cat requirements.txt
requests[security]
flask
gunicorn==19.4.5

方法1非常简单,也是每个使用requirements文件的开发者希望获得的用户体验。但是,如果将这样一个requirements.txt文件部署到生产环境,有可能会出现预料之外的问题。因为你没有指定版本号,所以在运行pip install后,你今天安装的Python包可能和明天安装的就会不一样。

这是很糟糕的。因为子依赖包可能经常更新版本号,所以重新运行pip install -r requirements.txt可能会让你安装不一样的Python包。这有可能会让你的应用因为未知的原因而无法运行。

方法2:精确的requirements文件

项目的全部依赖包清单,每个依赖包都指定版本号

$ cat requirements.txt
cffi==1.5.2
cryptography==1.2.2
enum34==1.1.2
Flask==0.10.1
gunicorn==19.4.5
idna==2.0
ipaddress==1.0.16
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
ndg-httpsclient==0.4.0
pyasn1==0.1.9
pycparser==2.14
pyOpenSSL==0.15.1
requests==2.9.1
six==1.10.0
Werkzeug==0.11.4

方法2是部署应用时应采取的最佳实践,可以确保你的运行环境不会出现问题。

所有的依赖包,包括子依赖包都明确列出,而且指定了各自的版本号。

这种类型的requirements.txt是在应用当前工作运行环境下,运行pip freeze命令自动生成的。这种做法鼓励开发者平等对待开发/生产环境(dev/prod parity),对待外部依赖包,就像对待本身应用的代码一样尊敬(因为它们也是你应用代码的一部分)。

麻烦之处

尽管方法2是使用requirements.txt的最佳实践,但实际上还是有点麻烦。举个例子,如果我有一个较大的代码库,希望通过pip install --upgrade命令更新部分或全部Python包,我没有办法轻松地做到这点。

之前我的方法是,一个一个地把顶层的依赖包挑出来,然后手动输入pip install requests[security] flask --upgrade。这个过程可不好受。

我思考了很久,还想过要开发一个工具来解决这个问题。当然,现在已经有了像pip-tools这样的工具。可是,我不想再往自己的工具链(tool chain)里加东西了;这个问题应该利用已有的工具就能解决。

最后,我想出了一个很好的方案,利用我现有的工具解决了这个问题,而且兼具方法1和方法2的优势。我已经在项目中使用这个工作流一段时间,对结果非常满意。

工作流

其实很简单:我们不只放一个requirements文件,而是两个:

  • requirements-to-freeze.txt
  • requirements.txt

requirements-to-freeze.txt

requests[security]
flask
gunicorn==19.4.5

requirements.txt

cffi==1.5.2
cryptography==1.2.2
enum34==1.1.2
Flask==0.10.1
gunicorn==19.4.5
idna==2.0
ipaddress==1.0.16
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
ndg-httpsclient==0.4.0
pyasn1==0.1.9
pycparser==2.14
pyOpenSSL==0.15.1
requests==2.9.1
six==1.10.0
Werkzeug==0.11.4

requirements-to-freeze.txt遵循的是方法1,文件中说明了项目的顶层依赖包,以及你需要指定的明确版本号。

requirements.txt遵循的是方法2,其中的内容是运行pip install requirements-to-freeze.txt命令后,pip freeze生成的。

基本用法

$ cd project-repo

$ pip install -r requirements-to-freeze.txt --upgrade
Installing collected packages: six, enum34, ipaddress, ... $ pip freeze > requirements.txt

最新文章

  1. java 缩略图
  2. 编程工具系列之二------使用GDB的源代码查看功能
  3. openstack-networking-neutron(四)--iptables
  4. 编译java文件,出错:Failed to establish a connection with the target VM
  5. codeforces A. Vasily the Bear and Triangle 解题报告
  6. MemProof教程
  7. hdu 1134 Game of Connections
  8. CPU与内存(经典问答)
  9. android 用代码画虚线边框背景(转)
  10. debian下编译libev库
  11. CentOS启动报错:Centos kernel panic-not syncing:VFS:Unable to mount root fs on unknown block
  12. 3.21 采购订单导入MDS
  13. 国产CPU走到十字路口:谁来取代英特尔芯片?(少写了一个OpenPower)
  14. 【JAVAWEB学习笔记】23_Listener和邮箱服务器
  15. .pyc是个什么 python的执行过程
  16. Jmeter接口测试+压力测试
  17. app微信支付-java服务端接口 支付-查询-退款
  18. k8s网络之calico
  19. 【OpenCV】访问Mat中的每个像素值
  20. Linux常用基础操作命令大全(超实用精心整理)

热门文章

  1. Synchronization Service Manager
  2. 谈谈iOS中的锁
  3. PHP开发之Zend Studio快捷键汇总
  4. Play Framework 完整实现一个APP(五)
  5. DBCC CheckDB遇到a database snapshot could not be created
  6. java获取注册ip
  7. linux下 mysql数据库的备份和还原
  8. android 让一个Activity停留几秒后再跳转
  9. JavaScript中知而不全的this
  10. Java报表工具FineReport导出EXCEL的四种API