有人可以解释为什么GOPATH方便以及它应该如何使用?

时间:2014-06-19 12:04:47

标签: go

我是Go编程语言的新手,每个教程都从将GOPATH设置为当前项目文件夹开始。

我错过了什么吗?程序员真的应该在cd到他的新Go项目文件夹时手动设置GOPATH吗?我已经阅读了几篇关于GOPATH的常见问题条目,但仍无法绕过它。

为什么GOROOT存在呢?它的目的是什么?

是否有任何自动工具可以检测当前目录是否为Go项目的根文件夹(例如某些隐藏文件)并自动将GOPATH更改为此目录?

谢谢你,任何建议都非常适合

PS。例如,如果他们生活在单一的“工作空间”环境中,我会开发完全脱节的Go项目A,B和C.我猜不是,但是我应该怎么做GOPATH和GOROOT呢?

3 个答案:

答案 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将以下文件存储在其下:

  • 源文件($ GOPATH / src)
  • 已编译的软件包文件($ GOPATH / pkg)
  • 可运行文件($ GOPATH / bin)

$ GOROOT :是Go源代码所在的地方,例如Go Standard Library。


也要从系统上的任何位置运行任何go mod init 版的可执行文件,您可能希望将go install添加到路径环境变量中,如下所示:

$GOPATH/bin

更多信息请查看this