voidint/g

支持环境变量G_HOME自定义g目录

voidint opened this issue · 8 comments

  • 优先读取环境变量G_HOME
  • 若环境变量G_HOME值为空,则读取默认路径~/.g
// ghome 返回g根目录
func ghome() (dir string) {
	if dir = os.Getenv("G_HOME"); dir != "" {
		return dir
	}
	homeDir, _ := os.UserHomeDir()
	return filepath.Join(homeDir, ".g")
}
  • 问题一:通过环境变量切换到非默认的G家目录后,需要手动变更环境变量GOROOTPATH等,因为这类环境变量的值还是指向的变更前的G家目录(我并不打算由g去修改.bashrc),也就是说这是一种非全自动化的切换,不够完美。

  • 问题二:由于g需要对G_HOME指向的目录拥有读写权限,这势必会导致有人使用sudo g的方式运行程序,而这种情况下原来的环境变量将丢失(sudo默认并不会继承所有环境变量),这会使得体验变差。

  • 问题一:通过环境变量切换到非默认的G家目录后,需要手动变更环境变量GOROOTPATH等,因为这类环境变量的值还是指向的变更前的G家目录(我并不打算由g去修改.bashrc),也就是说这是一种非全自动化的切换,不够完美。
  • 问题二:由于g需要对G_HOME指向的目录拥有读写权限,这势必会导致有人使用sudo g的方式运行程序,而这种情况下原来的环境变量将丢失(sudo默认并不会继承原环境变量),这会使得体验变差。

同感

  • 自定义g目录需求比较普遍,但是起码存在着上文中提及的两个主要问题且暂时没有很好的解决方案。因此,对于这类不成熟的特性,比较合适的做法是将其归类到实验特性中(许多软件都有实验特性,如Chrome)。
  • 既然要将自定义g目录纳入到实验特性中,那么如何开启实验特性?参考docker的做法,引入名为G_EXPERIMENTAL的环境变量,即G_EXPERIMENTAL=true时开启实验特性,此时G_HOME才会生效。
const (
	experimentalEnv = "G_EXPERIMENTAL"
	homeEnv         = "G_HOME"
)

func ghome() (dir string) {
	if experimental := os.Getenv(experimentalEnv); experimental == "true" {
		if dir = os.Getenv(homeEnv); dir != "" {
			return dir
		}
	}
	homeDir, _ := os.UserHomeDir()
	return filepath.Join(homeDir, ".g")
}

这样设计很奇怪不是么,g 默认安装下是不会设置 G_HOME 的,也就是说用户默认就是用 ~/.g 作为 g 目录。而要自定义 g 目录的用户,必然会手动设置 G_HOME,也会自行修改 PATH 等设置,也清楚自己设置的 G_HOME 是否要权限。

多弄一个 G_EXPERIMENTAL 来”避免“用户考虑到的问题,有点多此一举。

这样设计很奇怪不是么,g 默认安装下是不会设置 G_HOME 的,也就是说用户默认就是用 ~/.g 作为 g 目录。而要自定义 g 目录的用户,必然会手动设置 G_HOME,也会自行修改 PATH 等设置,也清楚自己设置的 G_HOME 是否要权限。

多弄一个 G_EXPERIMENTAL 来”避免“用户考虑到的问题,有点多此一举。

我也觉得有点多余

环境变量明明设置了,为啥不管用啊,还是装在C盘的默认目录;用的1.2版本,G_HOME和G_EXXXXXX也配置了

环境变量明明设置了,为啥不管用啊,还是装在C盘的默认目录;用的1.2版本,G_HOME和G_EXXXXXX也配置了

1.2.0版本中并不包含这个特性,可以拉取master分支自己编译一个。