Heeft het zin om twee pakketten in dezelfde map te hebben?

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:

go build vs go build file.go


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.gonaar een nieuwe map te verplaatsen.

Van Go-code schrijven

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 (mypackageen 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:

  1. De 2 pakketten moeten de volgende namen hebben:

    • NameOfDirectory.
    • NameOfDirectory + _test.
  2. De namen van de bestanden in het pakket _testmoeten 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.goverplaatsen 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.gowijzigen. Als de modulenaam aaa

is

Vóór

import "aaa"

Hier moet verandering in komen

import "aaa/myproject"

Other episodes