很抱歉,这是一个非常复杂的pipenv情况。
在我公司,我们正在使用pipenv(同时带有Pipfile和Pipfile.lock)来控制用于不同工程师笔记本电脑的软件包。对于我们来说,这比对大多数团队而言更为重要,因为我们还使用Zappa来部署AWS Lambda代码,并且显然可以直接从部署者的便携式计算机中打包依赖项以进行部署。因此,如果人们的笔记本电脑在依赖性方面不完全一致,我们可以根据部署它的人员在云中获得不同的行为。
我们发现,即使在尝试使用Pipfile和完全控制依赖关系之后Pipfile.lock,我们最终还是在不同的笔记本电脑上得到了不同的Python包,如pip freeze部署代码中的错误所示和所示。
这是显示笔记本电脑与老板笔记本电脑之间差异的确切过程(我引用的Pipfile代码在多行中,但由于将SO格式设置遇到问题,因此将其压缩为一行):
Pipfile带有通配符(如)指定的软件包的[requires] python_version = "3.6" [packages] flask = "*"。另外,我们没有一个Pipfile.lock,我的老板(他是该项目的第一个编码器)一直在运行--skip-lockPipfile以使用显式版本替换通配符,还使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 installpip freeze并比较了输出,但是我们仍然有许多差异。我想我可以有我的老板删除其pipenv环境并重新安装依据承诺Pipfile和Pipfile.lock,但由于它们是基于他pip freeze我会感到惊讶,有点如果改变任何东西。
所以我只是想知道:这种行为真的出乎意料吗?我一直以为,和的组合pipenv,只要每个版本都被锁定,就可以保证两个人拥有相同的软件包。我们还有什么需要做的才能获得非常精确的匹配?PipfilePipfile.lock==[version]
如果这真的是出乎意料,那么我唯一能想到的就是他可能没有pipenv shell在他之前跑过pip freeze,但我认为他做到了,因为一切都很好Pipfiles。
附注:我还没有转换我们[dev-packages]在Pipfile有版本,因为我不知道做什么,我假定这是无关紧要的。所以那些仍然像pylint = "*"
附加信息
以下是一些其他信息,以回应评论...但是首先我注意到了一些有趣的事情:
pip freeze差异)中的所有内容均未包含在中Pipfile。pip freeze输出与Pipfile.lock内容匹配,但老板的不匹配。我认为这可以解释这些差异,但令人惊讶的是他的pip freeze输出与Pipfile.lock自己创建的输出不匹配pipenv lock,除非问题是他pipenv lock从外部运行pipenv shell。为了回应评论...这是我和老板的笔记本电脑上的pip冻结输出(均来自pipenv shell)之间的区别的第一部分:
以下是Pipfile.lock我和老板的笔记本电脑之间的区别。该Pipfile.lock用具有他跑得到pipenv lock(外pipenv shell虽然我认为并不重要),然后提交,只是现在。然后,我将其拉出,使用pipenv --rm,ran 删除了我的环境pipenv install,并与Pipfile.lock他刚刚提交的有了以下区别。他的版本再次在左侧。
这些都是差异-我不明白的是为什么我们这里的差异小于差异pip freeze。我们Pipfile两个之间还是一样的。
小智 7
确保您共享完全相同环境的唯一方法是与相同的Pipfile.lock, with pipenv sync(可选pipenv sync --dev)同步。
Pipfile是人类的帮手,Pipfile.lock创造中的中间人,不保证依赖完全一样。
pipenv install在引擎盖下调用 2pipenv函数:lock和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直到下一个主要版本。
pipenv install从 Pipfile 安装。上游依赖关系可能有所不同。
pipenv sync从 Pipfile.lock 安装。没有什么不同。
这是我阅读命令帮助后的理解。
$ 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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |