1. 问题现象
今天遇到远程开发机的 Golang 环境问题

2. 分析过程
2.1. 环境说明
因为司内存在网络安全策略,**开发域是无法直接连接测试网域**或**生产网域**下的机器,需要通过**跳板机**器操作,为了加速本地 Coding+Debug 效率,在测试域的机器上打了**热更新的transform进程,** 用于与测试环境的热更新处理;
简要说下我的开发模式

2.2. 回顾下 Linux 配置加载文件
- 取得 bash 时需要完整的登陆流程的,就称为
login shell- 读取路径:
/etc/profile → ~/.bash_profile → ~/.bashrc
- 读取路径:
- 取得 bash 接口的方法不需要重复登陆的(比如你在原本的 bash 环境下再次下达 bash 这个命令) :
~/.bashrc

2.3. Golang 环境配置
常规情况下,我们一般习惯会在上述 Linux 的相关配置路径加入 Go Env 的相关配置,比如我这里把下面的 GOPATH 等环境配置放置在~/.my.sh 下,然后在~/.bashrc 中通过souce ~/.my.sh 包含

我的环境现象就是正常 Login Shell 后,go env 输出的GOPROXY正常,但通过 ssh remote shell 会出现问题
| |
使用 root 账号打印 GOPROXY,可以断定与 linux 账号本地环境相关
| |
2.4. bash_it 说明
bash_it 是一个 cmd shell 提示工具,~/bash_it 初始化后会在~/.bashrc 中增加很多 shell 脚本内容,其中一部分就是如果非交互环境,则不会运行
| |
2.5. $- 参数说明
继续分析,因为 bash shell 环境使用了 ~/bash_it ,会在 ~/.bashrc 加入下面内容,这个 $- 是一个 shell varibales 的属性和参数配置:
- ssh 如果按正常情况下
| |
To understand the output of echo $- you need to look up the options in your shell’s manual. For example, in Bash, echo $- outputs himBHs for me, which means that the -h, -m, -B and -H options are enabled (see help set for details), that the shell is interactive (-i) and reading from standard input (-s).
参考:
2.6. 原因 1: 加载 export GOPROXY 环境配置位置问题
错误的 source ~/.my.sh 位置,我再开发机上将相关的本地 Shell 配置都放入到 ~/.my.sh 中,然后在 ~/.bashrc 文件的最后加入。
因为 bash_it 对 $- 环境有做检测,即非交互环境会直接 return 返回,这样就会导致放置在最后的 source ~/.my.sh 中的 GOPORXY 等环境变量无法被重置;反之若直接登录的话,因为是交互 Shell 环境,则没有此问题!
2.7. 原因 2: 再看 Golang 环境变量
- 可以通过
go env -w <NAME>=<VALUE>配置 Go 环境变量,具体存储位置为os.UserConfigDir - 该位置可以通过
go env GOENV打印出来
| |
通过查看 env 文件配置,就可以看到之前错误配置的 GOPROXY 了,将其修改后就正常!
3. 小结
bash_it对~/.bashrc有改动,如果涉及非交互的 Shell 则有可能遇到加载顺序问题Golang的环境默认配置存储在~/.config/go/env修改,登录后可以被~/.bashrc配置的属性覆盖

