Julia PkgServer 镜像服务及镜像站索引

TL;DR

下载Julia二进制文件 配置环境变量JULIA_PKG_SERVER
北京大学镜像站 https://mirrors.pku.edu.cn/julia
SJTUG 上海交通大学 Linux 用户组 https://mirrors.sjtug.sjtu.edu.cn/julia
NJU 南京大学开源镜像站 https://mirrors.nju.edu.cn/julia
同元 Julia 包服务器 https://releases.tongyuan.cc/juliapkg/original

注:

  • PkgServer 的使用需要 Julia v1.4.0 及以后版本
  • 如果你在使用 Julia 1.5.0 及以上版本,则默认使用官方服务器 pkg.julialang.org.
  • 对于国内用户,pkg.julialang.org 会自动导向北京、上海或者广州的服务器。(感谢南科大与华为提供的支持,感谢 SJTUG、USTC 镜像站作为国内服务器的上游存储)
  • pkg.julialang.org 在国内的服务器因为有带宽限制(5M)所以在速度上依然还是没有高校的镜像站体验好。
  • 同元包服务器与社区镜像站存在一些差异,见 同元 Julia 包服务器 中的说明

PkgServer 使用说明

切换 PkgServer 只需要修改环境变量 JULIA_PKG_SERVER 即可,下面以默认服务器https://pkg.julialang.org 为例来简单说明其使用方式,根据您自己的网络情况切换不同的 PkgServer 即可。若成功配置,则通过versioninfo()能看到对应的环境变量,例如:

julia> versioninfo()
Julia Version 1.4.2
Commit 44fa15b150* (2020-05-23 18:35 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.7.0)
  CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-8.0.1 (ORCJIT, skylake)
Environment:
  JULIA_PKG_SERVER = https://pkg.julialang.org

不同的系统和命令行有不同的永久设定环境变量的方式,通过搜索引擎能找到很多这方面的帮助。这里只以 Bash 和 Powershell 为例进行说明。

临时使用

  • Windows Powershell: $env:JULIA_PKG_SERVER = 'https://pkg.julialang.org'
  • Linux/macOS Bash: export JULIA_PKG_SERVER="https://pkg.julialang.org"

也可以通过 PkgServerClient 来切换镜像:

julia> using PkgServerClient # 在 using 时会自动切换到最近的服务器

julia> PkgServerClient.set_mirror("BFSU") # 手动指定为 BFSU 镜像

julia> PkgServerClient.registry_response_time() # 查看所有服务器的延迟
Dict{String, Float64} with 8 entries:
  "BFSU"      => 0.0323085
  "OpenTUNA"  => 0.146376
  "SJTUG"     => 0.0093373
  "USTC"      => 0.230767
  "SUSTech"   => 0.269097
  "TUNA"      => 0.184747
  "JuliaLang" => Inf
  "NJU"       => 0.0445983

永久使用

通用方法

这里提供一种针对 Julia 的全平台通用的方式: $JULIA_DEPOT_PATH/config/startup.jl ( 默认为 ~/.julia/config/startup.jl ) 文件定义了每次启动 Julia 时都会执行的命令,编辑该文件,根据需要选择以下两种中的一种即可:

# 每次打开 Julia 都使用固定的 pkg server
ENV["JULIA_PKG_SERVER"] = "https://pkg.julialang.org"
# 每次打开 Julia 都自动切换到最近的 pkg server
if VERSION >= v"1.4"
    try
        using PkgServerClient
    catch e
        @warn "error while importing PkgServerClient" e
    end
end

Linux/macOS Bash

Linux/macOS bash下可以通过修改 ~/.bashrc 文件来实现该目的:

# 在 ~/.bashrc 中添加下面这一行内容
export JULIA_PKG_SERVER="https://pkg.julialang.org"

Windows

路径:(右键)我的电脑 → 属性 → 高级系统设置 → 环境变量

在用户变量或者系统变量栏下 新建 来添加JULIA_PKG_SERVER 即可

B6E63F5B2A9B3972580BAC917E264F90


常见问题

PkgServer 和 PkgMirrors 有什么区别?

目前国内已经没有可用的 PkgMirrors 镜像站,请直接使用 PkgServer

官方服务器 (Pkg server) 与BFSU镜像站 (Storage server) 的区别?

