190 votes

Allez construire : "Impossible de trouver le package" (même si GOPATH est défini)

Même si j'ai GOPATH correctement configuré, je n'arrive toujours pas à trouver mes propres packages avec "go build" ou "go run". Qu'est-ce que je fais de mal?

$ echo $GOROOT
/usr/local/go

$ echo $GOPATH
/home/mitchell/go

$ cat ~/main.go
package main
import "foobar"
func main() { }

$ cat /home/mitchell/go/src/foobar.go
package foobar

$ go build main.go
main.go:3:8: import "foobar": impossible de trouver le package

2 votes

Je rencontre le même problème lorsque je vais chercher github.com/adonovan/gopl.io/tree/master/ch1/helloworld La raison en est qu'il n'y a pas de fichier nommé helloworld.go. go get fonctionne en faisant correspondre le nom du package et le nom du fichier.

0 votes

Il se peut également que vous ayez besoin de mettre à jour Go. J'ai rencontré un problème similaire où j'avais du code existant utilisant go.mod pour définir un module. Sur une machine de test, j'avais téléchargé le code et j'essayais de le compiler mais Go me donnait toutes sortes d'erreurs liées à GOPATH et l'incapacité de trouver des modules. C'était la version Go 1.7. Dès que j'ai mis à jour Go, tout a fonctionné sans problème.

0 votes

Tapez ceci dans le terminal pour une explication à jour $ go help gopath

1voto

Fahima Mokhtari Points 1206
  • GOROOT doit être défini sur votre répertoire d'installation (/usr/local/go).
  • GOPATH doit être défini sur votre répertoire de travail (quelque chose comme /home/nom_utilisateur/dossier_projet). GOPATH ne doit pas être défini sur GOROOT car votre propre projet peut avoir besoin d'installer des packages, et il n'est pas recommandé d'avoir ces packages dans le dossier d'installation de Go. Consultez ce lien pour en savoir plus.

0voto

Krishnadas PC Points 1692

Pour moi, aucune des solutions ci-dessus n'a fonctionné. Mais ma version de Go n'était pas la plus récente. J'ai téléchargé la dernière version et remplacé l'ancienne sur mon Mac OS, après quoi cela a parfaitement fonctionné.

0voto

Kai Reichart Points 1

J'ai rencontré un problème similaire lors de la construction d'un fichier docker :

[1/3] ÉTAPE 9/9: RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go
api/v1alpha1/XXX.go:5:2: impossible de trouver le paquet "." dans :
        /workspace/client/YYY/YYY.go

Ce problème est apparu uniquement lors de la construction du Dockerfile, la construction en local fonctionnait correctement.

Le problème s'est avéré être une déclaration manquante dans mon Dockerfile :

COPY client/ client/

0voto

AllisLove Points 99

Je ne comprends pas pourquoi cela se produit, nous devons être en mesure d'importer de n'importe où notre fichier se trouve dans son nid, car j'ai découvert que si nous avons plus d'un nid cela générera une erreur.

package main

import (
    "fmt" 
    "indexer/source/testPackage3" // cela affichera une erreur GOROOT.
    "indexer/testPackage"
    "indexer/testPackage2"
)

func main() {
    fmt.Println("Indexeur de contenu Agile -")
    fmt.Println(testPackage.Greeting())
    fmt.Println(testPackage2.Greeting())
    fmt.Println(testPackage3.Greeting())
}

 testPackage2
    entry2.go
    source
        entry3.go

Pour conclure, je veux simplement vous dire que le fichier entry3.go ne fonctionnera pas lorsqu'il est importé dans mon fichier principal, qui est (main.go) dans ce cas, je ne comprends pas pourquoi, donc, j'ai simplement choisi d'utiliser un dossier de profondeur dans les packages que j'ai besoin d'exporter.

VOIR LA STRUCTURE

entry.go, entry2.go fonctionneront parfaitement lorsqu'ils sont importés, mais entry3.go ne fonctionnera pas..

De plus, à la fois le répertoire et le nom du package doivent être les mêmes pour qu'ils fonctionnent correctement lors de leur importation.

0voto

sekira Points 1

Dans mon cas, il n'a été compilé avec succès que de cette façon... Premièrement. Vous devez regarder où se trouve votre GOROOT. Pour voir où il se trouve, utilisez la commande

$ go env

J'ai créé des liens symboliques vers mes répertoires de packages (mes répertoires contenant des fichiers de package situés dans un répertoire où j'écris un code de package principal) Pour créer un lien symbolique, utilisez la commande suivante

$ ln -s  

Deuxièmement. Vous devez ajouter tous les nouveaux packages dans votre importation du package principal

import (
    "fmt"
    "packag1"
    "os"
    "packag2"
)

et dans la déclaration du nom du package, dans les fichiers de code go, les noms doivent être les mêmes, comme ceci

package packag2

package packag1

les noms des répertoires et des fichiers go doivent être les mêmes noms

$ tree .
.
 main
 main.go
 packag1
    packag1.go
 packag2
     packag2.go

2 répertoires, 4 fichiers

n'oubliez pas de créer des liens symboliques

$ tree /usr/local/go/src/
/usr/local/go/src
 packag1 -> /home/user1name/Desktop/someDeskDir/src/packag1
 packag2 -> /home/user1name/Desktop/someDeskDir/src/packag2

(Je montre dans ce commentaire uniquement les liens symboliques créés par moi. Dans d'autres cas, dans le répertoire GOROOT, il y aura beaucoup plus de fichiers et de répertoires)

P.S. J'utilise "Ubuntu 22.04.2 LTS", j'installe GO à partir de l'archive go1.20.4.linux-amd64.tar.gz, téléchargée depuis https://go.dev/doc/install Sur d'autres systèmes, il peut y avoir des différences.

RU-RU-RU-RU

... . GOROOT.

$ go env

( , GOROOT. GOROOT )

$ ln -s  

. package import main package

import (
    "fmt"
    "packag1"
    "os"
    "packag2"
)

package, go ,

package packag2

package packag1

go,

$ tree .
.
 main
 main.go
 packag1
    packag1.go
 packag2
     packag2.go

2 répertoires, 4 fichiers

$ tree /usr/local/go/src/
/usr/local/go/src
 packag1 -> /home/user1name/Desktop/someDeskDir/src/packag1
 packag2 -> /home/user1name/Desktop/someDeskDir/src/packag2

( , GOROOT )

.. "Ubuntu 22.04.2 LTS" GO https://go.dev/doc/install go1.20.4.linux-amd64.tar.gz .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X