You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何共享自定义PyPI索引配置?如何在Python包源码中配置以通过标准构建/安装链解析私有仓库依赖?

如何共享自定义PyPI索引配置?如何在Python包源码中配置以通过标准构建/安装链解析私有仓库依赖?

嘿,这个问题我太有共鸣了!我在公司内部项目里天天跟私有PyPI索引打交道,之前也踩过requirements.txt和标准打包流程不兼容的坑。确实,Python打包生态出于安全考虑,不允许包硬编码私有索引(防止恶意包偷偷加恶意源),但咱们在内部团队/私有仓库场景下,确实需要一种不用手动改全局配置、能跟着源码走的方案。下面给你几个经过实践验证的靠谱思路:

方案1:仓库内的pip配置文件 + 环境变量注入token

这是最通用的方案,兼容pipuvhatch几乎所有主流工具。

你可以在仓库根目录创建一个pip.conf(Linux/macOS)或pip.ini(Windows),把私有索引配置写进去,用环境变量占位token:

[global]
# 每个私有索引单独加一行extra-index-url
extra-index-url = https://__token__:${GITLAB_TOKEN}@gitlab.mycompany.com/api/v4/projects/100/packages/pypi/simple
extra-index-url = https://__token__:${GITLAB_TOKEN}@gitlab.mycompany.com/api/v4/projects/101/packages/pypi/simple
# 记得保留公共PyPI,避免默认索引被覆盖
index-url = https://pypi.org/simple

然后告诉团队成员/CI,安装前只要设置两个环境变量就行:

# Linux/macOS 终端
export GITLAB_TOKEN=你的私有仓库令牌
export PIP_CONFIG_FILE=./pip.conf
pip install .

# Windows PowerShell
$env:GITLAB_TOKEN="你的私有仓库令牌"
$env:PIP_CONFIG_FILE="./pip.ini"
pip install .

uvhatch都会自动读取pip的配置,所以同样适用这个方案。好处是配置跟着仓库走,不用每个人手动改全局的~/.config/pip/pip.conf,token用环境变量注入,完全符合安全要求(不会把敏感信息提交到Git)。

方案2:用pyproject.toml配合现代打包工具的内置配置

如果你用uv或者hatch这类现代工具,直接在pyproject.toml里写配置更优雅,不用额外的pip配置文件。

针对uv的配置

uv支持在pyproject.tomltool.uv.index里直接定义私有索引:

[project]
name = "你的包名"
version = "0.1.0"
dependencies = [
  "my-dependency-one==3.4.2",
  "my-dependency-two==1.0.0"
]

[tool.uv.index]
# 公共PyPI默认会加,这里只需要加私有索引
extra-index-url = [
  "https://__token__:${GITLAB_TOKEN}@gitlab.mycompany.com/api/v4/projects/100/packages/pypi/simple",
  "https://__token__:${GITLAB_TOKEN}@gitlab.mycompany.com/api/v4/projects/101/packages/pypi/simple"
]

安装的时候只要设置好token,直接用uv安装就行:

export GITLAB_TOKEN=你的令牌
uv install .

针对hatch的配置

hatch可以给项目环境绑定专属索引,在pyproject.toml里这么写:

[project]
name = "你的包名"
version = "0.1.0"

[tool.hatch.envs.default]
dependencies = [
  "my-dependency-one==3.4.2",
  "my-dependency-two==1.0.0"
]
# 按顺序添加索引,最后加pypi确保公共包能正常拉取
indexes = [
  "https://__token__:${GITLAB_TOKEN}@gitlab.mycompany.com/api/v4/projects/100/packages/pypi/simple",
  "https://__token__:${GITLAB_TOKEN}@gitlab.mycompany.com/api/v4/projects/101/packages/pypi/simple",
  "pypi"
]

安装时用hatch的环境命令:

export GITLAB_TOKEN=你的令牌
hatch env create
hatch run pip install .

方案3:PEP 685 绑定单个依赖的专属索引

如果你的私有依赖分散在不同的索引(比如依赖1在项目100,依赖2在项目101),可以用PEP 685的语法,直接在依赖里指定它的来源索引,这样不会影响其他依赖的拉取:

[project]
name = "你的包名"
version = "0.1.0"
dependencies = [
  # 格式:依赖名@ 索引的依赖路径
  "my-dependency-one==3.4.2 @ https://gitlab.mycompany.com/api/v4/projects/100/packages/pypi/simple/my-dependency-one/",
  "my-dependency-two==1.0.0 @ https://gitlab.mycompany.com/api/v4/projects/101/packages/pypi/simple/my-dependency-two/"
]

这种方式需要注意,索引URL里的认证还是得靠环境变量,你可以用shell命令先替换配置里的token占位符再安装:

sed -i "s/__token__:.*@/__token__:$GITLAB_TOKEN@/g" pyproject.toml
pip install .

这个方案的好处是每个依赖绑定自己的索引,不会出现“所有依赖都去私有索引找”的问题,适合依赖分散的场景。

关键安全提醒

  • 永远不要把令牌硬编码在仓库文件里!所有令牌必须通过环境变量注入,这是底线
  • 仓库里的配置文件(比如pip.confpyproject.toml)要提交到Git,因为这是团队共享的配置,令牌是动态注入的,不会泄露
  • 所有方案都需要用户主动启用仓库里的配置(比如设置PIP_CONFIG_FILE、用hatch环境),符合Python打包生态的安全规范——避免包偷偷添加恶意索引

总结

根据你的工具栈选对应的方案:

  • 通用场景(用pip为主):选仓库内的pip.conf+环境变量
  • 现代工具栈(uv/hatch):选pyproject.toml的tool配置
  • 依赖分散在不同索引:选PEP 685的绑定方式

这些方案都完全兼容标准的pip install .uv install .hatch build等构建/安装流程,不用手动改全局配置,团队成员和CI只要设置好环境变量就能直接用。

内容来源于stack exchange

火山引擎 最新活动