2017-11-28 3 views
3

ich den folgenden Code workingDir, _ := os.Getwd() in server.go-Datei ausführen, die unter dem Root-Projekt ist und den Stammpfad erhalten, Jetzt muss ich die server.go Datei auf die folgende Struktur bewegenWie den Stammpfad des Projekts erhalten

myapp 
    src 
    server.go 

und ich möchte ge den Weg der go/src/myapp zur Zeit, nachdem ich die bewegen server.go unter myapp->src>server.go I-Pfad von go/src/myapp/src/server.go bekam und ich möchte den Vorschauen Weg zu bekommen,

Wie soll ich es automatisch machen? oder sollte ich ../ explizit in get Pfad setzen?

+0

Wenn Sie ein Go-Programm ausführen, gibt es kein "Projekt". Sie führen nur eine kompilierte Binärdatei aus. es hat kein Konzept, wo es Quellcode sein könnte (oder sogar, wenn es auf dem Rechner existiert, auf dem es läuft), noch sollte es so sein. – Adrian

+0

@Adrian - danke das Problem ist, dass ich JSON-Datei aus dem Root-Projekt lesen muss, das Problem, dass es sehr seltsam funktioniert, wenn ich das Programm in goland laufen lasse Pfad wie 'go/src/myapp/'und wenn ich führe es in vsCode Ich habe diesen Pfad 'go/src/myapp/src/server.go' im läuft es auf dem gleichen Projekt, so möchte ich einige generische Lösung finden, wie würdest du es tun? –

+0

Ich würde den Pfad durch Konfigurationsdatei, Befehlszeilen-Flag und/oder Umgebungsvariable konfigurierbar machen. – Adrian

Antwort

4

os.Getwd() gibt den Quelldateipfad nicht zurück. Es gibt das aktuelle Arbeitsverzeichnis des Programms zurück (normalerweise das Verzeichnis, in dem Sie Ihr Programm ausgeführt haben).

Beispiel:

Angenommen ich eine main.go in /Users/Arman/go/src/github.com/rmaan/project/main.go haben, die os.Getwd()

$ cd /Users/Arman/go/src/github.com/rmaan/project/ 
$ go run main.go 
/Users/Arman/go/src/github.com/rmaan/project <nil> 

nur ausgibt, wenn ich auf andere und führen Sie es ändern, ändert Ergebnis.

$ cd /Users/Arman/ 
$ go run ./go/src/github.com/rmaan/project/main.go 
/Users/Arman <nil> 

IMO sollten Sie explizit den Pfad übergeben Sie Ihr Programm wollen anstatt zu versuchen, es aus dem Kontext zu schließen (wie es speziell in der Produktionsumgebung ändern kann). Hier ist ein Beispiel mit flag Paket.

package main 

import (
    "fmt" 
    "flag" 
) 


func main() { 
    var myPath string 
    flag.StringVar(&myPath, "my-path", "/", "Provide project path as an absolute path") 
    flag.Parse() 

    fmt.Printf("provided path was %s\n", myPath) 
} 

dann Ihr Programm wie folgt ausführen:

$ cd /Users/Arman/go/src/github.com/rmaan/project/ 
$ go run main.go --my-path /Users/Arman/go/src/github.com/rmaan/project/ 
provided path was /Users/Arman/go/src/github.com/rmaan/project/ 
$ # or more easily 
$ go run main.go --my-path `pwd` 
provided path was /Users/Arman/go/src/github.com/rmaan/project/ 
+0

Ok, aber wie sollte ich es auf das übergeordnete Projekt auflösen, falls ich in der Struktur von 'myapp/src/server.go' bin? –

+0

Mein Punkt ist Ihre Projektstruktur ist irrelevant. In der Regel werden Pfade explizit über Flags (https://golang.org/pkg/flag/) oder Config-Dateien zum Programm weitergeleitet. –

+0

Ok danke, also wie soll ich es via Flag updaten und wie soll ich zwei Level aufsteigen? –

Verwandte Themen