|
|
发表于 2022-10-10 10:41:22
|
显示全部楼层
全局一个 gopath 和 每个项目一个单独的 gopath, 各有优缺点.
针对2种选择, 各推荐一个较优实践(欢迎分享更好的做法).
golang 官方文档里的选择:
https://golang.org/doc/code.html对应中文文档:
如何使用Go编程
stackoverflow 上两种选择, 也是一半一半.
Whats a good best practice with Go workspaces?
------------------------ 全局一个 gopath 做法 -------------------------------------
我个人开发环境是设置一个 gopath, 配合 glide 管理.
全局一个 gopath 较优方案:
github管理源码 + glide(go 包管理工具)管理依赖包 glide 介绍:
1.是一个 golang 的包管理工具.
2. 功能类似 Python 的 pip + virtualenv. (个人理解)
3. 可以锁定项目版本, 会在当前工程目录创建 vendor 目录, 存放所有依赖包.(可认为是个虚拟隔离环境)
4. 默认优先从 vendor 下搜索依赖, 找不到, 再从全局 gopath 找.
5. 这样不会污染全局的包(避免各项目依赖包版本冲突问题). glide 工具:
GitHub - Masterminds/glide: Package Management for Golang
用法:
Getting StartedGolang 套件管理工具 Glide
glide使用 - golang
如何实践, 可以参考 gogs 项目对 glide 的应用:
GitHub - gogits/gogs: Gogs (Go Git Service) is a painless self-hosted Git service.
------------------------ 每个项目设置一个 gopath 推荐做法 ------------------------
per 项目 per gopath 推荐做法:
使用如下 脚本, 初始化.(非原创)
优点:
1. 自动创建 项目目录结构.
2. 每个项目都是设置临时的 gopath, 避免污染全局的 gopath, 属于随用随初始化, 用完就扔那种.
用法:
保存如下脚本内容到: create_go_proj.sh
执行如下命令, 创建项目初始工程目录:
sh ./create_go_proj.sh myproject
#!/bin/bash########################################################## Module : mk_go_pro.sh# Author : Blair Zhong# Created : 2013.07.23# Modify :# Version : 1.0# Useage : ./mk_go_pro.sh# ./mk_go_pro.sh porject_name# Description: 创建一个go可编译的工程#————————————–————————————–## 根据 Go语言学习园地博客的帖子编写,如有侵权请联系本人# http://blog.studygolang.com/2012/12/go项目的目录结构/## 默认情况下运行本程序,会生成如下目录和文件:# test# ├── bin# ├── install.sh# ├── pkg# └── src# ├── config# │ └── config.go# └── test# └── main.go#————————————–————————————–# 5 directories, 3 files## 其中:# 1, install.sh为安装文件,# 2, config.go为test项目的配置文件# 3, main.go这个你懂的## 生成完毕之后运行进入test目录,运行install.sh会生成如下文件和目录# ├── bin# │ └── test# ├── install.sh# ├── pkg# │ └── darwin_amd64# │ └── config.a# └── src# ├── config# │ └── config.go# └── test# └── main.go# 6 directories, 5 files## 多了两个文件# 1, bin目录下的test,这个是可执行稳健# 2, pkg/darwin_amd64下的config.a,这个是config编译后产生的文件## enjoy it!#########################################################PWD=$(pwd)cd $PWDif [[ "$1" = "" ]]; thenecho "Useage: ./mk_go_pro.sh porject_name"echo -ne "Please input the Porject Name[test]"read Answerif [ "$Answer" = "" ]; thenecho -e "test";PRO_NAME=test;elsePRO_NAME=$Answer;fielsePRO_NAME=$1;fi##########################################################创建目录echo "Init Directory …"mkdir -p $PRO_NAME/binmkdir -p $PRO_NAME/pkgmkdir -p $PRO_NAME/src/configmkdir -p $PRO_NAME/src/$PRO_NAME##########################################################创建 install.sh 文件echo "Create install/install.sh …"cd $PRO_NAMEecho "#!/bin/bash" > install.shecho "if [ ! -f install.sh ]; then" >> install.shecho "echo "install must be run within its container folder" 1>&2" >> install.shecho "exit 1" >> install.shecho "fi" >> install.shecho >> install.shecho "CURDIR=\`pwd\`" >> install.shecho "OLDGOPATH=\"\$GOPATH\"" >> install.shecho "export GOPATH=\"\$CURDIR\"" >> install.shecho >> install.shecho "gofmt -w src" >> install.shecho "go install $PRO_NAME" >> install.shecho "export GOPATH=\"\$OLDGOPATH\"" >> install.shecho >> install.shecho "echo "finished"" >>install.shchmod +x install.sh#创建 config.go 文件echo "Create src/config/config.go …"cd src/configecho package config > config.goecho >> config.goecho func LoadConfig\(\) { >> config.goecho >> config.goecho "}" >> config.go#创建 main.goecho "Create src/$PRO_NAME/main.go …"cd ../$PRO_NAME/echo "package main" > main.goecho >> main.goecho "import (" >> main.goecho " \"config\"" >> main.goecho " \"fmt\"" >> main.goecho ")" >> main.goecho >> main.goecho "func main() {" >> main.goecho " config.LoadConfig()" >> main.goecho " fmt.Println(\"Hello $PRO_NAME!\")" >> main.goecho "}" >> main.goecho "All Done!"
附: 原脚本来源
Go项目的目录结构 —— Go语言学习园地博客 |
|