我是Go编程语言的新手,每个教程都从将GOPATH设置为当前项目文件夹开始。
我错过了什么吗?程序员真的应该在cd
到他的新Go项目文件夹时手动设置GOPATH吗?我已经阅读了几篇关于GOPATH的常见问题条目,但仍无法绕过它。
为什么GOROOT存在呢?它的目的是什么?
是否有任何自动工具可以检测当前目录是否为Go项目的根文件夹(例如某些隐藏文件)并自动将GOPATH更改为此目录?
谢谢你,任何建议都非常适合
PS。例如,如果他们生活在单一的“工作空间”环境中,我会开发完全脱节的Go项目A,B和C.我猜不是,但是我应该怎么做GOPATH和GOROOT呢?
答案 0 :(得分:26)
GOPATH
的目标是将所有包集中到一个公共工作区。它本身并不是一个新概念(例如,考虑Java Classpath),但是不支持包版本化,Go的使用非常简单。
Go程序员在输入新项目文件夹时不应手动设置GOPATH
。每个项目文件夹本身应该是一个包,并且与其他包一起驻留在GOPATH
中,因此GOPATH
应该只设置一次。教程首先设置GOPATH
,以便将教程工作区与其他任何工作区隔离开(或者只是假设用户尚未设置GOPATH
)。
GOROOT
设置为Go程序员提供标准软件包,您不需要对其进行任何操作。简而言之,GOROOT
只有一条规则:永远不要触摸它。不要在其中安装任何内容,不要修改标准软件包等。
我不知道在当前目录中检测Go项目的工具,但创建它不应该非常复杂。
您如何处理不同的项目取决于您。 Go方法是将每个项目作为包放在$GOPATH/src
目录中,并从那里开始执行所有操作。由于我不是很喜欢,我将GOPATH
定义为$HOME/.go
。然后我将每个项目放在其他地方(我的计算机中的任何位置)的专用目录中,并将项目目录符号链接到我的$GOPATH/src
目录中。然后我可以使用每个Go工具链命令(例如go build myproject
),将项目用作另一个项目的包等等。
答案 1 :(得分:10)
GOPATH允许您在一个地方收集依赖源代码和生成的编译二进制文件。这似乎是一个非常有吸引力的想法。但是,我发现自己正在研究几个完全不相关的Go项目,另一种方法更适合我。
这是与Elwinar的symlnks类似但不同的策略。我在一个空文件夹中启动一个新项目并创建src
。我将这个名为env.sh的shell脚本放入文件夹:
if [ `type -p go` = "" ]; then
export PATH=$PATH:/usr/local/go/bin
fi
export GOPATH=$PWD
export PATH=$PATH:$PWD/bin
每次我开始工作时,我都会使用
. env.sh
注意点和空格 - 它们很重要。
现在,我在这个项目上所做的一切都在本文件夹中。它可能不是最广泛使用的策略,但对我来说效果很好。
另一件事:如果您的依赖项使用环境变量进行测试等,您也可以将它们放在env.sh
中。例如,Gorp有
export GORP_TEST_DSN=test/testuser/TestPasswd9
export GO_TEST_DSN=testuser:TestPasswd9@/test
答案 2 :(得分:2)
您无需设置GOPATH或GOROOT。默认情况下,GOPATH在用户/主目录下。
如果未设置GOPATH,则在Unix系统上假定为$ HOME / go,在Windows上假定为%USERPROFILE%\ go。如果要将自定义位置用作工作区,则可以设置GOPATH环境变量。
转到模块
除此之外,现在有了Go Modules支持(自Go 1.11 起),因此您不必再使用GOPATH。但是,这仍然是实验性功能。
例如,您可以转到系统中的任何目录($ GOPATH以外的目录),并且可以在此处初始化一个新的Go模块,然后可以在其中工作。不需要GOPATH。
您只需要执行一次(在目录中 ):
##First argument is the link you need
##The second argument is the total time for Sys.sleep
extract_function <- function(define_link, define_time){
print(paste0("The system will stop for: ", define_time, " seconds"))
Sys.sleep(define_time)
first <- read_html(define_link)
print(paste0("It will now return the table for link", define_link))
return(html_table(first))
}
##I added the following tryCatch function
link_try_catch <- function(define_link, define_time){
out <- tryCatch(extract_function(define_link,define_time), error =
function(e) NA)
return(out)
}
##You can now retrieve the data using the links vector in two ways
##Picking the first ten, so it should not crash on link 5
p <- lapply(1:10, function(i)link_try_catch(links[i],1))
##OR (I subset the vector just for demo purposes
p2 <- lapply(links[1:10], function(i)extract_function(i,1))
$ GOPATH :Go将以下文件存储在其下:
$ GOROOT :是Go源代码所在的地方,例如Go Standard Library。
也要从系统上的任何位置运行任何go mod init
版的可执行文件,您可能希望将go install
添加到路径环境变量中,如下所示:
$GOPATH/bin
更多信息请查看this。