Instalar Go en Linux

Instalar Go en Linux

Instalar Go es bastante sencillo, con solo seguir unas pocas instrucciones cualquiera puede hacerlo.

Instalar Go es bastante sencillo, con solo seguir unas pocas instrucciones cualquiera puede hacerlo.

La forma más rápida de instalarlo es descargando la versión binaria, si se quiere compilar desde el código fuente, en esta sección explico el procedimiento para hacerlo.

Nota

Para evitar conflictos con instalaciónes actuales, recomiendo ejecutar todos los comandos de este artículo en una carpeta que no sea $HOME.

Nota

Para instalar otra versión o usar otra arquitectura, solo hay que cambiar 1.17.7 o amd64 por los valores deseados en los comandos.

Si se hace algún cambio, las sumas de comprobación de los archivos no serán iguales a las de este artículo.

1. Descargar los binarios.

$ wget https://dl.google.com/go/go1.17.7.linux-amd64.tar.gz
$ sha256sum -c <(echo "02b111284bedbfa35a7e5b74a06082d18632eff824fd144312f6063943d49259  go1.17.7.linux-amd64.tar.gz")
go1.17.7.linux-amd64.tar.gz: OK
$ tar -xf go1.17.7.linux-amd64.tar.gz

2. Verificar que funciona correctamente.

$ go/bin/go version
go version go1.17.7 linux/amd64

3. Eliminar cualquier instalación existente

# rm -rf "$(go env GOROOT)"
# rm -f "$(command -v gofmt)" "$(command -v go)"

4. Mover a /usr/lib.

# mv go /usr/lib/

5. Agregar los binarios a la lista de comandos del sistema.

# ln -sf /usr/lib/go/bin/* /usr/bin/
Nota

Es posible instalar Go en una ruta personalizada e incluso sin permisos de super-usuario, los pasos serían muy parecidos a los anteriores, solo que hay que cambiar las rutas.

4. Mover a $HOME/.local/lib/.

$ mkdir -p "$HOME/.local/lib"
$ mv go "$HOME/.local/lib"

4. Agregar los binarios a la lista de comandos del sistema.

