为什么pipenv需要Pipfile和Pipfile.lock?

Chr*_*isW 1 python pipenv

(我认为[!])我了解pipenv(和其他venvs)背后的原理并经常使用它们。但是,我从来没有真正理解过为什么同时pipenv需要a PipfilePipfile.lock文件。

这个答案意味着,本教程

现在,一旦在生产环境中获取了代码和Pipfile.lock,就应该安装最后记录的成功环境:

$ pipenv install --ignore-pipfile
Run Code Online (Sandbox Code Playgroud)

但这并不能解释为什么 Pipfile.lock 需要使用它。也就是说,.lock文件包含哪些内容Pipfile,以及为什么Pipfile足以与其他开发人员共享:

现在,假设另一个开发人员想要对您的代码进行一些补充。在这种情况下,他们将获得包括Pipfile在内的代码,并使用以下命令:

$ pipenv install --dev
Run Code Online (Sandbox Code Playgroud)

但是还不足以用来在生产环境中复制您的环境吗?

Chr*_*ris 5

官方Pipfile项目对此有话要说

Python应用程序的具体要求将来自Pipfile。这将包括应从何处获取软件包及其宽松的版本限制。

Pipfile.lock为了重现性,环境的详细信息(所有安装的软件包以及固定的版本和其他详细信息)都将存储在中。该文件将自动生成,并且不应由用户修改。

换句话说,Pipfile为人Pipfile.lock为,是为计算机

在您的Pipfile列表中,列出了该文件中所需的内容,并以某种较为宽松的方式定义了它们,例如“ Django版本2或更高版本”。但这还不足以确定性地重现环境。那是“ Django 2.0.3”还是“ Django 2.1.0”?

Pipfile.lock精确地指定需求,并且也精确地指定依赖关系。例如,如果您明确想要foo并将其放入PipfilePipfile.lock则会生成将其锁定到特定版本的信息。如果foo本身取决于bar,并bar依赖于quuxflorp,该Pipfile.lock文件将锁定barquux以及florp失望过,所以依赖的微小差异不破的东西。

  • 这取决于目标。--ignore-pipfile`标志[告诉`pipenv`从`Pipfile.lock`安装锁定的依赖项,而忽略`Pipfile`中列出的那些松散的依赖关系](https://pipenv.readthedocs.io/zh/latest/基础知识/#pipenv-install)。对于希望新环境与项目上一次使用的环境完全匹配的实例,这很好。但是在开发中,通常最好(确实鼓励)应用较小的更新,例如从Django 2.0.1到2.0.3。然后,您可以运行测试并使用该新版本进行工作。升级将被锁定,供下一个开发人员使用或部署。 (3认同)
  • 这就是我的怀疑 - 所以这两个文件之间有很多重复?这仍然留下了一些悬而未决的问题(以我的理解):为什么另一个开发人员应该运行“pipenv install --dev”而不是“pipenv install --dev --ignore-pipfile”? (2认同)
  • 另外,“两个文件之间有很多重复项” —是的,因为一个文件是由另一个文件生成的(以及当时可用的软件包版本)。 (2认同)
  • @ChrisW,是的,主要是。如果你让 `pipenv` 通过从 `Pipfile` 而不是 `Pipfile.lock` 安装来更新依赖关系并且事情中断了,你可以添加一个约束。更好的是,您可以修复您的代码,使其适用于新库:经常更新您的库通常是一个好主意。但是您的生产环境应该尽可能接近您用于开发、测试、暂存等的环境。从锁定文件安装依赖项有助于实现这一点,匹配整个依赖树的库版本和哈希。 (2认同)
  • @variable,`--dev` 标志没有说明是否应该使用锁文件。[它告诉 Pipenv 在 `dev-packages` 和 `packages` 中安装东西](https://pipenv.readthedocs.io/en/latest/cli/#cmdoption-pipenv-install-d)。单元测试库、编辑器插件和其他在运行时生产中不需要的东西通常被定义为“开发包”。Pipenv 是否应该安装锁定的依赖项由其他标志控制。如果您只是运行“pipenv install --dev”,您的依赖项(和“Pipfile.lock”)将被更新。 (2认同)