Fresheyeball
Fresheyeball

Reputation: 30015

Go setup on ubuntu

I am trying to setup a go dev environment on Ubuntu, and having no luck. Following directions here https://github.com/golang/go/wiki/Ubuntu

sudo apt-get install golang

Then I

mkdir $HOME/golang
export GOPATH=$HOME/golang

No dice. Even doing something simple like go version throws the following error:

go: cannot find GOROOT directory: /usr/local/opt/go/libexec

Everywhere I look online says simply not to set GOROOT. Please help, I don't understand where to go from here. This is a fresh install on a fresh VM.


GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/isaac/golang"
GORACE=""
GOROOT="/usr/local/opt/go/libexec"
GOTOOLDIR="/usr/local/opt/go/libexec/pkg/tool/linux_amd64"
TERM="dumb"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread"
CXX="g++"
CGO_ENABLED="1"

Upvotes: 6

Views: 7388

Answers (4)

karel
karel

Reputation: 5851

For golang-go from the Ubuntu repositories

This answer refers to the golang-go package from the default Ubuntu repositories, not the go-lang package that can be installed using ubuntu-make.

The key to understanding your question is the following line:

GOROOT="/usr/local/opt/go/libexec"

If you typed the command echo $GOROOT it would return:

/usr/local/opt/go/libexec

This is not what you want GOROOT to be in an installation of golang-go from the default Ubuntu repositories. In a default golang-go installation in Ubuntu GOROOT refers to the root of the directories where go is installed. Running the command which go returns /usr/bin/go and examining the /usr/bin/go file reveals that it is symlinked to the go executable file located at /usr/lib/go-1.6/bin/go . There is your missing GOROOT. If you installed golang-go using the command sudo apt install golang-go GOROOT is the root directory of all the go files that are installed by golang-go; it is /usr/lib/go-1.6 !

It remains to apply the change in GOROOT to /etc/environment by editing the environment file in nano text editor with the following command:

sudo nano /etc/environment

Right after where it says PATH=" in /etc/environment insert the following text to add it to the PATH:

/usr/lib/go-1.6:

Press the keyboard combination Ctrl+O and after that press Enter to save the file being edited in nano to its current location. Press the keyboard combination Ctrl+X to exit nano.

The : character after /usr/lib/go-1.6 is the delimiter character which separates the go path from the next path. It is advisable to check your work for accuracy with the following command:

cat /etc/environment

Now that you have updated the PATH you need to reload /etc/environment by logging out and logging back in.

Upvotes: 1

twitu
twitu

Reputation: 625

Adding to @sadlil's answer, you can have a compound GOPATH. You might have a separate directory where you have all your projects and you want to keep this directory structure. Create a go directory in your all_projects directory and append it to the GOPATH.

This is my .bashrc.

export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
export GOPATH=$GOPATH:$HOME/all_projects/go  # add projects directory

Another point to note is that go prefers a specific directory structure. For e.g. if you are working on a project you host at github.com, you can have the following directory structure.

   go
   |-bin
   |-pkg
   |-src
   |---github.com
   |-----username
   |-------reponame

This youtube video was very helpful in setting up VS Code for go.

Upvotes: 0

Fresheyeball
Fresheyeball

Reputation: 30015

So I eventually figured this out, and boy was it dumb on my part. I had a script that was effecting $GOROOT, and learned alot. Here are the big lessons:

  • Do NOT use sudo apt-get install golang it is out of date and doing so means you now have to revert the install. sudo apt-get install golang-go is also out of date. Just don't use apt-get.
  • sudo apt-get purge golang does not reset environment variables or delete all go related folders.
  • unset GOPATH GOHOME GOROOT is important cleanup before trying another install

  • ONLY install via tar.gz from the golang website

  • GOROOT means the folder where go's internal files live, so basically where ever the contents of the tar.gz lives on your system. Typically /usr/local/go
  • GOHOME does not need to be set. If you set it, use unset
  • GOPATH is the location of your workspace, you need to mkdir to create that folder as well as set the GOPATH environment variable.
  • Your path needs to included $GOROOT/bin:$GOPATH/bin for the setup to function.

Usage of custom scripts that effect .zshrc or bashrc or profile should not contain setting of $GOROOT!!

Upvotes: 10

sadlil
sadlil

Reputation: 3163

On my ubuntu machine i installed go by following those simple steps:

$ wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz
$ rm go1.4.2.linux-amd64.tar.gz

Add go to your $PATH variable

$ mkdir $HOME/go
$ nano ~/.bashrc
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
$ source ~/.bashrc

This Works just fine.

Upvotes: 10

Related Questions