为啥从 git repo 进行 pip 安装时 #egg=foo
Posted
技术标签:
【中文标题】为啥从 git repo 进行 pip 安装时 #egg=foo【英文标题】:Why #egg=foo when pip-installing from git repo为什么从 git repo 进行 pip 安装时 #egg=foo 【发布时间】:2012-08-03 20:15:27 【问题描述】:当我执行“pip install -e ...”从 git repo 安装时,我必须指定 #egg=somename 或 pip 抱怨。例如:
pip install -e git://github.com/hiidef/oauth2app.git#egg=oauth2app
这个“蛋”字串有什么意义?
【问题讨论】:
This part of thepip install
documentation 谈到#egg=name
,但没有给出明确的答案。
【参考方案1】:
您必须包含 #egg=Package 以便 pip 知道该 URL 会发生什么。见https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support
more on eggs
【讨论】:
这是什么意思“所以 pip 知道该网址会发生什么?”除了#egg 之外,还有什么可以附加到这样的网址的吗? 我其实很喜欢 Will 在pip install -h
、Source will be checked out into src/PACKAGE (lower-case) and installed in-place (using setup.py develop)
的回答我不确定它是否在其他地方使用...
已克隆但未安装:(【参考方案2】:
per pip install -h "egg" 字符串是作为安装的一部分检出的目录
【讨论】:
这可以和存储库同名吗?案例重要吗? "被检出的目录"?那么我要输入分支名称吗?编造点什么? 如果你制作了一个自定义的 Python 包,当你运行 setuptools 时,应该已经创建了一个名为project-name.egg-info/top_level.txt
的目录。将此文件的内容用作egg
参数的值。
我似乎无法弄清楚egg=...
设置是否真的很重要。我正在安装的包在 top_level.txt 文件中有多个条目。我已经尝试将其与脚本在setup.py
中使用的name
kwarg 匹配,但也是一个任意值。结果似乎都一样。请注意,我正在使用不需要-e
的pip install https://...
语法进行安装。【参考方案3】:
https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support 说:
url后缀“egg=-”的“项目名称”组件被pip在其依赖逻辑中用来识别 pip 下载和分析元数据之前的项目。这 鸡蛋名称的可选“版本”组件在功能上不起作用 重要的。它只是提供了关于什么版本的人类可读线索 正在使用中。对于 setup.py 不在项目根目录中的项目, 使用“子目录”组件。 “子目录”组件的值 应该是从项目的根目录到 setup.py 的路径 位于。
据此我推断 egg 值仅用于依赖检查,因此我认为按照惯例,应该使用包名(即some-pypi-package-name
),而不是任何包含的文件夹(即some_pypi_package_name
)
【讨论】:
【参考方案4】:鸡蛋就是some bundled python code。在 git url 中,egg 是项目名称。 VCS Support
通常我们从 Pypi 安装 python 包,所以你只指定包名称和版本(或者如果你不指定,它假定最新版本)。 Pypi 然后搜索你想要的鸡蛋并 pip 安装它。 pip install celery
将安装最新发布的 egg,pip install celery[redis]
将安装包含相同 celery 包的不同 egg,并从 celery 的 setup.py 中列为 redis 依赖项的任何包中安装最新的 egg。
使用 git 和 gitlab 路径,您可以指定 /user|group/repository.git@tag#egg=package-name
。 #egg=celery
和 #egg=celery[redis]
之间是有区别的,但它们都来自相同的源代码。
"tag" 也可以是除了实际标签之外的分支或提交哈希。如果不指定,则假定为master
。
例如,git+https://github.com/celery/celery.git#egg=celery==4.3.0
会检查 master 分支并安装它。即使您指定了版本号,安装时也不会考虑它。 版本号被忽略
当通过 git 或其他 VCS url 安装时,您需要找到所需版本的标签或哈希。例如,git+https://github.com/celery/celery.git@v4.3.0#egg=celery
将签出标记为“v4.3.0”的提交,然后从该源代码安装包。假设维护者没有严重错误地标记他们的存储库,您可以获得您想要的版本。
【讨论】:
【参考方案5】:引用the manual:
pip 查看 VCS URL 的 2 个片段:
egg:用于指定 pip 依赖项中使用的“项目名称” 解析逻辑。例如:egg=project_name
子目录:用于指定Python包的路径,当它 不在 VCS 目录的根目录中。例如:pkg_dir
【讨论】:
以上是关于为啥从 git repo 进行 pip 安装时 #egg=foo的主要内容,如果未能解决你的问题,请参考以下文章