更好的pip工作流
转自: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
更好的pip工作流的更多相关文章
- F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)
Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回.传阅.转交,都可以非常方便快捷地实现,管理员 ...
- 工作流(worfflow)
-- 工作流(Workflow)就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务 ...
- 基于Activiti工作流引擎实现的请假审核流程
概要 本文档介绍的是某商用中集成的Activiti工作流的部署及使用,该框架用的Activiti版本为5.19.0.本文档中主要以一个请假流程为例子进行说明,该例子的流程图如下: 这是一个可以正常运作 ...
- Gitflow 工作流简介
Gitflow工作流简介 Gitflow工作流通过为功能开发.发布准备和项目维护分配独立的分支,让发布迭代过程更流畅. Gitflow工作流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提 ...
- Activiti工作流的入门介绍
一.activiti介绍 Activiti5是一个 业务流程管理(BPM)框架,它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行流程语言框架.Activiti基于Ap ...
- pip 命令总结
建议和 Conda 命令一起看,pip 和conda命令有点相似.<Conda 命令> 1 查看帮助文档 pip --help 使用该命令将告诉你 pip 的常用命令. 使用时,输入pip ...
- python logging
参考: https://docs.python.org/2/howto/logging.html#logging-basic-tutorial https://docs.python.org/2/li ...
- .NET Framework3.0/3.5/4.0/4.5新增功能摘要
Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...
- django_restframework_angularjs
用Django Rest Framework和AngularJS开始你的项目 作者:Kevin Stone原帖:Getting Started with Django Rest Framework a ...
随机推荐
- SharePoint 2013 图文开发系列之应用程序页
在SharePoint中,有两种页面类型,一种是保存在数据库中的页面,我们可以在网站的页面库中看到:还有一种叫做应用程序页,部署在服务器上,Layouts下面的页面,是应用程序页,主要是完成特定功能的 ...
- 使用 UICollectionView 实现日历签到功能
概述 在 App 中,日历通常与签到功能结合使用.是提高用户活跃度的一种方式,同时,签到数据中蕴含了丰富的极其有价值的信息.下面我们就来看看如何在 App 中实现日历签到功能. 效果图 ..... 思 ...
- python之路径导入
问题: 最近在学习import的时候,发现不像import xxx,或者from xxx import ooo 这样简单.比如,看下面这个图: 要导入才能在te.py调用pre.tab.py?? 直接 ...
- C语言递归,非递归实现翻转链表
翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #inc ...
- 为项目配置logback日志
为了保证系统在上线后亦能查看运行的日志,故为系统加入日志. 1:系统引入jar包 slf4j-api.jar logback-classic.jar logback-core.jar logback- ...
- C#:委托和自定义事件
1. 委托概述 “委托”相当于C++中的“函数指针”,委托必须与所要“指向”的函数在“参数”和“返回类型”上保持一致; // 定义Person类 public class Person { publi ...
- css3【语法要点】
语法要点 display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */ display ...
- Linux cut命令
[root@wang /]# cat /etc/passwd root:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x ...
- The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
今天项目中报了如下错误 The last packet sent successfully to the server was 0 milliseconds ago. The driver has n ...
- openwrt 安装 ser2net 配置
//--- openwrt中的ipk应用 opkg install /tmp/ser2net_2.7-2_brcm63xx.ipk 看到安装成功的信息后启动ser2net Ser2net –c /et ...