包管理器国内源
装依赖慢、超时、卡在 downloading 时,先把源换成国内镜像试试。每条都给出设置、验证和恢复官方源三条命令,改坏了能一键改回来。
覆盖的工具
收录的包管理器与每个下面的配置条数 | 工具 | 配置条数 | 适用场景 |
|---|
| npm / yarn / pnpm | 4 | 前端与 Node 项目装依赖 |
|---|
| pip / PyPI | 3 | Python 第三方库 |
|---|
| conda | 2 | 数据科学环境与科学计算库 |
|---|
| apt(Debian 系) | 4 | Debian / Ubuntu 系统包 |
|---|
| yum / dnf(RedHat 系) | 3 | CentOS / Rocky / RHEL 系统包 |
|---|
| Homebrew | 2 | macOS 命令行工具与桌面应用 |
|---|
| Maven | 2 | Java 项目的依赖与构件 |
|---|
| Gradle | 1 | Android 与 JVM 项目构建依赖 |
|---|
| Cargo | 2 | Rust crate |
|---|
| rustup | 1 | Rust 工具链本体的下载 |
|---|
| Go Modules | 2 | Go module 代理(GOPROXY) |
|---|
| Composer | 1 | PHP 依赖 |
|---|
| RubyGems | 1 | Ruby gem |
|---|
| Docker | 1 | 容器镜像拉取加速 |
|---|
| NuGet | 1 | .NET 包 |
|---|
| Alpine apk | 2 | Alpine 容器里的系统包 |
|---|
配置命令
命令块可以直接复制。「恢复官方源」那条建议留着,镜像出问题或者包校验失败时改回去最快。
npm · 淘宝 npmmirror
设置npm config set registry https://registry.npmmirror.com/
验证npm config get registry
恢复官方npm config set registry https://registry.npmjs.org/
npmmirror.com 是原淘宝 npm 镜像(registry.npm.taobao.org)的新域名,老域名已停止服务。
yarn · 淘宝 npmmirror
设置yarn config set registry https://registry.npmmirror.com/
验证yarn config get registry
恢复官方yarn config set registry https://registry.yarnpkg.com/
Yarn 2 以上改用 .yarnrc.yml 的 npmRegistryServer 字段。
pnpm · 淘宝 npmmirror
设置pnpm config set registry https://registry.npmmirror.com/
验证pnpm config get registry
恢复官方pnpm config set registry https://registry.npmjs.org/
pnpm 也可以只在项目里写 .npmrc,避免影响整机配置。
npm · 华为云
设置npm config set registry https://mirrors.huaweicloud.com/repository/npm/
验证npm config get registry
恢复官方npm config set registry https://registry.npmjs.org/
pip · 清华 TUNA
设置pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
验证pip config list
恢复官方pip config unset global.index-url
pip config unset global.trusted-host
trusted-host 是为了兼容部分环境对 HTTPS 证书的处理,只写 index-url 通常也能用。
pip · 阿里云
设置pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config set global.trusted-host mirrors.aliyun.com
验证pip config list
恢复官方pip config unset global.index-url
pip config unset global.trusted-host
pip · 中科大 USTC
设置pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ --trusted-host pypi.mirrors.ustc.edu.cn 包名
验证pip download --no-deps -d /tmp 包名
恢复官方pip install 包名
这条只在单次安装时临时生效,不写入配置文件,适合偶尔用一次。
conda · 清华 TUNA
设置conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
验证conda config --show channels
恢复官方conda config --remove-key channels
清华同时提供 conda-forge 与 pytorch 频道,需要时按同样格式追加。
conda · 中科大 USTC
设置conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
验证conda config --show channels
恢复官方conda config --remove-key channels
apt · 清华 TUNA · Ubuntu 22.04 及更早
设置sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's@//.*\.ubuntu\.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list
验证grep -m3 tuna /etc/apt/sources.list && sudo apt update
恢复官方sudo mv /etc/apt/sources.list.bak /etc/apt/sources.list && sudo apt update
22.04 及更早版本用单文件 sources.list,通配符会把 archive、security、ports 一起换掉。
apt · 清华 TUNA · Ubuntu 24.04+
设置sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
sudo sed -i 's@http://[a-z.]*ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/ubuntu.sources
验证grep -m3 URIs /etc/apt/sources.list.d/ubuntu.sources && sudo apt update
恢复官方sudo mv /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources && sudo apt update
Ubuntu 24.04 起改用 deb822 格式的 ubuntu.sources,地址写在 URIs 字段里,改法和老版本不同。
apt · 清华 TUNA · Debian 12
设置sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's@//deb.debian.org@//mirrors.tuna.tsinghua.edu.cn@g; s@//security.debian.org@//mirrors.tuna.tsinghua.edu.cn/debian-security@g' /etc/apt/sources.list
验证grep -m3 tuna /etc/apt/sources.list && sudo apt update
恢复官方sudo mv /etc/apt/sources.list.bak /etc/apt/sources.list && sudo apt update
安全更新源 security.debian.org 要单独替换,路径多一层 debian-security。
apt · 阿里云 · Ubuntu
设置sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's@//.*\.ubuntu\.com@//mirrors.aliyun.com@g' /etc/apt/sources.list
验证grep -m3 aliyun /etc/apt/sources.list && sudo apt update
恢复官方sudo mv /etc/apt/sources.list.bak /etc/apt/sources.list && sudo apt update
dnf · 阿里云 · Rocky Linux
设置sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org|baseurl=https://mirrors.aliyun.com/rockylinux|g' -i.bak /etc/yum.repos.d/rocky*.repo
验证sudo dnf makecache
恢复官方sudo find /etc/yum.repos.d -name 'rocky*.repo.bak' -exec sh -c 'mv "$1" "${1%.bak}"' _ {} \; && sudo dnf makecache
Rocky 的仓库文件分 BaseOS、AppStream 等多个,用通配符一次改完。
yum · 阿里云 · CentOS 7
设置sudo sed -i 's@^mirrorlist=@#mirrorlist=@; s@^#baseurl=http://mirror.centos.org@baseurl=https://mirrors.aliyun.com@' /etc/yum.repos.d/CentOS-*.repo
验证sudo yum makecache
恢复官方sudo sed -i 's@^baseurl=https://mirrors.aliyun.com@#baseurl=https://mirrors.aliyun.com@; s@^#mirrorlist=@mirrorlist=@' /etc/yum.repos.d/CentOS-*.repo
CentOS 7 已停止维护,官方镜像下架,很多场景需要指向 vault 归档地址才能继续安装。
dnf · 清华 TUNA · CentOS Stream
设置sudo sed -e 's|^metalink=|#metalink=|g' -e 's|^#baseurl=http://mirror.stream.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream|g' -i.bak /etc/yum.repos.d/centos*.repo
验证sudo dnf makecache
恢复官方sudo find /etc/yum.repos.d -name 'centos*.repo.bak' -exec sh -c 'mv "$1" "${1%.bak}"' _ {} \; && sudo dnf makecache
Homebrew · 清华 TUNA
设置export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
验证brew config | grep -E "HOMEBREW_(API|BOTTLE)"
恢复官方unset HOMEBREW_API_DOMAIN HOMEBREW_BOTTLE_DOMAIN HOMEBREW_BREW_GIT_REMOTE HOMEBREW_CORE_GIT_REMOTE
这些是环境变量,写进 ~/.zshrc 才会长期生效;官方源不需要额外配置,清空变量即可。
Homebrew · 中科大 USTC
设置export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
验证brew config | grep -E "HOMEBREW_(API|BOTTLE)"
恢复官方unset HOMEBREW_API_DOMAIN HOMEBREW_BOTTLE_DOMAIN HOMEBREW_BREW_GIT_REMOTE HOMEBREW_CORE_GIT_REMOTE
Maven · 阿里云
设置在 ~/.m2/settings.xml 的 <mirrors> 里加入:
<mirror>
<id>aliyun</id>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
验证mvn -q help:evaluate -Dexpression=settings.mirrors -DforceStdout
恢复官方cp ~/.m2/settings.xml.bak ~/.m2/settings.xml
阿里云 public 聚合了 central 和 jcenter;只镜像 central 时 mirrorOf 写 central 就行,别写 * 否则私服也会被顶掉。
Maven · 华为云
设置在 ~/.m2/settings.xml 的 <mirrors> 里加入:
<mirror>
<id>huaweicloud</id>
<url>https://repo.huaweicloud.com/repository/maven/</url>
<mirrorOf>central</mirrorOf>
</mirror>
验证mvn -q help:evaluate -Dexpression=settings.mirrors -DforceStdout
恢复官方cp ~/.m2/settings.xml.bak ~/.m2/settings.xml
Gradle · 阿里云
设置在 ~/.gradle/init.gradle 写入:
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
mavenCentral()
}
}
验证./gradlew dependencies --refresh-dependencies
恢复官方rm ~/.gradle/init.gradle
init.gradle 对这台机器上所有 Gradle 工程生效;只想影响单个项目就改 build.gradle 的 repositories。
Cargo · 中科大 USTC
设置在 ~/.cargo/config.toml 写入:
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
验证cargo build --locked
恢复官方删除 ~/.cargo/config.toml 里的 [source] 段
sparse+ 前缀走 HTTP 稀疏索引,比 git 索引快很多,Cargo 1.70 起默认支持。
Cargo · 清华 TUNA
设置在 ~/.cargo/config.toml 写入:
[source.crates-io]
replace-with = 'tuna'
[source.tuna]
registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"
验证cargo build --locked
恢复官方删除 ~/.cargo/config.toml 里的 [source] 段
rustup · 中科大 USTC
设置export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
验证rustup show
恢复官方unset RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT
rustup 下载工具链走的是 dist server,跟 Cargo 换源是两件独立的事,都要配。
Go Modules · goproxy.cn(七牛)
设置go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOSUMDB=sum.golang.google.cn
验证go env GOPROXY GOSUMDB
恢复官方go env -w GOPROXY=https://proxy.golang.org,direct
go env -w GOSUMDB=sum.golang.org
GOPROXY 里的 direct 表示回退到直连;企业内网可以换成自建 Athens。
Go Modules · 阿里云
设置go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
验证go env GOPROXY
恢复官方go env -w GOPROXY=https://proxy.golang.org,direct
Composer · 阿里云
设置composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
验证composer config -g -l | grep -i packagist
恢复官方composer config -g --unset repos.packagist
换源只改元数据地址,包本身的校验仍按 composer.lock 里的哈希走。
RubyGems · 清华 TUNA
设置gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
验证gem sources -l
恢复官方gem sources --add https://rubygems.org/ --remove https://mirrors.tuna.tsinghua.edu.cn/rubygems/
Bundler 读的是自己的配置,换源后要同步改 Gemfile 里的 source 或用 bundle config mirror。
Docker · DaoCloud 等公共镜像
设置在 /etc/docker/daemon.json 写入:
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
然后执行:
sudo systemctl daemon-reload && sudo systemctl restart docker
验证docker info | grep -A5 "Registry Mirrors"
恢复官方删掉 daemon.json 里的 registry-mirrors 字段,再 daemon-reload 并重启 docker
2024 年起多家公共镜像站陆续关停,可用性波动很大。生产环境建议自建 registry mirror 或使用云厂商的容器镜像服务。
NuGet · 华为云
设置dotnet nuget add source https://mirrors.huaweicloud.com/repository/nuget/v3/index.json -n huawei
dotnet nuget disable source nuget.org
验证dotnet nuget list source
恢复官方dotnet nuget remove source huawei
dotnet nuget enable source nuget.org
NuGet 换源是「加新源 + 禁旧源」,两条都要做,否则仍可能走官方源。
Alpine apk · 阿里云
设置sudo sed -i 's@dl-cdn.alpinelinux.org@mirrors.aliyun.com@g' /etc/apk/repositories
验证sudo apk update
恢复官方sudo sed -i 's@mirrors.aliyun.com@dl-cdn.alpinelinux.org@g' /etc/apk/repositories
Alpine 的仓库地址里带版本号(如 v3.20),换源时不要动版本路径,否则会装到别的版本上。
Alpine apk · 清华 TUNA
设置sudo sed -i 's@dl-cdn.alpinelinux.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apk/repositories
验证sudo apk update
恢复官方sudo sed -i 's@mirrors.tuna.tsinghua.edu.cn@dl-cdn.alpinelinux.org@g' /etc/apk/repositories
换源之前先想清楚慢在哪
国内镜像解决的是「到境外源站的网络慢」,如果你的瓶颈其实是别的东西,换源不会有任何帮助。常见的几种情况:依赖本身很大(比如装了 CUDA 相关的 PyPI 包),镜像再快也要下载几百 MB;包在境外源上有而镜像是空的(发行版仓库的 backports 源、小众语言生态经常有这种情况);或者公司网络要走代理,那正确做法是配置 npm config set proxy、pip --proxy、HTTP_PROXY 环境变量,而不是换 registry。
另外要注意配置文件的作用范围。npm 有 user 级(~/.npmrc)和 project 级(项目里的 .npmrc)两层,project 级会覆盖 user 级,所以一个检出的项目可能带着自己的 registry 设定让你以为换源没生效。pip 同理,pip config list -v 能把所有生效的配置文件路径列出来。Maven 的仓库配置还可能被 <mirrors> 与 <repositories> 的组合拦掉,改之前先确认没有 mirrorOf 把请求全导向了别处。
同步延迟是唯一没法消除的代价
镜像不会实时同步上游。各家的策略不同:npm 镜像通常几分钟内就能同步到新发布的包,PyPI 镜像大约 5~15 分钟,conda 一般按小时,Docker Hub 的镜像站同步最慢,官方镜像仓库的 tag 更新可能滞后数小时甚至更久。刚发布的版本在镜像上找不到是正常的,不是镜像坏了。
这个延迟会带来几个具体现象:CI 里锁定了刚发布不久的版本,本地机器拉不到;上游作者紧急撤回(yank)了一个包,镜像上还能装到;依赖锁定文件里的 integrity 校验和与镜像返回的内容不一致(因为镜像缓存了旧版本)。遇到这些先等一会儿再试,或者临时切回官方源确认不是自己代码的问题。
安全上的取舍
换成第三方镜像,等于把「你安装的每一个依赖」交给镜像运营方分发。主流镜像(阿里云、腾讯云、华为云、清华 TUNA、中科大 USTC、npmmirror)是可信的,但要理解他们的信任模型:镜像是只读转发上游文件、按上游的校验和验证后再缓存,理论上不会篡改内容;可一旦镜像被入侵或上游被投毒,你拿到的就是被改过的包。
所以有两点值得坚持:一是优先用带签名校验的生态(apt/dnf 的仓库签名、Maven 的 checksum、npm 的 integrity 哈希),校验失败时千万不要用 --force、--no-check-certificate、trusted-host 这类参数糊过去;二是不要为了图快把 sslVerify=false、strict-ssl=false 写进配置,那会让中间人有机会直接替换包内容。企业内网私有的 Nexus / Artifactory 代理则和公网镜像不同——它们通常会缓存并保留审计记录,安全性取决于你们自己的运维水平,用之前确认一下是谁在维护。
企业内网代理和公网镜像的差别
公网镜像是「大家一起用的缓存站」,内网代理是「只服务你们自己的缓存」。内网代理的好处是首次拉过的包后面都走内网、可以托管私有包、能加审计和漏洞扫描;代价是首次拉取仍然要出公网,而且代理自身的存储和带宽可能成为瓶颈,还有清理策略过激导致缓存频繁失效的问题。很多公司是两者叠加:内网代理的上游配成国内公网镜像。
最后提醒一句:本页命令是各镜像官方文档与社区通行写法的汇总,取的是「写进配置文件永久生效」这种形式。不同发行版(Debian 用 /etc/apt/sources.list 或 sources.list.d/,新版 Ubuntu 24.04 起用 deb822 格式的 .sources 文件)、不同工具版本(Docker 的 daemon.json 配置、Gradle 的 init.gradle 与 settings.gradle)写法会有差异,动手前最好对着官方文档核一遍当前版本的正确格式。