为什么版本号不能固定在Pipfile中?

w--*_*w-- 17 python pip pipenv

我正在考虑使用pipenv并在这里的文档中
https://pipenv.readthedocs.io/en/latest/basics.html#importing-from-requirements-txt

它说(强调我的)

请注意,在导入需求文件时,它们通常会固定版本号,这可能是您不想要的

为什么是这样?

据我所知,Pipfile.lock文件将存储我安装的依赖项的特定版本和哈希,但我不希望能够看到Pipfile中安装的特定版本?(当我使用requirements.txt时,我的方式相同?)

vil*_*asv 8

对于您将需求固定在需求文件中的版本的可能原因,文档颇有意见:它可能来自pip freeze > requirements.txt

当然,您将需要在其中指定一些或所有版本范围,Pipfile只是很多人将它们固定在中,requirements.txt因为他们过去将其视为一种Pipfile.lock,指定了甚至没有直接依赖关系的软件包版本。自然,如果您不遵循此做法,则不必担心该警告。

正如他在博客文章A Better Pip Workflow中提到的那样,这很可能是Kenneth Reitz(Pipenv的创建者)自己之前所做的结果。他已经在官方资料库中对此问题进行了澄清和询问。

2018年6月更新

该消息也曾经被pipenv命令打印为警告,但已被替换为

requirements.txt found, instead of Pipfile! Converting…
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did.
We recommend updating your Pipfile to specify the "*" version, instead.
Run Code Online (Sandbox Code Playgroud)

友好一点,但是我仍然隐含地说在Pipfile上固定版本并不理想,这是不正确的。很好

  • 我更喜欢固定所有版本,这样我就可以知道依赖项升级没有引入错误,我不喜欢随机更新依赖项,我喜欢在检查其更改日志/发行说明后逐一升级。 (5认同)
  • 对于任何远程严肃的项目在 Pipfile 中指定 `"*"` 是一个糟糕的主意。您至少应该固定主要版本(例如“>=1.2.3,<2.0.0”)以避免意外损坏,并且仍然可以轻松获得次要更新,而无需每次都更改固定。Poetry 在这方面要好得多,因为默认情况下,当你执行 `poetry add package` 时,它会将其固定到当前最新版本,例如 `^1.2.3` (相当于之前的表达式 `>= 1.2.3`)。 3、<2.0.0`)。 (5认同)
  • 不仅很好,而且我认为这是必要的。我目前没有在`Pipfile`中使用固定版本,每次我进行`pipenv lock`(每两天一次)最终我的`Pipfile.lock`中会有很多更改,这令人困惑并且不允许我了解发生了什么。我现在将移至固定的`Pipfile`(使用最新的`Pipfile.lock`中的版本),从现在开始,我希望我能更好地控制最终将要安装的内容。 (4认同)

dsp*_*ejs 6

我不确定以前使用的是哪种情况,但是最新的文档说,您可以在安装时指定软件包的版本号,如下所示:

pipenv install requests==2.13.0
Run Code Online (Sandbox Code Playgroud)

这还将更新您中的软件包Pipfile以包括版本号,如下所示:

requests = "==2.13.0"
Run Code Online (Sandbox Code Playgroud)

您可以为每个要为其指定版本号的软件包执行此操作,包括先前是否已安装了它们。

我想您也许可以手动编辑您的代码Pipfile,尽管我不确定那是否正确。

  • 是的,手动编辑 Pipfile 是可以的,但不应触摸 Pipfile.lock 文件。Pipline.lock 文件不应被触及。编辑 Pipfile 后,我们可以删除 Pipfile.lock 并运行 ```pipenv install``` 来重新生成文件 (3认同)