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

注:PkgServer 的使用需要 Julia v1.4.0 及以后版本。对于 v1.4.0 以前的版本,则需要使用 PkgMirrors. (不建议使用)

注:关于 Julia 版本,因为 Julia 目前还处于发展阶段,所以一般的建议是:除非有特殊需求,否则最好使用最新稳定版. 对于国内用户而言,同样不推荐使用 Julia Pro 全家桶系列。


PkgServer 列表

注:如果你在使用 Julia 1.5.0 及以上版本,则默认使用官方服务器 pkg.julialang.org. 除非有特定需求,否则不需要进行接下来的任何设置就可以使用。

注:对于国内用户,pkg.julialang.org 会自动导向北京、上海或者广州的服务器。(感谢南科大与华为提供的支持,感谢 SJTUG 镜像站作为国内服务器的上游存储)

  • 官方默认服务器:https://pkg.julialang.org (会根据地域自动导流到下述的区域服务器上)
    • 北京 https://cn-northeast.pkg.juliacn.com
    • 上海 https://cn-east.pkg.juliacn.com
    • 广州 https://cn-southeast.pkg.juliacn.com
    • 韩国 https://kr.pkg.julialang.org
    • 新加坡 https://sg.pkg.julialang.org
    • 北美 https://us-east.pkg.julialang.org
    • 更多信息请参考 https://status.julialang.org
  • 国内镜像站:

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"

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

using JuliaZH # 在 using 时会自动切换到国内镜像
JuliaZH.set_mirror("BFSU") # 手动指定为 BFSU 镜像
JuliaZH.mirrors # 查看目前记录的镜像地址

永久使用

通用方法

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

# 在 ~/.julia/config/startup.jl 中添加下面这一行内容
ENV["JULIA_PKG_SERVER"] = "https://pkg.julialang.org"

JuliaZH 提供了一个简易的配置工具来一键修改 startup.jl

julia> JuliaZH.generate_startup("default")
┌ Info: 添加 PkgServer
│   服务器地址 = "https://pkg.julialang.org"
└   配置文件 = "/root/.julia/config"

julia> JuliaZH.generate_startup("BFSU")
┌ Info: 更新 PkgServer
│   原服务器地址 = "https://pkg.julialang.org"
│   新服务器地址 = "https://mirrors.bfsu.edu.cn/julia"
└   配置文件 = "/root/.julia/config"

Linux/macOS Bash

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

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

Windows

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

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

B6E63F5B2A9B3972580BAC917E264F90


常见问题

PkgServer 和 PkgMirrors 有什么区别?

一般来说,Julia 装包时涉及到三个内容的下载:

  1. General 注册表
  2. 包的源代码
  3. 包的二进制依赖 (Artifacts)

PkgServer 提供全部的镜像,而 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


其他信息


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

更新历史
  • 20200822 @johnnychen94 更新BFSU镜像站的URL,以及在指南中不再建议使用 BFSU 的 julia-general.git 镜像
  • 20200822 @johnnychen94 添加TUNA镜像站
  • 20200805 @johnnychen94 添加SJTU镜像站
  • 20200805 @johnnychen94 删除ECNU校内镜像站,因为这个仅限局域网访问
  • 20200710 @johnnychen94 说明官方Pkg server 与BFSU镜像的差异
  • 20200707 @johnnychen94 更新国内PkgServer
  • 20200628 @johnnychen94 BFSU镜像站提供了General的镜像仓库,因此不再维护gitee上的版本
  • 20200628 @johnnychen94 因为失效,删除 @WeiMing 提供的 PkgServer
  • 20200618 @woclass 添加 TOC
8赞

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

2赞

有对比数据吗?搞得我都不知道怎么选择了。 :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的优化可能情况会变

1赞

京ICP备17009874号-2