我在自己的机器上托管了一些本地包,我想在依赖它们的其他包的分发中包含它们的副本。安装本地包时,pip freeze
显示类似
public-package==3.0.1
local-package @ file:///home/user/local-package/dist/local-package-1.0.0.tar.gz
但是如果尝试在另一台计算机上安装该软件包,则会从 pip 收到错误消息,因为 local-package
路径不存在。我可以扩展 setup.py
命令来处理该 requirements.txt
文件,提取本地包路径,将本地包复制到 dist 存档的 deps
文件夹并重写 requirements.txt
之类的
public-package==3.0.1
local-package @ deps/local-package-1.0.0.tar.gz
并使 pip 将 deps/
视为包存档本身的相对路径?
答案 0 :(得分:0)
我设法通过源代码分发和覆盖 sdist
和 egg_info
命令来做到这一点,以使 setuptools 将本地依赖项与包捆绑在一起,并在以后安装构建的包时在该包中创建 pip 搜索依赖项。但后来我发现它使系统容易受到 dependency confusion 攻击,因为从该包安装的本地包通过 pip freeze
可见,如果由于某种原因依赖位置,如 local-package @ file:///home/user/packages/local-package.tar.gz
被剥离为只是local-package
pip 会在 pypi 上搜索它,这会导致依赖混淆。
此问题的最佳解决方案是供应所有本地依赖项,其中将其源代码复制到包中,pip 本身使用 vendoring 供应其依赖项。