$ mkdir -p "$HOME/.local/bin"
$ ln -sf "$HOME"/.local/lib/go/bin/* "$HOME/.local/bin/"
$ export PATH="$HOME/.local/bin:$PATH"

Para que se mantenga después de cerrar el terminal se debe modificar el archivo de configuración del Shell.

Bash:

$ echo "export PATH=\"$HOME/.local/bin:\$PATH\"" >> ~/.profile

Zsh:

$ echo "export PATH=\"$HOME/.local/bin:\$PATH\"" >> ~/.zshenv

Desde el código fuente

Es bueno saber en qué circunstancias es ventajoso realizar este proceso:

  • Seguridad. Saber qué es lo que se está ejecutando es lo más importante del software libre.

  • Control. Arreglar fallas, agregar funcionalidades, adaptar el lenguaje según las necesidades, compilar para plataformas soportadas de las que no se puede descargar una versión binaria, etc.

  • Acceso. Cuando no se dispone de una conexión a Internet muy rápida y ya se tiene una versión de Go instalada, descargar el código fuente y compilarlo puede ser más rápido (en mi computadora tarda ~7 minutos). Si se usa Git, esta opción puede ser muy útil.

  • Curiosidad. ¿A quién no le gusta aprender algo nuevo?.

También es bueno resaltar que compilar Go es una tarea que requiere algo de poder de computo, así que mi recomendación es solo hacer este proceso si alguna o más de las circunstancias de arriba aplican.

Descarga

El código fuente se puede descargar como paquete desde el sitio oficial de Go.

$ wget https://dl.google.com/go/go1.17.7.src.tar.gz
$ sha256sum -c <(echo "c108cd33b73b1911a02b697741df3dea43e01a5c4e08e409e8b3a0e3745d2b4d  go1.17.7.src.tar.gz")
go1.17.7.src.tar.gz: OK
$ tar -xf go1.17.7.src.tar.gz

O usando Git.

$ # Desde Google
$ git clone -b go1.17.7 https://go.googlesource.com/go
$ # Desde GitHub
$ git clone -b go1.17.7 https://github.com/golang/go

Bootstrap

Antes de continuar, es necesario preparar el compilador del compilador 😂 suena un poco raro, pero todo programa debe ser traducido a lenguaje máquina para ser ejecutado, y eso incluye a los compiladores.

Desde su versión 1.5, el compilador de Go está escrito en Go, eso quiere decir que se puede usar una instalación existente para compilarlo.

Es posible usar versiones no muy recientes, pero mi recomendación es usar la más reciente posible para evitar fallas, por ejemplo, el soporte para Linux ARM de 64 bits (linux/arm64) se agregó en la versión 1.5, el soporte para Android x86 de 32 bits (android/386) en la versión 1.6, y así sucesivamente, por lo que esas son las versiones mínimas necesarias para cada plataforma.

En caso de que no se confíe en la integridad del compilador de Go instalado, o la plataforma actual utilice otra biblioteca de C (como Alpine, que usa musl en lugar de glibc), se puede compilar la versión 1.4 con C (que es la última versión del compilador de Go escrito en C) y usar esta versión para compilar la versión que realmente quiere compilar.

Un detalle a tener en cuenta al usar la versión 1.4, como expliqué arriba, es que solo servirá en plataformas soportadas hasta esta versión. Para que funcione en otras plataformas, se deben generar artefactos de compilación desde una plataforma soportada, por ejemplo, para compilar Go 1.17.7 en la plataforma A (Linux ARM de 64 bits), se pueden generar los artefactos desde la plataforma B (Linux x86 de 64 bits) de la versión 1.5 como mínimo (la versión donde se agrego soporte para linux/arm64) y copiarlos a la plataforma A.

Con Go

Definir la variable de entorno GOROOT_BOOTSTRAP, que determina la ubicación del compilador actual.

$ export GOROOT_BOOTSTRAP="$(go env GOROOT)"

Con C

Nota

Para esta opción se necesitan algunas dependencias que varían según la distribución.

Alpine:

# apk add --no-cache bash gcc git musl-dev openssl

Debian:

# apt install bash gcc git libc6-dev make openssl

1. Descargar el código fuente de la versión 1.4.

$ wget https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz
$ sha256sum -c <(echo "f4ff5b5eb3a3cae1c993723f3eab519c5bae18866b5e5f96fe1102f0cb5c3e52  go1.4-bootstrap-20171003.tar.gz")
go1.4-bootstrap-20171003.tar.gz: OK
$ tar -xf go1.4-bootstrap-20171003.tar.gz \
    --transform "s/^go/gobootstrap/"

O usando Git.

$ # Si ya se había clonado el código fuente
$ git -C go archive --format tar origin/release-branch.go1.4 | \
    tar -x --transform "s/^/gobootstrap\//"
$ # Desde Google
$ git clone -b release-branch.go1.4 --depth 1 \
    https://go.googlesource.com/go gobootstrap
$ # Desde GitHub
$ git clone -b release-branch.go1.4 --depth 1 \
    https://github.com/golang/go gobootstrap

2. Compilar el compilador 😂.

$ (cd gobootstrap/src && CGO_ENABLED=0 ./make.bash)

3. Verificar que funciona correctamente.

$ gobootstrap/bin/go version
go version go1.4-bootstrap-20170531 linux/amd64

4. Definir la variable de entorno GOROOT_BOOTSTRAP.

$ export GOROOT_BOOTSTRAP="$PWD/gobootstrap"

Para otras plataformas

1. Instalar Go en una de las plataformas soportadas (este es mi primer artículo recursivo 😂) y descargar el código fuente.

2. Crear los artefactos de compilación (ajustar los valores de GOOS y GOARCH según se necesite).

$ export GOROOT_BOOTSTRAP="$(go env GOROOT)"
$ export GOOS=linux GOARCH=arm64
$ (cd go/src && GOROOT="" ./bootstrap.bash)

3. Copiar los artefactos generados a la plataforma donde se va a compilar y descomprimirlos.

$ tar -xf go-linux-arm64-bootstrap.tbz

4. Definir la variable de entorno GOROOT_BOOTSTRAP.

$ export GOROOT_BOOTSTRAP="$PWD/go-linux-arm64-bootstrap"

Compilación

1. ¡Compilar!

$ (cd go/src && GOROOT="" ./all.bash)
Nota

El script all.bash también ejecuta todas las pruebas (que es recomendable hacerlo). Para evitar esto y solo compilar, se puede usar el script make.bash. Si se quieren ejecutar las pruebas en otro paso, se puede usar el script run.bash -no-rebuild.

2. Verificar que funciona correctamente

$ go/bin/go version
go version go1.17.7 linux/amd64

Instalación

1. Eliminar cualquier instalación existente

# rm -rf "$(go env GOROOT)"
# rm -f "$(command -v gofmt)" "$(command -v go)"

2. Mover a /usr/lib

# mv go /usr/lib/

3. Agregar los binarios a la lista de comandos del sistema

# ln -s /usr/lib/go/bin/* /usr/bin/

Atribuciones

Go Team. Download and install. https://go.dev/doc/install

Go Team. Installing Go from source. https://go.dev/doc/install/source

Dave Cheney. Bootstrapping Go 1.5 on non Intel platforms. https://dave.cheney.net/2015/10/16/bootstrapping-go-1-5-on-non-intel-platforms