PkgMirrors.jl v1.0.0 - 在 Julia 中使用镜像站

项目地址:GitHub - sunoru/PkgMirrors.jl: Use alternative mirrors to manage your packages for Julia.

网络不稳定对在国内的用户来说是个很严重的问题,直接影响到了使用甚至安装 Julia 的体验。最近一段时间我尝试使用镜像站做源的方式解决这个问题,在浙江大学镜像站上搭建了一个有着 Julia 各个发行版以及各个库的镜像PkgMirrors.jl 即是这个镜像的客户端。

具体的介绍我就贴一下中文版的 README 吧~

PkgMirrors

在 Julia 中使用镜像站

PkgMirrors.jl 是一个用镜像站来加速下载的客户端。比如在中国在访问 GitHub 时经常会很慢,可以使用这个库来帮你安装其他库。

目前支持的镜像站(参见镜像站列表):

安装

注意:这个库只能与 Pkg3 一起使用,也就是说最低支持的 Julia 版本是 0.7。

有很多种安装方式:

julia> # 输入 "]" 以进入包管理器的 REPL 模式

(v1.0) pkg> add PkgMirrors  # 最官方的安装方式

(v1.0) pkg> add https://github.com/sunoru/PkgMirrors.jl.git  # 从源代码安装

(v1.0) pkg> add https://mirrors.zju.edu.cn/julia/PkgMirrors.jl.git@v1.0.0  # 从镜像站安装(推荐)

显然,既然你想使用这个库了,意味着你也会希望能从镜像站安装这个库本身。(虽然可能还是会从 GitHub 上克隆一遍官方的 Registry)

使用

第一次使用 PkgMirrors.jl 时,需要指定所使用的镜像:

julia> import PkgMirrors

julia> PkgMirrors.availables()  # 列出所有可用的镜像。
1-element Array{String,1}:
 "ZJU"

