(我认为[!])我了解pipenv(和其他venvs)背后的原理并经常使用它们。但是,我从来没有真正理解过为什么同时pipenv需要a Pipfile和Pipfile.lock文件。
现在,一旦在生产环境中获取了代码和Pipfile.lock,就应该安装最后记录的成功环境:
Run Code Online (Sandbox Code Playgroud)$ pipenv install --ignore-pipfile
但这并不能解释为什么 Pipfile.lock 需要使用它。也就是说,.lock文件包含哪些内容Pipfile,以及为什么Pipfile足以与其他开发人员共享:
现在,假设另一个开发人员想要对您的代码进行一些补充。在这种情况下,他们将获得包括Pipfile在内的代码,并使用以下命令:
Run Code Online (Sandbox Code Playgroud)$ pipenv install --dev
但是还不足以用来在生产环境中复制您的环境吗?
官方Pipfile项目对此有话要说:
Python应用程序的具体要求将来自
Pipfile。这将包括应从何处获取软件包及其宽松的版本限制。
Pipfile.lock为了重现性,环境的详细信息(所有安装的软件包以及固定的版本和其他详细信息)都将存储在中。该文件将自动生成,并且不应由用户修改。
换句话说,Pipfile是为人而Pipfile.lock为,是为计算机。
在您的Pipfile列表中,列出了该文件中所需的内容,并以某种较为宽松的方式定义了它们,例如“ Django版本2或更高版本”。但这还不足以确定性地重现环境。那是“ Django 2.0.3”还是“ Django 2.1.0”?
Pipfile.lock精确地指定需求,并且也精确地指定依赖关系。例如,如果您明确想要foo并将其放入Pipfile,Pipfile.lock则会生成将其锁定到特定版本的信息。如果foo本身取决于bar,并bar依赖于quux和florp,该Pipfile.lock文件将锁定bar,quux以及florp失望过,所以依赖的微小差异不破的东西。