即使在使用显式版本的 Pipfile 和 Pipfile.lock 后,用户之间也存在差异

2024-04-08

抱歉,篇幅较长,这是一个非常复杂的 Pipenv 情况。

在我的公司,我们正在使用 pipelinev (同时使用Pipfile and Pipfile.lock)来控制不同工程师笔记本电脑上使用的包。这对我们来说比大多数团队更重要,因为我们还使用 Zappa 来部署 AWS Lambda 代码,并且它显然直接从部署者的笔记本电脑打包依赖项来部署它们。因此,如果人们的笔记本电脑在依赖性方面不完全一致,我们可以根据部署者的不同在云中获得不同的行为。

我们发现,即使在尝试完全控制依赖关系之后Pipfile and Pipfile.lock,我们最终在不同的笔记本电脑上获得了不同的 Python 包,如下所示pip freeze并如部署代码中的错误所示。

这是显示我的笔记本电脑和我老板的笔记本电脑之间差异的确切过程(我引用的 Pipfile 代码位于多行上,但我将其压缩为一行,因为我在 SO 格式方面遇到了问题):

  1. 一开始,我们所拥有的只是一个Pipfile使用通配符指定的包,例如[requires] python_version = "3.6" [packages] flask = "*"。另外,我们没有Pipfile.lock,我的老板(他是这个项目的第一个编码员)总是跑--skip-lock
  2. 为了更好地控制事情,我首先升级了我们的Pipfile用显式版本替换通配符并使我们的 Python 版本更加具体,例如[requires] python_version = "3.6.4" [packages] Flask = "==1.0.2"。为此,我拿到了老板的一份副本pip freeze输出并将版本复制到Pipfile其中名称与那里列出的内容匹配(我跳​​过了任何不匹配的内容,因为我认为它是上游依赖项,而我们还没有触及它)。我犯了这个。
  3. 我们仍然遇到问题,所以我们决定开始使用Pipfile.lock控制上游依赖关系。所以我的老板通过运行创建了一个pip install没有--skip-lock第一次,并承诺了这一点。
  4. 我拉了Pipfile.lock,删除了我的环境pipenv --rm并重新创建它pipenv install
  5. 我们俩都跑了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我们两个人之间还是一样。


确保共享完全相同的环境的唯一方法是与相同的环境同步Pipfile.lock, with pipenv sync(可选pipenv sync --dev).

Pipfile是人类的帮助者,是人类的中间人Pipfile.lock创建时,它不能确保依赖项完全相同。

pipenv install幕后调用 2pipenv功能:lock and sync. pipenv lock将生成一个Pipfile.lock从你的Pipfile。即使有固定版本Pipfile, 可能有不同的Pipfile.lock如果它们是在不同时刻生成的,因为固定包的依赖项可能不会固定(取决于发布者)。pipenv sync然后安装在中找到的确切软件包Pipfile.lock.

直接从依赖项安装您的环境Pipfile.lock,你必须使用pipenv --python 3.6 install --ignore-pipfile, 否则Pipfile.lock将从中重新生成Pipfile.

要轻松解决您的问题,请修复Pipfile.lock版本(如果您使用版本控制,您可以提交它,但您当然这样做了;),然后两者都使用pipenv sync.

然后保留Pipfile.lock只要您致力于次要版本、错误修复……并且可以随意重新生成它以获得主要版本的最新依赖项,就完全相同。在我的项目中,几乎所有依赖项都在Pipfile没有固定,当我们开始新的主要版本时,我们会更新Pipfile.lock尝试新的依赖版本,测试所有内容,有时如果最新引入的向后不兼容的更改,则将依赖项固定到以前的版本,然后我们修复Pipfile.lock直到下一个主要版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使在使用显式版本的 Pipfile 和 Pipfile.lock 后,用户之间也存在差异 的相关文章