julia> PkgMirrors.setmirror("ZJU")  # 设定当前镜像。
[ Info: Updating mirror information...
[ Info: PkgMirror ZJU activated.
PkgMirrors.PkgMirror("ZJU", "https://mirrors.zju.edu.cn/julia")

PkgMirrors.jl 会记住你所选择的镜像,因此以后无需重新调用 setmirror

julia> import PkgMirrors
[ Info: Using saved mirror: ZJU (https://mirrors.zju.edu.cn/julia)
[ Info: Updating mirror information...
[ Info: PkgMirror ZJU activated.

选择镜像之后会自动被激活,然后你就可以用标准库中的 Pkg 来安装和更新软件包了。比如说:

julia> # Type "]" to enter Pkg REPL-mode.

(v1.0) pkg> update
  Updating registry at `C:\Users\sunoru\.julia\registries\General`
  Updating git-repo `https://mirrors.zju.edu.cn/julia/registries/General.git`
 Resolving package versions...
  Updating `C:\Users\sunoru\.julia\environments\v1.0\Project.toml`
 [no changes]
  Updating `C:\Users\sunoru\.julia\environments\v1.0\Manifest.toml`
 [no changes]

(v1.0) pkg> add RandomNumbers
 Resolving package versions...
  Updating `C:\Users\sunoru\.julia\environments\v1.0\Project.toml`
  [e6cf234a] + RandomNumbers v1.0.1
  Updating `C:\Users\sunoru\.julia\environments\v1.0\Manifest.toml`
  [e6cf234a] + RandomNumbers v1.0.1

你可以发现 Julia 语言官方的 General 登记簿(Registry)的 URL 已经被设定为你选择的镜像。

如果一个软件包不在你所选择的镜像上,则会自动通过 git clone 来下载。

当你退出 Julia 时 PkgMirrors.jl 会自动停用(比如把在硬盘上对 URL 的修改全都撤销),以免你下次不想使用它时出问题:

julia> exit()
[ Info: PkgMirror ZJU deactivated.

你也可以手动停用镜像站,或者使用如下语句清除本地缓存的信息:

julia> PkgMirrors.deactivate()
[ Info: PkgMirror ZJU deactivated.

julia> PkgMirrors.clear()
[ Info: Cache clear.

新的镜像?

若想搭建 Julia 软件包的镜像站,请参见 julia-mirror。欢迎在本 repo 中提 issue 或是发起 pull request 来补充镜像列表

问题

目前已知的问题:

  • PkgMirrors.jl 无法处理 General 登记簿以外的软件包(虽然现在唯一的镜像站也并不提供其它登记簿)。

如果有任何疑问,欢迎来提 issue 或是在 Discourse 论坛(英文中文的社区都可以)里发表问题的同时 @sunoru

开源协议

MIT License

14 个赞

喜闻乐见~:sparkles:

喜闻乐见~:sparkles:
+1

希望能加一个全局的模式,这样在命令行中执行 Julia 脚本时安装包就可以使用镜像站了。

1 个赞

@woclass 可以考虑配置一下 startup.jl

能不能不需要访问github,直接使用镜像站,因为连github完全无法访问

5 个赞

建议楼主添加一下区分是否代理的功能,PkgMirrors 中使用的base中的download函数,download本身是使用powershell,但是在download中并没有添加proxy功能,并且在调用powershell时使用了-Noprofile 参数所以用户的powershell profil配置无法使用,如果是在代理后的用户使用镜像是无法使用的。

1 个赞

分析base中的download函数 自己修改了一下:添加了一些代码,主要代码如下:
module DL_proxy
import Base: pipeline_error,pipeline,run
function download_proxy(url::AbstractString, filename::AbstractString)
ps = “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”
tls12 = “[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12”
client = “New-Object System.Net.Webclient”
proxy = “($client).proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials”
# in the following we escape ’ with ‘’ (see Escape characters - PowerShell - SS64.com)
downloadfile = “(client).DownloadFile('(replace(url, “'” => “‘’”))', ‘$(replace(filename, "’” => “‘’”))')"
# PowerShell v3 or later is required for Tls12
proc = run(pipeline($ps -Version 3 -NoProfile -Command "$tls12; $proxy; $downloadfile"; stderr=stderr); wait=false)
if !success(proc)
if proc.exitcode % Int32 == -393216
# appears to be “wrong version” exit code, based on
# Common startup tasks for Cloud Services (classic) | Microsoft Learn
error(“Downloading files requires Windows Management Framework 3.0 or later.”)
end
pipeline_error(proc)
end
filename
end
end

1 个赞

去发个 pr 吧

1 个赞

跑mirror_julia.py遇到个问题,提了issue,似乎是第一个 :grin:
另外,zju的镜像有同时提供rsync服务吗,网络条件不太好的时候,自己从零抓取文件挺费时的,能作为下游从zju的镜像rsync最好了 :grin:

能不能介绍下,怎么手动关闭镜像呢?谢谢

PkgMirrors.deactivate()

get it,谢谢了

@sunoru
julia 镜像源 502 了 https://mirrors.zju.edu.cn/julia/

已提 issue ZJU 502 · Issue #7 · sunoru/PkgMirrors.jl


建议使用的时候更新一下包,然后用中科大的源

using PkgMirrors
PkgMirrors.setmirror("USTC")
julia> PkgMirrors.availables()
2-element Array{String,1}:
 "ZJU"
 "USTC"

julia> PkgMirrors.setmirror("USTC")
[ Info: Updating mirror information...
[ Info: PkgMirror USTC activated.
PkgMirrors.Types.PkgMirror("USTC", "https://mirrors.ustc.edu.cn/julia")

如果是使用 Julia 1.1以及之后的版本,直接修改 registry 就行了~
甚至连 General 都不需要从 github clone 了,毕竟这个仓库也有点大……

(v1.1) pkg> registry add https://mirrors.ustc.edu.cn/julia/registries/General.git/
8 个赞

路过收藏,目前外网跑的还挺顺畅的。有备无患。

也可以通过 ssh 建立本地 socks5 代理(如在端口 5678),然后通过下述命令启动 Julia:

http_proxy=socks5://localhost:5678 https_proxy=$http_proxy PYTHON="" julia

PYTHON=“” 是为了防止本地 python 环境干扰Julia包的安装。

1 个赞

你好,克隆失败为什么?

julia版本1.1.0
registry命令复制

报错提醒,但是我能直接打开这个网站
ERROR: failed to clone from https://mirrors.ustc.edu.cn/julia/registries/General.git/, error: GitError(Code:ERROR, Class:Net, unexpected HTTP status code: 404)

ustc的registry出错的话可以考虑用 zju

1 个赞