Usando o Go instalado pelo pacote golang não padrão no Debian

1

Estou tentando instalar o go 1.8.

O pacote apt de qualquer coisa, exceto o golang-1.7, não funciona. O Golang-1.7 é instalado corretamente, o golang-1.8 não. O pacote no repo está errado / incompleto?

Reivindicações do Debian para golang-1.8 "Este pacote é um metapacote que, quando instalado, garante que (a maioria) um ambiente de desenvolvimento Go completo esteja instalado." link Mas isso obviamente não é verdade.

# apt install golang-1.8 golang-1.8-go
Reading package lists... Done
Building dependency tree
Reading state information... Done
golang-1.8 is already the newest version (1.8.1-1).
golang-1.8-go is already the newest version (1.8.1-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
# go
bash: /usr/bin/go: No such file or directory
# whereis go
go:
# uname -a
Linux linux 4.9.0-6-amd64 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) x86_64 GNU/Linux
# cat /etc/debian_version 
9.4
    
por user6329530 26.04.2018 / 12:48

1 resposta

2

Antecedentes

«garantias… estão instaladas» significa apenas que depende de um conjunto de pacotes que realmente fornecem o Go dev. env.

Como você pode ver , este pacote depende de outros três pacotes— golang-1.8-doc , golang-1.8-go , golang-1.8-src - portanto, quando você instala golang-1.8 , esses três também serão instalados.

O problema que você está enfrentando é, devo admitir, confuso mas pode ser facilmente explicado.

Se você olhar para a lista de pacotes instalados por golang-1.8-go , você verá que a ferramenta go está instalada como /usr/lib/go-1.8/bin/go , e o diretório /usr/lib/go-1.8/bin não está listado no variável de ambiente PATH padrão (definida por /etc/profile ).

O motivo pelo qual é feito dessa maneira é duplo:

  • Pode haver vários grupos de golang-X.Y* pacotes no mesmo Pacote Debian ao mesmo tempo; digamos, o Stretch tem 1,7 e 1,8.

    É crucial entender que eles são co-instaláveis, o que pode ser útil para testar como um projeto que foi testado contra X.Y funcionará com X.Y+N .

  • Debian oferece um pacote especial "o mais genérico" que depende de um pacote golang-X.Y específico que foi considerado para ser "o padrão" para o lançamento do Debian espacial.

    No Stretch, é golang-go , e como você pode ver, tem "1.7" em sua versão e depende golang-1.7-go .

    Este pacote garante que os binários executáveis fornecido por um pacote golang-X.Y-go padrão está disponível em "o lugar padrão" - em /usr/bin ( veja você mesmo ).

O que fazer sobre isso?

Várias possiblilties:

  • Simplesmente chame /usr/lib/go-1.8/bin/go pelo nome completo do caminho.

    A ferramenta go "sabe" onde seu GOROOT é para que ele encontre seu pacotes específicos para a sua versão muito bem.

  • Prefira esse diretório à sua variável de caminho; digamos colocar algo como

     export PATH="/usr/lib/go-1.8/bin:$PATH"
    

    no seu script ~/.bashrc e a próxima chamada para go irá encontrá-lo no novo local.

  • Agarre a fonte do pacote golang-go , corrija-o para que torna golang-1.8-go o pacote padrão, construa e instale.

    (Eu não recomendaria seguir esse caminho ainda)

Espero que isso ajude.

Outra tentativa de explicar

O Stretch tem dois pacotes de três pacotes: golang-1.7-* e golang-1.8-* .

Em cada pacote, o pacote golang-1.N-go instala seu binário go sob /usr/lib/go-1.N/bin . Nenhum deles instala um symlink em /usr/bin .

A razão para isso é tornar esses pacotes de pacotes co-instaláveis, para que você possa compilar seu código Go com qualquer uma das versões instaladas.

Agora existe outro, independente, pacote, que não codifica a versão de lançamento do Go em seu nome. Tem o nome golang-go e depende apenas de golang-1.7-go em que 1.7 é a versão padrão do tempo de execução do Go para o Stretch.

Em outro lançamento, golang-go dependerá de outro golang-X.Y-go pacote.

É este pacote, que fornece /usr/bin/go apontando para /usr/lib/go-1.7/bin/go .

Então, se (e somente se) você tiver golang-go instalado, você terá o binário go disponível em /usr/bin , e isso será de Go 1.7 no alongamento.

E não, não é possível de alguma forma forçar golang-go a apontar para go do pacote golang-1.8-go instalado, e também não existe uma maneira de selecionar uma versão preferida do Go via "dpkg alternatives" mecanismo.

Minha opinião sobre "o porquê" dessa abordagem é ter uma versão bem conhecida de go em qualquer versão do Debian. Isso é supostamente necessário para construindo pacotes Debian de software escritos em Go. Caso contrário, seria necessário que as máquinas de construção de pacotes inventassem algum truque para encontrar a versão padrão do Go; a partir de agora, seus pacotes de fontes podem apenas dependa de golang-go e chame isso por dia.

    
por 26.04.2018 / 15:44