随机推荐

  • 如何进行 git rebase 并保留提交时间戳?

    我想进行变基以从我的历史记录中删除某个提交 我知道该怎么做 但是 如果我这样做 提交时间戳将设置为我完成变基的那一刻 我希望提交保留时间戳 我在这里看到了最后一个答案 https stackoverflow com a 19522951 3
  • 在 vega-lite 中实现自定义点击处理程序的正确方法是什么

    我似乎无法通过阅读文档来弄清楚这一点 有没有办法实现onClick我的任何标记的事件处理程序 由于 Vega Lite 尚不支持信号 您可以修补生成的 Vega 您可以将信号添加到已编译的 Vega 规范中 然后通过 Vega 视图 API
  • Logback:如何将日志目录从“tomcat/bin”更改为与应用程序相关的?

    我想用slf4j with logback用于记录 您可以在下面看到我的 logback xml
  • Android SmsRetrieverClient 的短信验证不解析消息

    尝试按照此处的步骤实现短信自动读取以进行验证 https developers google com identity sms retriever request https developers google com identity s
  • 如何在 Spring Data REST 项目中使用 DTO?

    Spring Data REST 自动仅公开域对象 但大多数情况下我们必须处理数据传输对象 那么如何以SDR方式做到这一点呢 一种如何合作的方法DTO https en wikipedia org wiki Data transfer ob
  • 如何在 Visual Studio Code 中获取 Unity 函数名称的智能感知?

    我正在关注有关 Unity 的教程 我发现讲师在编写方法名称时具有智能感知功能 然而 我只有类和变量的智能感知 我的意思是像 Rigidbody 这样的 Unity 类和我自己的变量 我还读过 自动补全在 Visual Studio 中不起
  • Android apk 构建的条件资源包含/排除

    我不断回到这个问题 因为似乎没有一个干净的解决方案 有没有人有一个好的策略来从 Android 子项目中排除资源 我有两种情况 1 基础库项目具有 en es 等本地化文件 子项目1使用所有本地化 一切都很好 子项目 2 仅本地化为英语 但
  • Bookdown:如何更改章节标题的大小?

    我正在使用 bookdown 为研讨会生成幻灯片 我使用菜单中的 大 字母选项来显示幻灯片 但是章节标题字体太大 我在哪里 如何修改那个 Thanks Paul 你可以用 css 来控制它yihui https stackoverflow
  • Keycloak Java 管理客户端在触发验证电子邮件时返回 400 错误

    我在 Spring Boot 2 2 上使用 keycloak 服务器版本 8 0 1 和 keycloak java admin 客户端版本 8 0 1 使用 webflux 和 netty 而不是 tomcat 如果此类信息有帮助的话
  • Python - “ascii”编解码器无法解码字节

    我正在使用 Python 2 6 和 Jinja2 创建 HTML 报告 我为模板提供了许多结果 模板循环遍历它们并创建 HTML 表 当调用 template render 时 我突然开始收到此错误 td result result st
  • sorl-缩略图不起作用

    我已经尝试了几个小时来让 sorl thumbnail 工作 但它就是行不通 困难的部分是它没有显示错误 所以我不知道出了什么问题 我按照说明安装了它 我的完整代码可以在这里找到 https github com samos123 Samo
  • 在同一个表上触发 INSERT 和 UPDATE

    众所周知 实体框架无法保存地理数据 所以我的想法是 在我的模型中将经度和纬度指定为十进制 执行用于创建表的 SQL 脚本后 我将启动另一个脚本来添加地理列 然后我想通过触发器在每次插入或更新 经度和纬度 时更新此列 下面的触发器是好的还是坏
  • 在新机器上部署.net应用程序并得到“系统无法执行指定的程序”

    我有一个启动 Excel 的 net 控制台应用程序 我让它在我的开发环境中运行 但我无法让它在我的生产环境中运行 当我尝试运行它时 收到以下错误 系统无法执行指定的程序 我已经在我的生产服务器上安装了 net 2 0 sp2 有任何想法吗
  • PyQT 列表视图不响应数据更改信号

    我一直在关注一些教程并尝试设置列表模型 我的主窗口有两个访问同一模型的列表视图 当我更新一个列表中的一项时 另一个列表不会自行更新 直到它获得焦点 我单击它 所以看起来 dataChanged 信号没有被发出 但我无法弄清楚我的代码与我所基
  • 旋转时使用拖动手柄调整 div 大小

    我可以找到类似的问题 涉及 jQuery UI lib 或者只有 css 没有可拖动的句柄 但没有任何纯数学问题 我尝试执行的是拥有一个可调整大小和可旋转的 div 到目前为止很容易 我可以做到 但旋转时会变得更加复杂 调整大小以相反的方式
  • JavaScript 函数是否可以将其自己的函数调用作为字符串返回?

    在 JavaScript 中 函数是否可以将其自己的函数调用作为字符串返回 function getOwnFunctionCall return the function call as a string based on the para
  • 胡萝卜2 - 我可以从文件夹中聚集文档吗?

    我正在尝试对我在研究项目中收集的文档进行聚类 我正在尝试使用 Carrot2 工作台 但无法找到如何将胡萝卜指向包含文档的文件夹 请问我该怎么做 我有少量文档 txt 需要比较 它们位于独立的研究机器上 因此我无法连接到网络并在那里处理它们
  • Symfony 存储 foreach 循环的结果

    我想知道是否可以存储 foreach 循环的结果 我不知道如何更详细地解释我的问题 所以可以说以下让我得到 3 个不同的数组 events this gt getDoctrine gt getRepository TestBundle Ev
  • IS 回收时正在运行的任务会发生什么情况

    为了帮助提高客户端的性能 我将请求的处理转移到任务上 这样做是因为处理通常需要一些时间 而且我不希望客户端等待一段时间才得到 200 响应 将工作转移到任务上的 Web 服务始终在处理帖子 public void ProcessReques
  • 即使在使用显式版本的 Pipfile 和 Pipfile.lock 后,用户之间也存在差异

    抱歉 篇幅较长 这是一个非常复杂的 Pipenv 情况 在我的公司 我们正在使用 pipelinev 同时使用Pipfile and Pipfile lock 来控制不同工程师笔记本电脑上使用的包 这对我们来说比大多数团队更重要 因为我们还