web-dev-qa-db-fra.com

Comment configurer golang pour reconnaître les packages 'mod'?

Je prends go1.11rc1 pour un tour et la première chose que j'ai remarquée est que goland ne reconnaît pas les importations.

annonce de la version de goland dit: "support des modules Go prêts à l'emploi (anciennement appelé vgo)"

Quelqu'un sait comment réparer ceci?

Problème:

  1. Des packages comme "github.com/urfave/cli" de couleur rouge et le texte en survol indiquent: "Impossible de résoudre le répertoire ..."
  2. Les éléments de package importés tels que "NewApp" dans "app: = cli.NewApp ()" en rouge et en survol indiquent: "Référence non résolue ..."

Étapes à reproduire:

  1. Installez go1.11rc1: supprimez l'installation actuelle, installez 1.11rc1, vérifiez la version.
  2. Créez un nouveau répertoire de projet en dehors du chemin d'accès: mkdir pjg && cd pjg
  3. Créer un go.mod fichier: go mod init github.com/stevetarver/pjg
  4. Ajoutez un package au projet: go get github.com/urfave/cli

go.mod le fichier ressemble maintenant à:

module github.com/stevetarver/pjg/v1

require github.com/urfave/cli v1.20.0 // indirect

Créer main.go:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/urfave/cli"
)

func main() {
    app := cli.NewApp()
    app.Name = "boom"
    app.Usage = "make an explosive entrance"
    app.Action = func(c *cli.Context) error {
        fmt.Println("boom! I say!")
        return nil
    }

    err := app.Run(os.Args)
    if err != nil {
        log.Fatal(err)
    }
}

Vue main.go dans goland, et survolez le texte rouge pour voir le problème.

  • les packages de mod sont stockés dans $GOPATH/pkg/mod/
  • version goland: 2018.2.1
  • version go: go1.11rc1 darwin/AMD64

Remarques:

  • $GOPATH est défini correctement - go get place le paquet au bon endroit, GOPATH en env correspond aux préférences de goland.
  • Définition des préférences de Goland Allez -> GOPATH -> Module GOPATH sur /Users/starver/code/go/pkg/mod n'a pas résolu ce problème.
7
Steve Tarver

Prise en charge de GoLand

La dernière version de GoLand a implémenté la prise en charge des modules vgo et go, mais elle n'a pas rattrapé les changements de syntaxe go1.11rc1. Juste au cas où cela aiderait quelqu'un dans l'intervalle, je vais documenter les choses que j'ai essayées et leurs problèmes et succès.

TL; DR : Ne placez pas votre projet dans $GOPATH ET créez votre nouveau projet en tant que type "Go Module (vgo)", OR activez ce paramètre pour les projets existants.

Avec go1.11rc1 installé en tant que votre go global, il existe trois cas d'utilisation de base pour go mod projets dans GoLand ...

Créez un nouveau projet à l'intérieur $GOPATH:

  1. Créez un nouveau projet de type "Go Module (vgo)": Fichier -> Nouveau, sélectionnez "Go Module (vgo)"
  2. Définissez votre répertoire de projet sur quelque chose à l'intérieur de $GOPATH: $GOPATH/src/github.com/stevetarver/insidegopath
  3. Crée ton main.go fichier référençant un package qui n'existe pas dans votre $GOPATH.
  4. Ajoutez ce package à vos importations.

