从 GitHub 上下载文件的一点经验
楚新元 / 2023-10-13
曾几何时,当我看到统计之都上的一篇文章《用 R 语言的 blogdown+hugo+netlify+github 建博客》,我也非常想利用 blogdown 和 hugo 搭建一个属于自己的博客,没有广告,分享一些关于 R 语言的编程知识,同时也方便自己某一天用到。想法虽好,可是 blogdown 默认的主题托管在 GitHub 上,hugo 也在 GitHub 上,这两个问题对于当时的我简直是要命的,因为我无法访问 GitHub,我差点因此放弃搭建博客。可是后来这些问题还是逐个被我克服了,感谢网友的分享的经验。
下载 GitHub 仓库文件顺利建站
blogdown 默认的主题以及 hugo 官网上的博客主题都托管在 GitHub 上,当时我是导入到 Gitee 然后再下载。但是 hugo 软件就没办法这么下载了,因为你从 GitHub 上导入到 Gitee 上的是源代码,这个时候我找到了一个神奇的网站 https://hub.fastgit.org1,这个网站和 GitHub 基本上做到了实时同步,可以通过这个网站找到 hugo 软件的下载地址,然后通过 https://d.serctl.com/ 网站下载下来。基本的原材料备齐了,剩下的步骤对我来说相对简单多了,因为有现成的教程。所以我的博客得来不易,一直都是我割舍不下的孩子一般。
如果你没时间听我讲故事,那么你现只需要记住目前能用的两个有用的网站:一是 Gitee;二是 https://d.serctl.com/。
访问 GitHub 镜像网站隔靴挠痒
在我没有访问 GitHub 的时候全靠别人博客上的二手资料,对的错的我不知道,只能一个个试错,直到可以访问 GitHub 的镜像网站(https://hub.fastgit.org),很多问题其实在项目的 issues 里可能已经解决了。另外,还可以找到了很多与 R 相关的项目,以及比较牛的开发者。
为了方便自己,也为了方便其他人,我套壳 remotes 包开发了 ipkg 包,实现了安装托管在 GitHub 上的 R 包,一开始代码很简单,但是很实用,不妨贴出来:
install_github = function(pkg) {
url = paste0("https://hub.fastgit.org/", pkg, ".git")
remotes::install_git(url)
}
继续更新 ipkg 包方便你我他
fastgit 这个镜像网站对我就是昙花一现,还好最近找到另外两个代理网站,ipkg 包的代码也进一步完善2,这两个代理网站只要有一个能正常连接就行,最新版的代码不妨也放出来:
# Install GitHub packages via the proxy site
install_github = function(
repo,
subdir = NULL,
ref = NULL,
upgrade = c("default", "ask", "always", "never"),
force = FALSE,
quiet = FALSE,
build = TRUE
) {
# Alternate proxy address
proxy = c(
"https://ghproxy.com/",
"https://gh-proxy.com/"
)
# Determine a proxy address
if (conn_test(proxy[1]) == "ok") {
proxy_url = paste0(proxy[1], "https://github.com/", repo, ".git")
} else {
proxy_url = paste0(proxy[2], "https://github.com/", repo, ".git")
}
# Install GitHub package
remotes::install_git(
url = proxy_url,
subdir = subdir,
ref = ref,
upgrade = upgrade,
force = force,
quiet = quiet,
build = build
)
}
其中 conn_test()
用来测试网站是否连接正常,代码如下:
# Connection test
conn_test = function(url) {
result = ""
tryCatch(
{
response = httr::GET(url)
if (httr::status_code(response) == 200) {
result = "ok"
} else {
result = "no"
}
},
error = function(e) {}
)
return(result)
}
与此同时,我顺便写了个下载文件的函数,在此就不过多介绍了,ipkg 包已发布到 CRAN 上了,详见:https://CRAN.R-project.org/package=ipkg。
靠谱的终极备用杀招留待后用
统计之都上的一篇帖子,我才了解到于淼教授等人开发的一个关于 R 的博客聚合网站,我很好奇,也依葫芦画瓢通过 GitLab CI + Rocker 重现了一遍3,受益匪浅。后来我发现 GitLab CI + Rocker 可以干的事情还很多,比如生日当天给好友发祝福邮件等定时任务,我还专门写了一篇文章介绍如何使用他们,详见《当 Rocker 遇到 GitLab CI》,只不过这篇文章以画图为例,其实代码改为 download.file()
就可以很方便的下载任何网站的文件。
-
这个网站后来改为 https://hub.fastgit.xyz,再后来就打不开了。 ↩︎
-
完全是套壳
download_file()
和remotes::install_github()
。 ↩︎ -
不要问我为什么不用 GitHub Action,一来是打开 GitHub 实在是龟速啊,二来我被墙怕了,有阴影。 ↩︎