Si j'avais un programme Golang compilé que je voulais installer de manière à pouvoir l'exécuter avec une commande bash depuis n'importe où sur mon ordinateur, comment ferais-je cela? Par exemple, dans nodejs
npm install -g express
Installations express telles que je peux exécuter la commande
express myapp
et express générera un répertoire de fichiers pour une application de noeud appelée "myapp" quel que soit mon répertoire actuel. Existe-t-il une commande équivalente pour go? Je crois que maintenant avec la commande "go install" vous devez être dans le répertoire qui contient l'exécutable afin de l'exécuter
Merci d'avance!
Pour autant que je sache, il n'y a pas d'équivalent direct à npm install -g
. L'équivalent le plus proche ne serait pas go install
, mais go get
. Depuis la page d'aide (go help get
):
utilisation:
go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]
Obtenez les téléchargements et installe les packages nommés par les chemins d'importation, ainsi que leurs dépendances.
Par défaut, go get
installe les fichiers binaires dans $GOPATH/bin
, donc la façon la plus simple de rendre ces binaires appelables de partout est d'ajouter ce répertoire à votre $PATH
.
Pour cela, mettez la ligne suivante dans votre .bashrc
(ou .zshrc
, selon le Shell que vous utilisez):
export PATH="$PATH:$GOPATH/bin"
Vous pouvez également copier ou lier les exécutables à /usr/local/bin
:
ln -s $GOPATH/bin/some-binary /usr/local/bin/some-binary
En utilisant Go> = 1.11, si votre répertoire actuel se trouve dans un projet basé sur un module, ou si vous avez défini GO111MODULE=on
dans votre environnement, go get
n'installera pas les packages "globalement". Il les ajoutera à la place au fichier go.mod de votre projet.
Depuis Go 1.11.1, définissez GO111MODULE=off
s'efforce de contourner ce comportement:
GO111MODULE=off go get github.com/usr/repo
Fondamentalement, en désactivant la fonctionnalité du module pour cette seule commande, il sera installé sur GOPATH comme prévu.
Les projets n'utilisant pas de modules peuvent toujours go get
normalement pour installer des fichiers binaires sur $GOPATH/bin
.
Il y a une longue conversation et plusieurs problèmes enregistrés à propos de ce changement de branchement de comportement à partir d'ici: golang/go - cmd/go: go get ne devrait pas ajouter de dépendance à go.mod # 2764 .
L'analogue le plus proche de ceci dans Go serait go get
. Par défaut, il récupérera un package Go à partir d'une URL de référentiel fournie et nécessite un $GOPATH
variable à définir dans votre Shell pour que Go sache où stocker les packages (et par la suite où les trouver lors de la compilation du code en fonction de go get
- ted packages).
Exemple de syntaxe:
$ go get github.com/user/repo
Le comportement fourni par npm
's -g
L'indicateur est par défaut et les packages installés à l'aide de go get
sont normalement disponibles dans le monde entier.
Voir go get --help
pour plus d'informations sur la commande.
Comme mentionné par @helmbert, ajouter votre $GOPATH
à ton $PATH
est utile si vous installez des packages autonomes.
TL; DR en bas. Je vais vous expliquer comment j'en suis arrivé à cette conclusion et pourquoi les solutions les plus évidentes ne fonctionnent pas.
En voyant cette question, je me suis dit "Si je pouvais définir le root de GOPATH=/usr
, il installerait des choses dans /usr/bin/
et /usr/src
! "
J'ai donc essayé la chose évidente:
Ajouter GOPATH=/usr
à la racine de .bashrc
.
Et ça a marché!
Sorte de.
Pas vraiment.
Il s'avère que Sudo
n'exécute pas la racine de .bashrc
. Pour la "sécurité" ou quelque chose comme ça.
Faire env_set
ou quelque chose dans /etc/sudoers
Il s'avère que, /etc/sudoers
peut uniquement supprimer les variables d'environnement. Il n'y a pas env_set
directive.
(Autant que je puisse trouver)
Creuser man sudoers
.
D'où Sudo obtient-il son ensemble par défaut de variables d'environnement?
Eh bien, le premier de la liste est /etc/environment
, c'est donc celui que j'ai utilisé.
Sudo echo "GOPATH=/usr" >> /etc/environment
Sudo go get <repo>
Les fichiers binaires seront placés dans /usr/bin
, et les sources seront placées dans /usr/src
.
Exécuter go en tant que non root utilisera GOPATH de la manière "normale".