抱歉,篇幅较长,这是一个非常复杂的 Pipenv 情况。
在我的公司,我们正在使用 pipelinev (同时使用Pipfile
and Pipfile.lock
)来控制不同工程师笔记本电脑上使用的包。这对我们来说比大多数团队更重要,因为我们还使用 Zappa 来部署 AWS Lambda 代码,并且它显然直接从部署者的笔记本电脑打包依赖项来部署它们。因此,如果人们的笔记本电脑在依赖性方面不完全一致,我们可以根据部署者的不同在云中获得不同的行为。
我们发现,即使在尝试完全控制依赖关系之后Pipfile
and Pipfile.lock
,我们最终在不同的笔记本电脑上获得了不同的 Python 包,如下所示pip freeze
并如部署代码中的错误所示。
这是显示我的笔记本电脑和我老板的笔记本电脑之间差异的确切过程(我引用的 Pipfile 代码位于多行上,但我将其压缩为一行,因为我在 SO 格式方面遇到了问题):
- 一开始,我们所拥有的只是一个
Pipfile
使用通配符指定的包,例如[requires] python_version = "3.6" [packages] flask = "*"
。另外,我们没有Pipfile.lock
,我的老板(他是这个项目的第一个编码员)总是跑--skip-lock
- 为了更好地控制事情,我首先升级了我们的
Pipfile
用显式版本替换通配符并使我们的 Python 版本更加具体,例如[requires] python_version = "3.6.4" [packages] Flask = "==1.0.2"
。为此,我拿到了老板的一份副本pip freeze
输出并将版本复制到Pipfile
其中名称与那里列出的内容匹配(我跳过了任何不匹配的内容,因为我认为它是上游依赖项,而我们还没有触及它)。我犯了这个。
- 我们仍然遇到问题,所以我们决定开始使用
Pipfile.lock
控制上游依赖关系。所以我的老板通过运行创建了一个pip install
没有--skip-lock
第一次,并承诺了这一点。
- 我拉了
Pipfile.lock
,删除了我的环境pipenv --rm
并重新创建它pipenv install
- 我们俩都跑了
pip freeze
并比较了输出,但我们仍然存在许多差异。
我想我可以让我的老板删除他的pipenv
环境并根据承诺重新安装Pipfile
and Pipfile.lock
,但由于它们是基于他的pip freeze
如果这改变了什么,我会有点惊讶。
所以我只是想知道:这种行为真的出乎意料吗?我一直以为的组合pipenv
, Pipfile
, and Pipfile.lock
将保证两个人拥有相同的软件包,只要每个版本都被锁定==[version]
。为了获得非常精确的匹配,我们还需要做些什么吗?
如果真是出乎意料的话,我唯一能想到的就是他可能没有跑pipenv shell
在他之前pip freeze
,但我认为他这样做是因为事情与Pipfiles
.
旁注:我还没有转换我们的[dev-packages]
in Pipfile
有版本,因为我不确定它的作用,并且我认为它无关紧要。所以那些仍然像pylint = "*"
附加信息
以下是回应评论的一些附加信息...但首先我注意到一些有趣的事情:
- 第一个屏幕截图中没有任何差异(对于
pip freeze
差异)在Pipfile
.
- 看起来像我的
pip freeze
输出匹配Pipfile.lock
内容,但我老板的没有。我认为这可以解释这些差异,但令人惊讶的是他的pip freeze
输出不匹配Pipfile.lock
由他自己创造的pipenv lock
,除非问题是他跑了pipenv lock
从外部pipenv shell
.
为了回应这些评论...这是我和我老板的笔记本电脑上 pip freeze 输出(均来自 pipelinev shell 内)之间差异的第一部分:
以下是一些差异Pipfile.lock
在我和老板的笔记本电脑之间。这Pipfile.lock
是通过让他跑步获得的pipenv lock
(在外面pipenv shell
尽管我认为这并不重要),然后现在就提交。然后我把它拉出来,删除了我的环境pipenv --rm
, ran pipenv install
,并得到以下差异Pipfile.lock
他刚刚承诺的。他的版本又在左边。
这些都是所有的差异 - 我不明白的一件事是为什么我们这里的差异比pip freeze
. Our Pipfile
我们两个人之间还是一样。