由npm而温故到的pipenv

最近在学习Nodejs的npm工具时,很喜欢这个包管理器,非全局安装库,package.json以及lock文件的内容,突然让我联想到了Pipfile,对于这个文件我一般都只是打开,将里面的source url换成国内pip源,然后就关掉,下一步安装软件,我的目的只是单纯的想要个干净的软件,想着到最后小项目完成的时候还能用pip freeze 生成个requirement文件,多好。后来才发现自己的想法有多傻缺,既然是Kenneth Reitz(链接为题外话,程序员都是潜力股)大神造的轮子,怎能没有我们平常想不到的。

1. Pipenv燥起来

pipenv 参考了其他语言的包管理工具(bundler, composer, npm, cargo, yarn, etc.),旨在将最好的包管理工具带入 python 世界。pipevn 可以解决哪些问题:

  • 使用 pipenv 就相当于同时使用了 pip 和 virtualenv ,即做到包管理又可以管理虚拟环境。

  • 使用 pipenv 解决 requirement.txt 面临的问题,pipenv 使用 Pipfile 代替 requirement.txt 文件来记录项目依赖包。

  • 新增了 Pipfile.lock 文件来锁定 python 软件的包名及版本,以及其依赖关系的列表。

  • 让你深入了解库的依赖图(例如$ pipenv graph

  • 通过加载.env文件简化开发工作流程

1.1 基础用法

这里不过多介绍用法,pipenv --help或者官网即可查询。只推荐两篇文章当做小手册快速查看
pipenv利器 , 以及 pipenv使用指南

1.2 项目中如何使用

在pipenv的目录中,我我以前总是放弃用pipenv install而是pipenv shell进入虚拟环境然后pip,因为pienv install的时候会有lock这一个步骤导致很慢(因为lock文件中要记录哈希值等),lock文件的作用上面说过就不说了。但是用pip后库的名称版本不会记录到Pipfile,所以如果想完全摒弃requirement就应该用pipenv install。(其实可以完全不用到pipenv 进入虚拟环境,用**pipenv run python|pip **即可)

以Django项目为例。生成虚拟环境之前设置PIPENV_PYPI_MIRROR环境变量为https://pypi.tuna.tsinghua.edu.cn/simple详情见这里,目的是pipenv安装库的时候都会使用清华源,免得每次都要改。然后生成一个envdir,进入该目录,安装django,新建django。app等。项目完成之后,将与djang项目平级的Pipfile以及lock文件放入项目,然后版本控制,上传git。之后就是别人clone下来,进入django项目,pipenv install就能将python环境与Pipfile中的文件生成,方便省事。这是我暂时的想法,以后有更好的方案会换

1.3 Pipfile与Pipfile.lock

那为什么有了Pipfile还有Pipfile.lock

Python应用程序的具体要求来自Pipfile。这将包括应该从哪里获取包以及它们的松散版本约束。
Pipfile.lock为了再现性,将存储环境的详细信息(所有已安装的包含固定版本和其他详细信息的包)。该文件将自动生成,用户不应修改。

这里有个比较明了的回答,Why does pipenv need Pipfile and Pipfile.lock?
转而也可以逐渐理解npm中package.jsonpackage-lock.json的作用了

那我们是否要将这两个文件保持版本控制,官方的建议是:

  • 通常,保持两者Pipfile和Pipfile.lock版本控制。
  • Pipfile.lock如果要定位多个版本的Python,请不要保留版本控制。
  • 在Pipfile的[requires]部分中指定目标Python版本。理想情况下,你应该只有一个目标Python版本,因为这是一个部署工具。
  • pipenv install与语法完全兼容,可在此处找到完整的文档。pip install请注意,Pipfile使用TOML Spec。

2. 顺便说说npm

package.json的字段详解在这里,同样的按上面的说法,lock文件应该也要放入版本控制,但有一篇文章写道package-lock.json文件是地狱。哈哈哈23333