2017-11-28 6 views
3

が、私は次のコードにworkingDir, _ := os.Getwd()server.goファイルを実行するプロジェクトのルートパスを取得し、ルートパスを取得する方法、 は今、私は次のような構造にserver.goファイルを移動する必要がありは、ルートプロジェクトの下にある

myapp 
    src 
    server.go 

と私はgo/src/myapp/src/server.goのパスを持ってserver.gomyapp->src>server.goの下に移動した後、私はGEに現在go/src/myapp のパスをしたいと私はプレビューのパスを取得したい、

自動的に行くにはどうすればいいですか?または私は../明示的にパスを取得する必要がありますか?

+0

を使用すると、囲碁プログラムを実行すると、何の「プロジェクト」はありません。あなたはコンパイルされたバイナリを実行しています。ソースコードがどこにあるのか(たとえそれが実行されているマシンに存在していても)どこの概念でもないし、そうでなければならないという概念もない。 – Adrian

+0

@Adrian - 問題は私がルートプロジェクトからjsonファイルを読む必要があることです。問題は非常に奇妙です.Golandでプログラムを実行すると、 'go/src/myapp /'のようなパスが提供されます。私はこのパスを 'go/src/myapp/src/server.go'と同じプロジェクトで実行しているので、いくつかの汎用的な解決法を見つけたいと思います。 –

+0

私は、設定ファイル、コマンドラインフラグ、環境変数でパスを設定できるようにしたいと思います。 – Adrian

答えて

4

os.Getwd()ソースファイルのパスが返されません。プログラムの現在の作業ディレクトリ(通常はプログラムを実行したディレクトリ)を返します。

例:

は私が他のディレクトリに変更し、そこに実行すると、結果が変わるだけでos.Getwd()

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

を出力/Users/Arman/go/src/github.com/rmaan/project/main.goでmain.goを持っていると仮定します。

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

IMO明示的に代わりに(それが本番環境で特別に変更される可能性として)文脈からそれを推測しようとしているのあなたのプログラムにしたいパスを渡す必要があります。ここにはflagパッケージの例があります。

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) 
} 

次のようにあなたのプログラムを実行します。

$ 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

しかし、私は 'myapp/src/server.go'の構造のimの場合、どのように親プロジェクトに解決する必要がありますか? –

+0

私のポイントはあなたのプロジェクト構造は無関係です。通常、パスはフラグ(https://golang.org/pkg/flag/)または設定ファイルを介して明示的にプログラムに渡されます。 –

+0

ありがとうございます。フラグを使って更新する方法と、2つのレベルを上げる方法はありますか? –

関連する問題