web-dev-qa-db-fra.com

Équivalent Golang de npm install -g

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!

19
Ryan

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
12
helmbert

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 .

13
Alec

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.

3
Jules

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:

  1. 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.

  2. 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)

  3. 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".

0
SIGSTACKFAULT