Ik heb een project dat een bibliotheek biedt (sommige functies exporteert) en ook een opdrachtregelinterface moet bieden (er moet een uitvoerbaar bestand zijn).
Voorbeeld van directorystructuur:
whatever.io/
myproject/
main.go
myproject.go
De go-compiler heeft de package mainen func mainnodig om de uitvoering te starten. Mijn bibliotheek heeft het pakket mijnprojectnodig waar ik dingen op zet. Dit is wat de go-tool zegt als ik een ander project bouw dat mijn project probeert te importeren:
main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject
Dus ik geloof dat er geen manier is om het te doen.
Moet ik de bibliotheek of de CLI naar een ander pakket verplaatsen?
Antwoord 1, autoriteit 100%
Verplaats uw pakketten gewoon naar een nieuwe map in dezelfde map als main.go.
Vergeet niet om het nieuwe pakket te importeren vanuit de referentie van $GOPATH.
Voorbeeld:
user@user:~/p/go/test/so-multipack$ ls -R
.:
a main.go
./a:
a.go
user@user:~/p/go/test/so-multipack$ cat main.go
package main
import (
"../so-multipack/a"
)
func main(){
a.Hello()
}
user@user:~/p/go/test/so-multipack$ cat a/a.go
package a
import (
"fmt"
)
func Hello(){
fmt.Println("hello from a")
}
user@user:~/p/go/test/so-multipack$ go run main.go
hello from a
user@user:~/p/go/test/so-multipack$ go build
user@user:~/p/go/test/so-multipack$ ls
a main.go so-multipack
user@user:~/p/go/test/so-multipack$
Nuttige link:
Antwoord 2, autoriteit 84%
Je kunt niet twee pakketten per map hebben, vandaar de fout. Dus de oplossing zoals @Larry Battle zei om je myproject.go
naar een nieuwe map te verplaatsen.
Go-code moet in een werkruimte worden bewaard. Een werkruimte is een map
hiërarchie met drie mappen aan de basis:src bevat Go-bronbestanden georganiseerd in pakketten (één pakket per map),
pkg bevat pakketobjecten, en
bin bevat uitvoerbare opdrachten.
Antwoord 3, autoriteit 31%
In de meeste gevallen nee. Er is echter een uitzondering voor unit tests.
Werkvoorbeeld:
Hier zijn 2 verschillende pakketten (mypackage
en mypackage_test
) in 1 map (mypackage
). De compiler zal hier niet over klagen.
mijnpakketmap:
mypackage/
foo.go
foo_test.go
mijnpakket/foo.go:
package mypackage
func Add(a int, b int) int {
return a + b
}
mijnpakket/foo_test.go:
package mypackage_test
// Unit tests...
Regels:
-
De 2 pakketten moeten de volgende namen hebben:
- NameOfDirectory.
- NameOfDirectory +
_test
.
-
De namen van de bestanden in het pakket
_test
moeten eindigen op_test.go
Als je een verwarrende compilerfout krijgt in de trant van found packages "foo" and "bar"
, heb je waarschijnlijk een of meer van deze regels overtreden.
Antwoord 4, autoriteit 9%
Je kunt geen twee golang-bestanden in één map hebben met twee pakketten. U moet dus main.go
verplaatsen uit myproject
.
de mappenstructuur voor verplaatsen
whatever.io/
go.mod
myproject/
main.go
myproject.go
Na verhuizing
whatever.io/
go.mod
main.go
myproject/
myproject.go
En je moet het importpad van je main.go
wijzigen. Als de modulenaam aaa
is
Vóór
import "aaa"
Hier moet verandering in komen
import "aaa/myproject"