Entendendo o GOPATH

Introdução

Este artigo irá orientá-lo para entender o que é o GOPATH, como ele funciona e como configurá-lo. Este é um passo crucial para configurar um ambiente de desenvolvimento em Go, além de entender como o Go encontra, instala e compila arquivos fonte. Neste artigo, usaremos o GOPATH ao fazer referência ao conceito da estrutura de pastas sobe a qual iremos discutir. Vamos usar $GOPATH para nos referir à variável de ambiente que o Go usa para encontrar a estrutura de pasta.

É através de um Go Workspace que o Go gerencia nossos arquivos fonte, binários compilados e objetos em cache usados para obter uma compilação mais rápida posteriormente. O normal e também o recomendável é ter somente um Go Workspace, embora seja possível ter vários espaços. O GOPATH atua como a pasta raiz de um espaço de trabalho.

Configurando a variável de ambiente $GOPATH

A variável de ambiente $GOPATH lista locais para o Go procurar por Go Workspaces.

Por padrão, o Go pressupõe que o nosso local da GOPATH fique em $HOME/go, na qual $HOME é o diretório raiz da nossa conta de usuário em nosso computador. Podemos alterar isso definindo a variável de ambiente $GOPATH. Para um estudo mais aprofundado, siga este tutorial no artigo sobre Como ler e definir variáveis de ambiente em Linux.

Para obter mais informações sobre a configuração da variável $GOPATH, consulte a documentação do Go.

Além disso, esta série traz orientações sobre a instalação do Go e a configuração de um ambiente de desenvolvimento em Go.

$GOPATH não é $GOROOT

O $GOROOT é onde o código,o compilador e as ferramentas do Go se encontram — este** não **é o nosso código fonte. O $GOROOT é geralmente algo como /usr/local/go. Nosso $GOPATH é geralmente algo como $HOME/go.

Embora não precisemos mais configurar especificamente a variável $GOROOT, ela ainda é mencionada em materiais mais antigos.

Agora, vamos discutir a estrutura do Go Workspace.

Anatomia do Go Workspace

Dentro de um Go Workspace, ou GOPATH, há três diretórios: bin, pkg e src. Cada um desses diretórios tem um significado especial para a cadeia de ferramentas Go.

.
├── bin
├── pkg
└── src
  └── github.com/foo/bar
    └── bar.go

Vamos ver cada um desses diretórios.

O diretório $GOPATH/bin é onde o Go coloca binários que o go install compila. Nosso sistema operacional usa a variável de ambiente $PATH para encontrar aplicativos binários que possam ser executados sem um caminho completo. É recomendável adicionar esse diretório à nossa variável global $PATH.

Por exemplo, se não adicionarmos $GOPATH/bin ao $PATH para executar um programa dali, teríamos que executar:

  • $GOPATH/bin/myapp

Quando o $GOPATH/bin é adicionado ao $PATH, podemos fazer a mesma chamada desta forma:

  • myapp

O diretório $GOPATH/pkg é onde o Go armazena arquivos de objeto pré-compilados para acelerar a compilação subsequente de programas. Normalmente, a maioria dos desenvolvedores não precisará acessar esse diretório. Se tiver problemas com a compilação, você pode excluir esse diretório com segurança e o Go irá então recompilá-lo.

O diretório src é onde todos os nossos arquivos .go, ou código fonte, devem estar localizados. Isso não deve ser confundido com o código fonte que as ferramentas do Go usa, as quais ficam localizadas no $GOROOT. À medida que escrevermos aplicativos, pacotes e bibliotecas em Go, colocaremos esses arquivos em $GOPATH/src/path/to/code.

O que são pacotes?

O código do Go é organizado em pacotes. Um pacote representa todos os arquivos em um único diretório no disco. Um diretório pode conter apenas certos arquivos do mesmo pacote. Os pacotes são armazenados com todos os arquivos Go fonte gravados pelo usuário, sob o diretório $GOPATH/src. Podemos entender a resolução de pacotes importando pacotes diferentes.

Se nosso código reside em $GOPATH/src/blue/red, então seu nome de pacote deve ser red.

A instrução de importação para o pacote red seria:

import "blue/red"

Os pacotes que residem em repositórios de código fonte, como o GitHub e o BitBucket, têm o local completo do repositório como parte de seu caminho de importação.

Por exemplo, importaríamos o código fonte em https://github.com/gobuffalo/buffalo usando o seguinte caminho de importação:

import "github.com/gobuffalo/buffalo"

Portanto, esse código fonte estaria no seguinte local em disco:

$GOPATH/src/github.com/gobuffalo/buffalo

Conclusão

Neste artigo, discutimos o GOPATH como um conjunto de pastas dentro das quais o Go espera que o nosso código fonte resida, bem como o que são e o que contêm tais pastas. Discutimos como alterar essa localização do padrão $HOME/go para o que for escolhido pelo usuário, definindo a variável de ambiente $GOPATH. Por fim, discutimos como o Go procura pacotes dentro daquela estrutura de pastas.

Apresentado no Go 1.11, o objetivo do Go Modules é substituir o Go Workspaces e o GOPATH. Embora seja recomendável começar a usar módulos, alguns ambientes, como ambientes corporativos, podem não estar prontos para usá-los.

O GOPATH é um dos aspectos mais complicados da configuração do Go. Porém, uma vez configurado, normalmente podemos esquecer que ele existe.

Source: DigitalOcean