Ist es eine schlechte Idee, Quellcode für ein Go-Projekt außerhalb von GOPATH zu haben?

32

Ich arbeite mit Go an einem neuen Projekt und wir sind alle neu in Go. Wir folgen der standardmäßigen go-Verzeichnisstruktur und haben den gesamten Code darunter

$ GOPATH / src / github.com / firmenname / projektname

Das ist auch die Wurzel eines Git-Repository

Das standardmäßig empfohlene Pfadlayout erscheint etwas seltsam, insbesondere wenn wir an einem mehrsprachigen Projekt arbeiten, z. B. einem Go-basierten Rest / http-Backend und einem HTML / Javascript-Frontend. In diesem Fall möchte ich wahrscheinlich, dass meine Projektstruktur so aussieht:

/
  doc/
  src/
    server/
      main.go
      module1/
        module.go
    client/
      index.html
  Makefile

Aber ist es tatsächlich notwendig, den Code im GOPATH zu platzieren?

Als Versuch habe ich ein kleines Programm erstellt, in dem sich der Quellcode außerhalb von GOPATH befand. Ich könnte das Projekt leicht in Pakete aufteilen, so dass das mainPaket mit auf ein fooPaket in einem foo/Ordner verweisen könnte import "./foo".

Soweit ich sehen kann, gibt es zwei Dinge, die mir dies verbieten:

  • Anderer Code kann diesen Code nicht importieren. Dies ist kein Problem, da wir einen Service speziell für das Unternehmen aufbauen.
  • Ich kann es nicht verwenden go install, um es zu installieren. Dies ist auch kein Problem. Die Build-Pipeline installiert das Tool.

Auf dem Build-Server darf sich der Arbeitsbereich jedoch nicht innerhalb von GOPATH befinden

Ist ein solcher Ansatz entmutigt? Wenn ja, warum?

Gibt es andere negative Nebenwirkungen als die beiden, die ich aufgelistet habe?

Denken Sie daran, dass dies ein privates Projekt für ein Unternehmen ist und kein öffentlicher Open Source-Code.

Das eigentliche Projekt vom GOPATH zu trennen, scheint verlockend, aber man sollte vorsichtig sein, wenn man die Regeln verletzt, wenn man sich auf der Shu- Bühne befindet

Pete
quelle

Antworten:

12

Sie müssen GOPATH nicht verwenden, aber dann verpassen Sie alle nützlichen Tools, die Sie aus dem goBefehl erhalten. Sie alle erwarten, dass sich der Code in der Standard-GOPATH-Hierarchie befindet.

Sie erwähnten go install, aber auch go test(und das nette go test -coverCoverage-Tool) wird nicht funktionieren go get, was Ihnen das Herunterladen von Remote-Code ermöglicht. Dadurch wird alles auf den GOPATH geschrieben, sodass Sie Dinge kopieren müssen.

Sicher, Sie können alles durch make / scons / cmake / whatever ersetzen und die Dinge erledigen, und es wird wahrscheinlich für Ihre Umgebung funktionieren, aber es ist zusätzliche Arbeit, die vom goTool erledigt werden könnte .

iccananea
quelle
9

(Haftungsausschluss: Ich entwerfe gerne solche Sachen, aber ich bin neu in Go. Ich habe es in der Praxis noch nicht ausprobiert.)

Idee: Warum nicht beides?

Wenn Sie Symlinking berücksichtigen, stehen zwei polare Optionen zur Verfügung:

(A) Code in src, symbolisch mit dem Arbeitsbereich verknüpft

/
  doc/
  src/
    server/
      projectname/
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname -> ../../../src/server/projectname
      github.com/
        someone/
          library/
    bin/
    pkg/
  Makefile

(B) Code im Arbeitsbereich, symbolisch verknüpft mit src

/
  doc/
  src/
    server/
      projectname -> ../../go_workspace/src/companyname/projectname
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname/
      github.com/
        someone/
          somelib/
    bin/
    pkg/
  Makefile

Ich würde mich zu "A" neigen, weil:

  • Alle Ihre Quellen leben physisch eng zusammen,
  • projectname kann leicht ein eigenes Repo haben, oder Sie können ein Repo für Ihr gesamtes Projekt haben,
  • Sie können das Ganze go_workspaceunversioniert lassen und es durch einen make-Schritt initialisieren (indem godepSie das Projekt symlinken).
Kos
quelle
1
Es muss "A" sein, da mit "B" go sich beschwert "go install: no install location for directory {dir} outside GOPATH".
OJFord
2

Aktualisierung 2019

Sie müssen Ihr Projekt GOPATHnicht mehr unter speichern .

Legen Sie es einfach in ein Verzeichnis außerhalb von GOPATH. Dann tippe:

go mod init github.com/youruser/yourproject

Sie werden gut zu gehen sein.

Inanc Gumus
quelle