代码之家  ›  专栏  ›  技术社区  ›  Stephen

即使使用了Pipfile和Pipfile,用户之间也存在差异。使用显式版本锁定

  •  0
  • Stephen  · 技术社区  · 7 年前

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

    皮普尔 ,我们最终在不同的笔记本电脑上得到不同的Python包,如 pip freeze 如部署代码中的错误所示。

    1. 一开始,我们只有一个 皮普尔 [requires] python_version = "3.6" [packages] flask = "*" .而且,我们没有 皮普尔。锁 --skip-lock
    2. 为了更好地控制局面,我从升级我们的 皮普尔 用显式版本替换通配符,并使Python版本更具体,如 [requires] python_version = "3.6.4" [packages] Flask = "==1.0.2" .为了做到这一点,我得到了一份我老板的 皮普冷冻 输出并将版本复制到 皮普尔 其中有一个名称与列出的名称匹配(我跳过了任何不匹配的内容,因为我认为这是一个上游依赖项,我们还没有触及它)。是我干的。
    3. 我们仍然有问题,所以我们决定开始使用 控制上游依赖关系。所以我的老板通过跑步创造了一个 pip install 没有 --跳锁 这是第一次,也是第一次。
    4. 我拉了车 皮普尔。锁 ,用删除了我的环境 pipenv --rm 并用 pipenv install
    5. 我们都跑了 皮普冷冻 比较了产出,但我们两人仍有许多不同之处。

    我想我可以让我的老板删除他的 pipenv 皮普尔 皮普尔。锁 ,但因为它们是基于他的 皮普冷冻 如果这改变了什么,我会有点惊讶。

    所以我只是想知道:这种行为真的出乎意料吗?我一直认为 佩彭夫 , 皮普尔 皮普尔。锁 将保证两个人拥有相同的软件包,只要每个版本都用 ==[version] .我们还需要做什么才能得到一个非常精确的匹配?

    如果这真的出乎意料,我唯一能想到的是他可能没有逃跑 pipenv shell 在他的面前 皮普冷冻 ,但我认为他这么做是因为事情与现实背道而驰 Pipfiles .

    旁注:我还没有转换我们的 [dev-packages] 在里面 皮普尔 有版本,因为我不确定它是做什么的,我认为这是无关紧要的。所以这些仍然是一样的 pylint = "*"

    附加信息

    下面是回复评论的一些附加信息。。。但首先我注意到了一些有趣的事情:

    • 第一个屏幕截图中没有任何差异(例如 皮普冷冻 差异)在 皮普尔 .
    • 看起来像我的 皮普冷冻 输出与 皮普尔。锁 内容,但我老板的没有。我想这也许可以解释差异,但他的 输出将不匹配 皮普尔。锁 由他自己创造的 pipenv lock ,除非问题是他跑了 管道锁 从外面 管壳 .

    为了回应这些评论。。。以下是我和我老板的笔记本电脑上pip冻结输出(均来自pipenv外壳)之间差异的第一部分:

    enter image description here

    这里有一些不同之处 皮普尔。锁 皮普尔。锁 是通过让他跑来的 管道锁 (不在 管壳 pipenv--rm ,跑 管道安装 ,并与 他刚刚犯下的罪行。他的版本又在左边。

    这些都是不同之处——有一件事我不明白,为什么我们在这里的差异比在这里的少 皮普冷冻 我们的 我们俩之间还是一样的。

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    0 回复  |  直到 7 年前
        1
  •  7
  •   gaFF    7 年前

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

    Pipfile 皮普尔。锁 创建时,它不能确保依赖项完全相同。

    pipenv install 引擎盖下的呼叫2 pipenv 功能: lock sync pipenv lock 将产生一个 皮普尔。锁 皮普尔 .即使是固定版本 皮普尔 ,可能会有不同的 皮普尔。锁 如果它们是在不同的时刻生成的,因为固定包的依赖项可能不会固定(取决于发布者)。 pipenv同步 然后安装在 皮普尔。锁 .

    从中的依赖项直接安装环境 皮普尔。锁 ,你必须使用 pipenv --python 3.6 install --ignore-pipfile 否则 将从 皮普尔 .

    皮普尔。锁 版本(如果使用版本控制,您可以提交它,但您当然可以提交;),然后两者都使用 pipenv同步 .

    皮普尔。锁 完全一样,只要你在小版本上工作,错误修复。。。并且可以随意重新生成它,以获取主要版本的最新依赖项。在我的项目中,几乎所有 皮普尔 没有固定,当我们开始一个新的主要版本时,我们更新 皮普尔。锁 要尝试新的依赖项版本,请测试所有内容,如果最新引入的向后不兼容更改,有时会将依赖项绑定到以前的版本,然后修复 皮普尔。锁 直到下一个主要版本。

        2
  •  0
  •   Eric Ihli    7 年前

    pipenv install 从Pipfile安装。上游依赖关系可能有所不同。

    pipenv sync 从Pipfile安装。锁没有什么不同。

    $ pipenv
    Usage: pipenv [OPTIONS] COMMAND [ARGS]...
    
    Commands:
      # ...
      install    Installs provided packages and adds them to Pipfile, or (if no
      # ...
      sync       Installs all packages specified in Pipfile.lock.