官方Pkg server服务器是动态缓存性质的服务器,它本身并不存储整个Julia数据,因此当缓存未命中时,它需要临时从上游存储服务器下载数据,这个时候下载速度会变得十分缓慢。相比而言,Storage server 则是一个简单的静态 HTTP 服务器:它存储了完整的Julia生态所需的数据,因此使用时不会遇到缓存未命中的情况。另一方面,pkg server对于服务器的硬件需求非常小,因此可以不需要太高成本地部署到世界各地,而storage server则只会部署极其有限的数量(目前仅有两台)

根据 Pkg & Storage 协议的设计,Julia 用户不应该直接与 Storage server 进行连接,因为这将失去很多 Pkg server 提供的服务优化机制,例如:版本更新时只作增量下载,artifacts只下载需要的部分。

换句话说,直接使用BFSU 镜像站实际上违背了这一设计初衷,但是目前来看,由于BFSU的服务器带宽资源非常充裕,即使不采用这些优化机制,它的服务质量也比国内现存的 Pkg server 要好。

哪些内容会被镜像?

以BFSU北外镜像站为例,目前仅包含 General 以及 General 注册表中记录的包。对于未注册到 General 中的包是无法镜像的,例如若以下面这种指定 URL 的方式来装包的话,所有数据依然会从原始地址进行下载。

]add Flux#master
]add https://github.com/FluxML/Flux.jl.git
Pkg.add(PackageSpec(url="https://github.com/FluxML/Flux.jl.git"))

为什么 build 过程还是很慢?

有两类数据不会被镜像:

  1. build.jl 文件中硬编码的下载地址,例如GR
  2. Artifacts.toml中没有给出download项的资源, 例如TestImages

在安装这两类包时,部分数据依然是从原始地址进行下载,所以在网络不稳定时,build 过程依然会耗时很长或者失败。

为什么还是从 github 更新 General?

如果你看到下面这张图的话,说明你的 General 注册表依然是从原始地址(Github)进行更新,这是因为早期的 Julia 在拉取 General 时是通过 git clone 的方式进行的,为了保证Julia 版本的向前兼容,所以会依旧采用 git clone 的方式进行。

简单的解决方案是直接重置 General 注册表,这样它会直接从镜像站拉取数据

(@v1.4) pkg>  registry rm General
(@v1.4) pkg>  registry add General

但需要注意的是:这样一来在使用 1.4 之前 Julia 就会因为不支持 PkgServer 的原因而无法更新 General 了。(除非有特别理由,对于国内用户,我们推荐使用 Julia 1.4 及更新的版本)

JuliaPro 如何设置 BFSU 镜像站

不,你并不想用 JuliaPro. 对于国内用户而言,强烈推荐使用 julia + Atom/VSCode/Ijulia 等自行搭建环境的方式来使用。

JuliaPro 有一个PkgServer的验证过程,而 BFSU 镜像并不是一个典型的PkgServer,所以实际上并不支持这一功能。换句话说,你需要手动做一些调整来骗过 JuliaPro


其他信息


为方便起见,设置了所有人都可以编辑该帖子来维护服务器列表和使用说明

更新历史
12 个赞

这个帖子下面的回复有一些过长了,因此我删掉了一些已经过时、已经被整合起来的回复,来方便其他用户查阅。

3 个赞

有对比数据吗?搞得我都不知道怎么选择了。 :rofl:

实际测试一下就好了,例如我这边的测试情况是:

# bash

# 21s
time JULIA_DEPOT_PATH=$PWD/tmp JULIA_PKG_SERVER="https://mirrors.bfsu.edu.cn/julia/static" julia -e 'using Pkg; pkg"add Images"'

# 71s
time JULIA_DEPOT_PATH=$PWD/tmp1 JULIA_PKG_SERVER="https://cn-east.pkg.julialang.org" julia -e 'using Pkg; pkg"add Images"'

装包的时候观察一下网络流量啥的,大概能得到类似的结论。

这个只是目前的现状,以后随着PkgServer的优化可能情况会变

2 个赞

镜像站的状态有更新:

$ curl https://mirrors.sustech.edu.cn/julia
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx-n.wtf/1.25.0</center>
</body>
</html>

其它镜像目前在正常运行。

因为安全因素,443端口被我们服务器管理员禁了,这时怎么下载新的包啊

文件-北京大学开源镜像站 (pku.edu.cn) 北大有

遇到相似的问题,不知道有没有啥办法解决