Setting `GOPATH` for each vscode project


Setting `GOPATH` for each vscode project



Setting the GOPATH variable global as an enviroment variable works fine with Visual Studio Code.


GOPATH



But setting a project specific variable globally doesn't seem very nice to me. Consider you have multiple Go projects, you would have to change this variable each time you, compile, debug, ... etc. a project.


Go



Is there a possibility to set the GOPATH variable as a project variable in Visual Studio Code? Ether in settings.json or launch.json?


GOPATH


settings.json


launch.json





don't try to change GOPATH for each project, use vendor folder
– n00dl3
Nov 21 '16 at 8:56


GOPATH


vendor




4 Answers
4



Go 1.5 added the vendor directory that allows a per-project dependency management.



If there is a source directory d/vendor, then, when compiling a source file within the subtree rooted at d, import "p" is interpreted as import "d/vendor/p" if that path names a directory containing at least one file with a name ending in “.go”.



source



This feature has been enabled by default with Go 1.6:



Go 1.5 introduced experimental support for a “vendor” directory that was enabled by an environment variable. In Go 1.6, the feature is now enabled by default.



source



Even with the 1.6 version, depending on the tools you use, you might need to set the GO15VENDOREXPERIMENT environment variable to 1 (export GO15VENDOREXPERIMENT=1 on unix-based OS)


GO15VENDOREXPERIMENT


1


export GO15VENDOREXPERIMENT=1



In addition to vendor folder, you still can have one GOPATH per project.



See "GOPATH from go.inferGopath setting":


GOPATH


go.inferGopath


GOPATH


go.inferGopath



Setting go.inferGopath overrides all of the above.
If go.inferGopath is set to true, the extension will try to infer the GOPATH from the path of the workspace i.e. the directory opened in vscode. It searches upwards in the path for the src directory, and sets GOPATH to one level above that.


go.inferGopath


go.inferGopath


true


GOPATH


src


GOPATH



For example, if your project looks like /aaa/bbb/ccc/src/..., then opening the directory /aaa/bbb/ccc/src (or anything below that) will cause the extension to search upwards, find the src component in the path, and set the GOPATH to one level above that i.e. GOPATH=/aaa/bbb/ccc.


/aaa/bbb/ccc/src/...


/aaa/bbb/ccc/src


src


GOPATH


GOPATH=/aaa/bbb/ccc



This setting is useful when you are working on different Go projects which have different GOPATHs. Instead of setting the GOPATH in the workspace settings of each project or setting all the paths as ;/: separated string, you can just set go.inferGopath to true and the extension uses the right GOPATH automatically.


GOPATH


GOPATH


;/:


go.inferGopath


true


GOPATH


GOPATH


go.toolsGopath



By default, all the dependent Go tools are used from the GOPATH derived from the above logic.
If they are available on your PATH, the PATH is used to locate the Go tools.
If the Go tools are not in your path, you might end up with the same Go tools installed in each of your GOPATHs.
To prevent the Go tools from cluttering your GOPATH, use the go.toolsGopath setting to provide a separate location for the Go tools.


GOPATH


PATH


PATH


GOPATH


GOPATH


go.toolsGopath



The first time you set go.toolsGopath, you will have to run Go: Install Tools command so that the Go tools get installed in the provided location.


Go: Install Tools



The GOPATH is your workspace and it's divided in


GOPATH/
|- bin/
|- pkg/
|- src/ <--- your projects are saved here
|- .../my_project1
|- .../my_project2



With this separation, your don't need to set a new GOPATH for each project. I recommend you read How to Write Go Code





This is not very sufficient when you have a solution with different projects of different languages.
– Matthias Lochbrunner
Nov 21 '16 at 9:06





What do you mean with different languages? GOPATH is only your workspace for yours golang projects. If you're using other languages, they're not affected by GOPATH env variable. If you're taking about versioning, the vendor directory is your solution.
– Motakjuq
Nov 21 '16 at 9:22





Consider you are writing applications of many microservices each and in each one of them is written in Go the others in C++, JavaScript, whatever... . Then your workspace tree looks strange...
– Matthias Lochbrunner
Nov 21 '16 at 12:28


Go


C++


JavaScript



set workspace settings, in windows:


workspace settings


ctrl+,



set workspace setting:


{
"go.gopath": "d:gopath;E:src"
}



use ; for multiple path


;






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Comments

Popular posts from this blog

paramiko-expect timeout is happening after executing the command

how to run turtle graphics in Colaboratory

Export result set on Dbeaver to CSV