惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
T
Threat Research - Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog
P
Privacy & Cybersecurity Law Blog
H
Help Net Security
云风的 BLOG
云风的 BLOG
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
P
Privacy International News Feed
Blog — PlanetScale
Blog — PlanetScale
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
The Register - Security
The Register - Security
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
PCI Perspectives
PCI Perspectives
Recent Announcements
Recent Announcements
Martin Fowler
Martin Fowler
A
About on SuperTechFans
W
WeLiveSecurity
GbyAI
GbyAI
V
Vulnerabilities – Threatpost
The GitHub Blog
The GitHub Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Check Point Blog
Y
Y Combinator Blog
月光博客
月光博客
Scott Helme
Scott Helme
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
U
Unit 42
G
Google Developers Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Threatpost
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google Online Security Blog
Google Online Security Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cisco Talos Blog
Cisco Talos Blog
博客园 - 三生石上(FineUI控件)
Hugging Face - Blog
Hugging Face - Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 司徒正美

文章列表 on polarisxu

通过一个例子让你彻底掌握 Go 工作区模式 这道题正确率竟然只有 22% Go 开源项目推荐:一个简单的 Go 练手项目 go test 如何禁用缓存? Go1.18 快讯:constraints 包被移除标准库 跟着 Go 作者学泛型 「2022 版」轻松搞定 Go 开发环境 鹅厂小哥用行动反对加班:程序员加班能被终结吗? Go 为什么选择 Gopher 作为吉祥物? 本地如何配置多个 GitHub/Gitee 账号? 为 Java 开发者准备的 Go 教程 02:Java 有而 Go 无 GitHub 发现了 studygolang 项目依赖的漏洞 Typora 宣布收费后,这款开源 Markdown 编辑器火了 为 Java 开发者准备的 Go 教程 01:漫游了 我的 2021 年终总结 泛型版 singleflight:Go 中如何防止缓存击穿? 2021 年你写了多少代码?这个 Go 工具帮你统计 Go1.18 新特性:TryLock Go 泛型入门教程 程序员瑞士军刀:各种结构的转换工具 终于有 Go 版的 Elasticsearch 了 Go泛型系列:maps 包讲解 Go 1.18 中的 any 是什么? Go1.18 快讯:新的 IP 包 Go编程模式:详解函数式选项模式 Go泛型系列:slices 包讲解 Nginx 竟然也有 playground — Go 语言构建的 Go泛型系列:Go1.18 类型约束那些事 Go1.18 快讯:Module 工作区模式 Go1.18 快讯:新增的 Cut 函数太方便了 Go1.18 快讯:废弃了这个 API Go1.18 快讯:新增字符串 Clone API Go:如何获得项目根目录? Go 如何获取和设置环境变量 重磅变动:更快找到微信公众号里的Go文章 Go 这样设置版本号:我们的项目也可以 假期结束,推荐 2 本 manning 出的 Go 图书 Go Fiber 框架系列教程 04:测试应用 Go Fiber 框架系列教程 03:中间件 Go泛型系列:提前掌握Go泛型的基本使用 推荐一个 Go GUI 实战项目 Go Fiber 框架系列教程 02:详解相关 API 的使用 Go Fiber 框架系列教程 01: 和 Express 对比学习 Go Module:私有不合规库怎么解决引用问题 Go1.17 新特性:go get 变了 Go1.17 新特性:testing 包的相关变化 StackOverflow 上关于 Go select 死锁的问题 新书推荐:用 Gin 框架构建分布式应用 Go 官网要变天。。。 Gin 这是要成为 Go 官方框架? 扬眉吐气:刚刚,Go 已经默认支持泛型了 Go 1.17 新特性:Module 有哪些变化? Go 第三方库推荐:类型转换如此简单 担心密码提交到 GitHub?建议使用这个 Go 开源工具 Go 的时间格式化为什么是 2006-01-02 15:04:05? GitHub 为 Go 社区带来安全支持 Go开源项目推荐:500行代码确认请求时间花在哪 一道关于 len 函数的诡异 Go 面试题解析 厉害了我的 Go:推荐系统都有开源实现 Go1.17 新特性:新版构建约束 这个工具真好:看看你的Go项目依赖有无漏洞 网友很强大,发现了Go并发下载的Bug Rust 劝退系列 09:函数 Go项目实战:一步步构建一个并发文件下载器 这本 Go 新书挺期待的:100 个常见错误 Go 启用新的官方问答社区 这是要干嘛?!微软招 Go 编译器全职开发人员 Go1.17 快报之标准库越来越注重易用性 Go1.17 新特性之切片变数组 回顾 Go 官网的演变史 站长8年前的Go代码竟然进入大厂的项目里了 Go图书翻译:一个好消息,一个坏消息 不怕烂尾!决定组织翻译这本 Go 图书 Rust 劝退系列 08:模式匹配 一本花了2.5年写成的Go免费在线图书 被黑惨了:一句话,说明自己会 Go,咋整? Go1.16 中的新函数 signal.NotifyContext 怎么用? Go 1.17 新特性提前学之测试执行随机化 Rust 劝退系列 07:流程控制 官方的 Go 多版本管理:使用和原理 Rust新书:给你一个劝退的理由 周刊题解:常量表达式这个规则应该了解下 盘点那些使用 Go 语言的国外公司 编写了50万行Go代码是一种什么体验 Rust 劝退系列 06:常量 Uber 使用 Go 的规模这么大?!都自己定制的 Go 编译器了 Go Team Leader — rsc 大神新开源了一个库,增强模板功能 再一次看到了 Go 的节制:int128 类型要不要支持? Rust 劝退系列 05:复合数据类型 「卷」有理论依据:海勒姆定律—Go又是怎么卷的 Go 真的也可以进行 GUI 开发:还有这样的图书呢 Rust 劝退系列 04:基本数据类型 我的 Go 语言书单 Rust 劝退系列 03:变量 我又来推荐免费 Go 新书了:一本用 Go 讲架构的书 注释竟然还有特殊用途?一文解惑 //go:linkname 指令 这个功能,公众号、微信群会不会被玩坏? 一道 Go 闭包题,面试官说原来自己答错了:面别人也涨知识 Rust 劝退系列 02:第一个 Rust 程序 Rust 劝退系列 01:打造开发环境
终于找到了一款我喜欢的安装和管理 Go 版本的工具
2020-10-09 · via 文章列表 on polarisxu

