我正在开发一个程序包,该程序包将由我无法控制的 3 方应用程序使用。
我想知道解决包之间冲突的最佳方法是什么。
例如:
假设一个 3 方应用程序想要使用我的名为
external-package
的包。
├── Dockerfile
├── app.py
├── external-package
│ ├── Core
│ │ ├── ClassA.py
│ │ └── __init__.py
│ └── setup.py
└── requirements.txt
应用程序.py:
from Core import ClassA
app = ClassA()
app.send()
A类:
import backoff
import requests
class ClassA:
@backoff.on_exception(
backoff.expo,
requests.exceptions.RequestException,
max_tries=35,
backoff_log_level=20,
max_time=2400,
raise_on_giveup=True,
)
def send(self):
requests.get('https://google.com')
Dockerfile:
FROM python:3.10-slim-buster
RUN apt-get update && apt-get install -y \
automake \
build-essential \
libtool \
wget \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY ./external-package /app/external-package
RUN pip install --no-cache-dir /app/external-package
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY . /app
CMD ["python", "app.py"]
运行此容器将输出错误:
Traceback (most recent call last):
File "/app/app.py", line 4, in <module>
app.send()
File "/usr/local/lib/python3.10/site-packages/backoff/_sync.py", line 87, in retry
wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
File "/usr/local/lib/python3.10/site-packages/backoff/_common.py", line 23, in _init_wait_gen
return wait_gen(**kwargs)
TypeError: expo() got an unexpected keyword argument 'backoff_log_level'
因为,外包装必须有
backoff ==1.9.2
,3方必须有backoff ==2.2.1
,但容器有backoff ==1.9.2
。
请记住,这只是
backoff
的示例,我希望有一种方法可以为任何库解决此问题。
我在处理 Python 项目时遇到过几次这种情况,不幸的是,到目前为止,还没有一种优雅的方法可以在同一个 Python 环境中安装同一模块的多个版本。
我通常会做的就是专注于我可以控制的事情,这是我自己的代码的依赖项(在你的例子中,
external-package
)。是否可以不修复 backoff
的 external-package
版本(即始终默认为最新版本)?如果是,请在 external-package
代码中进行必要的代码更改以实现此目的。
如果没有,那么下一个最佳选择可能是手动将
backoff==1.9.2
的源代码复制到 external-package
中,这是一个非常不优雅的解决方案,可能会导致将来出现问题。