2016-07-26 4 views
5

Ich schreibe eine Anwendung und importiere ein Paket B. Dieses Paket enthält das Verzeichnis vendor, in dem wiederum das Paket C enthalten ist. Ich möchte auch das Paket C in meiner App direkt verwenden.Wie werden verschachtelte "Vendor" -Verzeichnisse in Go-Paketen behandelt?

So entschied ich mich, glide Paketmanager zu verwenden. Er lädt sowohl B als auch C in das Verzeichnis myapp/vendor herunter, behält aber myapp/vendor/B/vendor/C bei. Also wenn ich meine App erstelle, baut sie mit zwei verschiedenen Versionen von C auf (auch mit myapp/vendor/C).

Wie vermeide ich das?

1) Gibt es einen Paketmanager, der das erledigt? govend scheint mit seinem --prune Argument, aber es respektiert nicht die Versionen dieser C Pakete.

2) Oder, wie man glide die verschachtelten vendor Verzeichnisse richtig behandelt?

bearbeiten

ist mein Beispiel https://github.com/orloffm/flat. Es verwendet cat und - indirekt - toy Pakete. cat hat einige ältere Version von toy vendored und in Repository übergeben. Ich mache glide create && glide install und am Ende mit diesem:

. 
├── flat.go 
├── glide.lock 
├── glide.yaml 
└── vendor 
    └── github.com 
     └── orloffm 
      ├── cat 
      │   ├── cat.go 
      │   ├── vendor 
      │   │   └── github.com 
      │   │    └── orloffm 
      │   │     └── toy 
      │   │      └── toy.go 
      │   └── vendor.yml 
      └── toy 
       └── toy.go 

Ich will nicht vendor Verzeichnis mit toy verschachtelt haben.

+0

Ich benutze 'glide' gerade jetzt nicht, aber bist du sicher, dass du die neueste Version hast? Ein kurzer Blick auf die Dokumentation zeigt '' Dadurch glättet Glide den Abhängigkeitsbaum in ein einziges Top-Level-Vendor/Verzeichnis. '' – JimB

+0

Wie JimB erklärte, flachten die meisten aktuellen Vendoring-Tools, die ich verwendet habe, automatisch den Abhängigkeitsbaum. Dies ist praktisch erforderlich, da dasselbe Paket, das aus zwei verschiedenen eindeutigen Pfaden importiert wird, tatsächlich als zwei unterschiedliche eindeutige Pakete betrachtet werden, wie Sie gefunden haben. Ich weiß, 'govendor' tut es standardmäßig. – Kaedys

+0

@Kaedys +1 für Gouverneur. Ich habe es in einigen Projekten verwendet. – tier1

Antwort

2

konnte ich Ihre flat Programm installieren und auszuführen, indem sie die folgenden Änderungen (auch Sie eine PR https://github.com/orloffm/flat/pull/1 gesendet):

1) flat.go „github.com/orloffm/toy“ importieren muss, weil von new(toy.RubberToy) - sonst ist es nicht kompilieren

2) glide.yaml Datei hinzufügen, die sowohl "cat" -Liste und "Spielzeug" Bibliotheken als Abhängigkeiten:

package: github.com/orloffm/flat 
import: 
- package: github.com/orloffm/cat 
- package: github.com/orloffm/toy 

3) laufen glide install --strip-vcs --strip-vendor (oder die equiv Alent Verknüpfung glide install -s -v), um Pakete zu installieren und verschachtelte vendor/ Verzeichnisse zu entfernen (Ich benutze glide Version 0.11.0-dev installiert mit go get -u github.com/Masterminds/glide; zeigt die Option --strip-vendor).

4) GOBIN = $ PWD gehen installieren & & ./flat

Cat pushes the toy. 
The toy makes a very loud noise. 

produziert ich denke, die beste nicht das vendor Verzeichnis in Ihren Bibliotheken enthalten sein würde - das vermasselt Sachen und macht den Bibliotheksbenutzern das Leben schwerer (denken Sie beispielsweise daran, zusätzliche Optionen zu glide zu verwenden).Lassen Sie die "Clients" dieser Bibliotheken - package main Pakete - entweder alle Abhängigkeiten (einschließlich transitive) zu verkaufen oder sie in einer Konfiguration wie glide.yaml angeben und lassen Sie das Tool (glide), um sie richtig zu holen und zu installieren.

+0

Das sortiert die Dinge aus, vielen Dank. Ich war etwas verwirrt, verglichen mit allen anderen Tools. –

Verwandte Themen