一直以来,我都习惯通过源码安装 Go。我是这么做的:

1)Git clone Go 源码

$ git clone https://github.com/golang/go

2)需要安装什么版本就切换到对应的分支,比如安装 1.15.x

$ git checkout -b release-branch.go1.15 origin/release-branch.go1.15

如果本地之前已经存在该分支,直接 git checkout release-branch.go1.15 即可。

3)将 go 整个目录复制到 /usr/local/go1.15,编译安装

4)创建软链:

之后加上环境变量等。

如果想要切换版本,只需要做类似上面的步骤,最后将 go 这个软链指向要切换的版本。

我这种方式存在两个问题:

  • 因为 Go1.5 实现了自举,对于没有安装 Go 的系统,需要先安装 Go1.4;
  • 每次都编译,还是没那么方便,而且如果是 Windows 系统,可能会有一些问题(现在的 Windows 也可能没问题了?好久没使用 Windows 了,使用 Windows 的朋友可以留言告知下);

之后看到 gvm 这个工具,我试用了,可能是国内网络的原因,根本没法安装 Go,基本卡着不动。此外还有一些其他的解决方案,比如 goenv ,这是仿照 pyenv 和 rbenv 实现的,安装配置感觉略微有点复杂,直接没尝试。

今天发现另外一个工具,和我手动管理多版本的思路类似,所以爱上了!

1、开发 goup 的初衷

发音:Go Up。作者介绍,他开发了这个工具的原因:

1)操作系统发行版的包管理工具一般不会那么及时的升级 Go 到最新版本,特别是 Linux 发行版;

2)虽然安装和管理 Go 版本的工具不少,但作者认为要么存在一些问题,要么体验不好或缺失一些功能;(哈哈哈,很有道理是不是?造一个轮子,总是觉得别人的不够圆,自己的又大又圆,有木有?)

作者想要一个这样的工具:

  • 不需要先安装了 Go 的某个版本;(我上面的管理方案就是需要先安装某个版本)
  • 这个工具本身安装足够简单,最好一行命令搞定;
  • 跨平台,在所有操作系统运行良好,至少在类 Unix 系统运行良好;
  • 能方便的安装最新的 Go 版本;
  • 能方便的安装 Go 的任意版本,包括 tip;
  • 不会污染你的 Shell;
  • 使用 Go 语言实现;

2、安装 goup

因为 goup 本身是 Go 语言实现的,因此他通过一个脚本下载对应系统的预编译 goup 程序。当前最新版本 0.0.7 (这个工具是 9 月底开发的),当然你也可以自己手动下载这些编译好 goup 程序。(如果你本地安装了 Go 版本,直接 go get -u -v github.com/owenthereal/goup/… 安装也是可以的)

一行代码安装 goup(推荐的方式):

$ curl -sSf https://raw.githubusercontent.com/owenthereal/goup/master/install.sh | sh

3、使用介绍

看看 goup 的帮助文档:

$ goup help
The Go installer

Usage:
  goup [command]

Available Commands:
  help        Help about any command
  init        Initialize the goup environment file.
  install     Install Go by providing a version (e.g. "1.15.2", or "tip"). If empty, use the latest version.
  show        Show the current version of installed Go
  version     Show goup version

Flags:
  -h, --help   help for goup