En utilisant go get la manière GoLand via vgo comme décrit dans le gif ici :

  1. Cliquez sur le package d'importation.
  2. Cliquez sur l'ampoule d'inspection rouge.
  3. Cliquez sur "Synchroniser les packages de ...".
  4. [~ # ~] échoue [~ # ~] : go: go mod -sync is now go mod tidy

En utilisant go get la voie du terminal embarqué GoLand:

  1. Ouvrez le terminal intégré.
  2. go get votre importation.
  3. [~ # ~] échoue [~ # ~] : ᐅ go get github.com/urfave/cli go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src; ignoring go.mod; see 'go help modules'

Allumons cette variable et réessayons:

  1. Remarque: les préférences du plugin de terminal ne fournissent aucun moyen de définir des variables d'environnement.
  2. Ensemble GO111MODULE=on: Ouvrez Préférences -> Apparence et comportement -> Variables de chemin et ajoutez GO111MODULE=on.
  3. Quittez le terminal, réessayez, redémarrez GoLand, réessayez, même échec que ci-dessus.
  4. env | grep GO111MODULE dans le terminal ne produit rien.
  5. [~ # ~] note [~ # ~]: si cela avait fonctionné, cela aurait été une mauvaise solution - GoLand ne semble pas avoir de paramètres par projet pour cela - que La variable aurait été activée pour tous les projets, ce qui casserait ceux qui ne sont pas prêts pour les modules Go.
  6. Selon cette réponse , vous pouvez créer un lanceur de ligne de commande personnalisé pour inclure cette var env, mais eeuuwww - comment garderiez-vous une trace de quand démarrer GoLand normalement et quand utiliser le lanceur de ligne de commande?

Vous pouvez définir GO111MODULE=on dans votre script d'initialisation Shell, mais cela casserait tous les projets qui n'utilisent pas encore les modules go.

Vous pouvez également préfixer chaque commande go avec la variable env var: export GO111MODULE=on; go get github.com/urfave/cli ou créez un go wrapper de script Shell dans votre répertoire de projet qui le fait pour vous.

Aucune de ces solutions n'est vraiment réalisable, mais une partie des modules point of go est de s'échapper de l'espace de travail go redouté, alors lisez la suite, ça va mieux

Créez un nouveau projet à l'extérieur $GOPATH:

  1. Créez un nouveau projet de type "Go Module (vgo)": Fichier -> Nouveau, sélectionnez "Go Module (vgo)"
  2. Définissez votre répertoire de projet sur quelque chose en dehors de $GOPATH
  3. Réparez votre go.mod: le fichier généré contient module "outsidegopath", mais nous voulons quelque chose comme module github.com/stevetarver/outsidegopath. C'est un peu bizarre - GoLand essaiera de réécrire go.mod et supprimez des parties du chemin. Répétez quelques fois et cela cessera d'essayer.
  4. Crée ton main.go fichier. Si vous créez ceci via l'ide en tant que fichier go, il contiendra package outsidegopath. Corrigez cela pour être package main.
  5. Maintenant vous pouvez go get github.com/urfave/cli et il est récupéré dans $GOPATH/pkg/mod comme prévu.

Ajouter go mod support pour un nouveau projet existant :

Cela s'est avéré être très simple - la meilleure façon de travailler avec les modules go dans GoLand:

  1. Ouvrez les Préférences: Aller -> Module Go (vgo), et cochez "Activer l'intégration des modules Go (vgo)"
  2. Fonctionne comme décrit ci-dessus - mais vous créez votre propre go.mod avec go mod init module-name.
8
Steve Tarver

La gestion du module devrait être plus facile avec Go 1.13 (août 2019):

Le GO111MODULE la variable d'environnement continue par défaut à auto, mais le paramètre auto active désormais le mode de détection de module de la commande go chaque fois que le répertoire de travail actuel contient ou est inférieur à un répertoire contenant, un go.mod fichier - même si le répertoire courant se trouve dans GOPATH/src.

Cette modification simplifie la migration du code existant dans GOPATH/src et la maintenance continue des packages compatibles avec les modules aux côtés d'importateurs non compatibles avec les modules.

Cela signifie que le "Ne mettez pas votre projet à l'intérieur $GOPATH "ne sera plus nécessaire.
Tant qu'il y a go.mod fichier, les modules seront reconnus, depuis la ligne de commande ou depuis un IDE comme Goland .

1
VonC