2016-05-17 9 views
11

プロジェクトでglogフラグlog_dirを使用しています。最近、私はkubernetesライブラリをインポートし、このランタイムパニックにglogフラグの再定義エラー

パニック入門:./aaa.testフラグを再定義:K8SによってvendoredさglogライブラリはI 1と競合しているように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 

は、それは見えます使用しています。ベンダーのディレクトリにこの問題の解決策を導入していますか?私はglide、govendor、gbなどのようなvendoringライブラリを使うべきですか?はいの場合はどちらを優先しますか?

答えて

2

このエラーは、競合するライブラリと関係なく、競合するフラグ(log_dir)です。つまり、 "--log_dir"フラグを追加し、kubernetesで使用されるglogライブラリにはlog_dirフラグも付け加えます。これは、パッケージinit中にライブラリにフラグを追加する際の問題です。残念ながら、売り手は何も変わらないでしょう。ログライブラリまたはkubernetesをインポートするときに、flag.FlagSetを指すようにグローバル変数flag.CommandLineを操作することでこの問題を回避できますが、インポートの順序に依存するため難しくなります。

1

グライドを使用して自分の依存関係をベンダー化するときに同様の問題が発生しました。

https://github.com/kubernetes/kubernetes/issues/25572によると、kubernetesにはglide.lock/glide.ymlがありません。依存関係の平坦化は起こりません。最終的には、vendor/k8s.io/kubernetes/vendorも含まれているためglogが2回定義されます。

aformentionedリンクからこの問題を回避するには、私には良い仕事を:

glide install --strip-vendor --strip-vcs

1

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

私のベンダーフォルダにこれらのパッケージが見つからない場合、glogの2つのコピーが作成されているようです(私のベンダーフォルダに1つ、k8s.io/kubernetes/vendorに$ GOPATHに1つあります)。

不足しているパッケージを見つける方法はありますか?私は愚かな方法を使用して、$ GOPATH/src/k8s.ioを別のものにリネームしてプロジェクトをビルドしました。見つからなかったものを見てみましょう。その後、

関連する問題