pip - 如何使用预制轮而不是再次拉 git 以避免冲突?
pip - How to use pre-built wheel instead of pulling git again to avoid conflict?
上下文
在我的 Django 项目(基于 Django cookiecutter)中,我使用 django-graphql-auth
,它依赖于 django-graphql-jwt
。
我分叉了 django-graphql-jwt
进行了一些更改,因此也分叉了 django-graphql-auth
以更新它对我的 django-graphql-jwt
分叉的依赖:
# django-graphql-auth setup.py
install_requires=[
"django-graphql-jwt @ git+<git_url>#egg=django_graphql_jwt",
...,
]
这与 pip install -r requirements.txt
的预期一样有效。
问题
在 Docker 中,当我在一个阶段构建轮子并在另一个阶段安装它们时,django-graphql-jwt
git 被拉了两次(在构建和安装时)并且发生了冲突。
Cookiecutter Django 提供了一个 Docker 文件 (found here),它分为多个阶段:
- 轮子是为所有依赖项构建的。这是 -auth 和 -jwt git 被克隆和构建的时候。
> pip wheel --wheel-dir /wheels/ -r local.txt
- 从上一阶段复制并安装轮子。在这里,应该使用内置的轮子(没有克隆git)。
> pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/*
...
Processing /wheels/django_graphql_auth-0.3.16-py2.py3-none-any.whl
Processing /wheels/django_graphql_jwt-0.3.4-py3-none-any.whl
...
Collecting django-graphql-jwt@ git+<git url>
Cloning ...
...
ERROR: Cannot install django-graphql-auth==0.3.16 and django-graphql-jwt 0.3.4 (from /wheels/django_graphql_jwt-0.3.4-py3-none-any.whl) because these package versions have conflicting dependencies.
The conflict is caused by:
The user requested django-graphql-jwt 0.3.4 (from /wheels/django_graphql_jwt-0.3.4-py3-none-any.whl)
django-graphql-auth 0.3.16 depends on django-graphql-jwt (unavailable)
如您所见,现有的 -jwt wheel 已被处理,但之后,其 git 被克隆。这两者似乎导致了冲突。如果我在 setup.py (django-graphql-jwt>=0.3.4
) 中添加一个版本,它在构建步骤中已经失败。
如何将 -auth 依赖项与已构建的 -jwt wheel 相匹配?
假设在第一步中构建了所有必需的依赖项(使用 pip wheel
),您可以通过将 --no-deps
选项添加到 pip install
来忽略安装步骤中的依赖项:
pip install --no-cache-dir --no-index --no-deps --find-links=/wheels/ /wheels/*
上下文
在我的 Django 项目(基于 Django cookiecutter)中,我使用 django-graphql-auth
,它依赖于 django-graphql-jwt
。
我分叉了 django-graphql-jwt
进行了一些更改,因此也分叉了 django-graphql-auth
以更新它对我的 django-graphql-jwt
分叉的依赖:
# django-graphql-auth setup.py
install_requires=[
"django-graphql-jwt @ git+<git_url>#egg=django_graphql_jwt",
...,
]
这与 pip install -r requirements.txt
的预期一样有效。
问题
在 Docker 中,当我在一个阶段构建轮子并在另一个阶段安装它们时,django-graphql-jwt
git 被拉了两次(在构建和安装时)并且发生了冲突。
Cookiecutter Django 提供了一个 Docker 文件 (found here),它分为多个阶段:
- 轮子是为所有依赖项构建的。这是 -auth 和 -jwt git 被克隆和构建的时候。
> pip wheel --wheel-dir /wheels/ -r local.txt
- 从上一阶段复制并安装轮子。在这里,应该使用内置的轮子(没有克隆git)。
> pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/*
...
Processing /wheels/django_graphql_auth-0.3.16-py2.py3-none-any.whl
Processing /wheels/django_graphql_jwt-0.3.4-py3-none-any.whl
...
Collecting django-graphql-jwt@ git+<git url>
Cloning ...
...
ERROR: Cannot install django-graphql-auth==0.3.16 and django-graphql-jwt 0.3.4 (from /wheels/django_graphql_jwt-0.3.4-py3-none-any.whl) because these package versions have conflicting dependencies.
The conflict is caused by:
The user requested django-graphql-jwt 0.3.4 (from /wheels/django_graphql_jwt-0.3.4-py3-none-any.whl)
django-graphql-auth 0.3.16 depends on django-graphql-jwt (unavailable)
如您所见,现有的 -jwt wheel 已被处理,但之后,其 git 被克隆。这两者似乎导致了冲突。如果我在 setup.py (django-graphql-jwt>=0.3.4
) 中添加一个版本,它在构建步骤中已经失败。
如何将 -auth 依赖项与已构建的 -jwt wheel 相匹配?
假设在第一步中构建了所有必需的依赖项(使用 pip wheel
),您可以通过将 --no-deps
选项添加到 pip install
来忽略安装步骤中的依赖项:
pip install --no-cache-dir --no-index --no-deps --find-links=/wheels/ /wheels/*