16

プロジェクトで glog フラグ log_dir を使用しています。最近、kubernetes ライブラリをインポートしたところ、このランタイム パニックが発生し始めました

パニック: ./aaa.test フラグが再定義されました: log_dir

May 16 23:51:35 ecmdev03-core01 docker[26867]: goroutine 1 [running]:
May 16 23:51:35 ecmdev03-core01 docker[26867]: panic(0x15ebc60, 0xc8201aae90)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/runtime/panic.go:464 +0x3e6
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).Var(0xc8200160c0, 0x7f561118c1c0, 0xc8201aae40, 0x1bddd70, 0x7, 0x1d75860, 0x2f)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:776 +0x454
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).StringVar(0xc8200160c0, 0xc8201aae40, 0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:679 +0xc7
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).String(0xc8200160c0, 0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f, 0xc8201aae30)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:692 +0x83
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.String(0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f, 0xba3950)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:699 +0x5f
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/vendor/github.com/golang/glog.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/vendor/github.com/golang/glog/glog_file.go:41 +0x13e
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/labels.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/labels/selector.go:810 +0x6b
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/api/unversioned.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/api/unversioned/well_known_labels.go:30 +0x6f
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/api.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/api/types.go:2731 +0x64

k8s によって販売されている glog ライブラリが、私が使用しているものと競合しているようです。ベンダー ディレクトリの導入は、この問題の解決策になりますか? glide、govendor、gb などのベンダー ライブラリを使用する必要がありますか? はいの場合、どちらが優先されますか?

4

5 に答える 5

5

そのエラーは競合するライブラリとは関係ありません。競合するフラグ ( log_dir) です。これは、「--log_dir」フラグを追加していることを意味し、kubernetes が使用する glog ライブラリにもlog_dirフラグがあります。これは、パッケージの初期化中にライブラリにフラグを追加する際の問題です。残念ながら、ベンダリングは何も変えません。ログ ライブラリまたは kubernetes をインポートするときに、グローバル変数を操作しflag.CommandLineて別の変数を指すようにすることで、これを回避できる場合がありますが、インポートの順序に依存するため、注意が必要です。flag.FlagSet

于 2016-05-18T18:45:11.023 に答える
3

私はk8sライブラリを使用していますが、flag redefined: log_dir問題にも直面しました。kubernetes のいくつかのパッケージがベンダーにないことがわかりましgovendor addた。その後、修正されました。

これらのパッケージがベンダー フォルダーに見つからない場合、glog の 2 つのコピー (ベンダー フォルダーに 1 つ、 $GOPATH の k8s.io/kubernetes/vendor に 1 つ) がビルドされたと思います。

不足しているパッケージを見つける方法は? $GOPATH/src/k8s.io の名前を別の名前に変更し、プロジェクトをビルドして、見つからなかったものを確認し、追加します~

于 2016-09-21T15:43:13.377 に答える
1

エラーがflag redefined: log_dir表示され、スタック トレースが指摘されglog/glog_file.go:41 +0xd3ました。

問題の根本原因は、GOPATH.

異なる場所に同じレポの 2 つのコピーがありました。コピーの 1 つでテストを実行しようとしたときに、他のリポジトリから go パッケージが選択されました。そのため、 のすべてについて 2 つの定義がありましたglog

他のレポの名前を新しい名前に変更すると、機能し始めました。

GOPATHそのため、他の場所からライブラリをインポートしていないことを確認してください。

于 2019-03-26T07:39:05.510 に答える