Use "goup [command] --help" for more information about a command.
  • install:安装对应的 Go 版本,也可以是 tip。如果不提供版本,则安装当前最新版本;
  • show:显示当前生效的 Go 版本;
  • init:会在 $HOME/.go 目录下生成一个 env 文件,内容是设置 PATH 环境变量,即将 $HOME/.go/bin$HOME/.go/current/bin 加入 PATH 中;同时会往一些系统配置文件中加上 source "$HOME/.go/env"

比如我想试试还不支持 Module 的版本:1.10.8

$ goup install 1.10.8
Downloaded   0.0% (    3320 / 87999054 bytes) ...
Downloaded   3.7% ( 3260416 / 87999054 bytes) ...
Downloaded  11.7% (10338304 / 87999054 bytes) ...
Downloaded  21.1% (18563072 / 87999054 bytes) ...
Downloaded  27.9% (24592384 / 87999054 bytes) ...
Downloaded  34.8% (30588928 / 87999054 bytes) ...
Downloaded  41.6% (36618240 / 87999054 bytes) ...
Downloaded  48.4% (42549248 / 87999054 bytes) ...
Downloaded  55.2% (48611328 / 87999054 bytes) ...
Downloaded  62.1% (54640640 / 87999054 bytes) ...
Downloaded  68.9% (60669952 / 87999054 bytes) ...
Downloaded  75.8% (66666496 / 87999054 bytes) ...
Downloaded  82.6% (72695808 / 87999054 bytes) ...
Downloaded  88.8% (78135296 / 87999054 bytes) ...
Downloaded  93.3% (82100224 / 87999054 bytes) ...
Downloaded  94.4% (83083264 / 87999054 bytes) ...
Downloaded  98.7% (86851584 / 87999054 bytes) ...
Downloaded 100.0% (87999054 / 87999054 bytes)
INFO[0016] Unpacking /Users/xuxinhua/.go/go1.10.8/go1.10.8.darwin-amd64.tar.gz ...
INFO[0020] Success: go1.10.8 downloaded in /Users/xuxinhua/.go/go1.10.8
INFO[0020] Default Go is set to 'go1.10.8'

你当前系统的 Go 版本就是 1.10.8 了。如果之前安装过,上面的下载过程就没有了:

$ goup install 1.10.8
INFO[0000] go1.10.8: already downloaded in /Users/xuxinhua/.go/go1.10.8
INFO[0000] Default Go is set to 'go1.10.8'

$ goup show
go1.10.8

尽情地享受吧!

4、工作原理

这个工具的灵感来自 Rust 的工具:rustup

它的工作原理很简单,在 $HOME/.go 目录下创建对应的版本目录,然后在这个目录创建一个软链 current 来控制当前使用哪个 Go 版本。这个思路和我一直源码安装的思路类似。唯一区别是,它是从 dl.google.com 上下载对应编译好的版本。但 tip 版本,则需要 clone Go 源码,进行编译安装,因此要求有 Go 环境。

我本地 $HOME/.go 下的文件信息:

lrwxr-xr-x   1 xuxinhua  staff   28 10  9 17:16 current -> /Users/xuxinhua/.go/go1.10.8
-rw-r--r--   1 xuxinhua  staff   57 10  9 16:46 env
drwxr-xr-x  21 xuxinhua  staff  672 10  9 17:14 go1.10.8
drwxr-xr-x  22 xuxinhua  staff  704 10  9 10:03 go1.14.9
drwxr-xr-x  22 xuxinhua  staff  704 10  9 10:02 go1.15.2
drwxr-xr-x   2 xuxinhua  staff   64 10  9 17:10 gotip

5、存在的一些问题

这个工具才出来十几天,试用下来,还存在一些问题:

  • 安装最新版本,需要知道当前最新版本是哪个?这是从 https://golang.org/VERSION?m=text 获取的,但这个网址咱们无法访问;同样的道理,安装 tip 版本,源码是从 https://go.googlesource.com/go 获取的。因此目前大陆还无法使用;不过我已经给作者提了 issue,应该很快就会支持;
  • 缺失一些功能。比如我想安装某个版本,比如 1.12.x,但我希望安装的是 1.12 系列的最新版本,这时候你只能去找 1.12 的最新版本是哪个。
  • 。。。

我参照 gvm 提供的功能,给 goup 作者提了 issue,希望增加如下功能:

  • goup list 和 goup listall
  • goup uninstall

6、小结

整体上,目前 goup 的使用还是比较顺畅的。欢迎大家试用,可以顺便给个 star。对了,项目地址:https://github.com/owenthereal/goup

对了,至于为什么会需要管理多版本,我想很多人还会有这样的需求吧?!你为什么需要呢?欢迎留言。

7、更新

上面提到的点,目前差不多解决了。

  • 提供了 goup ls-ver 命令列出 Go 版本
  • 提供 goup remove 命令删除某个已安装的 Go 版本
  • 还提供了 goup upgrade 来升级自己

此外当执行 goup install 时,默认会安装当前最新发布版本,大陆会有问题,可以通过如下方式解决:

GOUP_GO_HOST=golang.google.cn goup install