web-dev-qa-db-fra.com

erreur de redéfinition du drapeau glog

J'utilise glog flag log_dir dans mon projet. Récemment, j'ai importé la bibliothèque kubernetes et commencé à obtenir cette panique d'exécution

panique: ./aaa.test flag redéfini: 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

Il semble que la bibliothèque glog vendue par k8s soit en conflit avec celle que j'utilise. L'introduction de l'annuaire des fournisseurs est-elle une solution à ce problème? Dois-je utiliser des bibliothèques de vente comme glide, govendor, gb, etc.? Si oui, lequel est préféré?

16
Smithsonian

Cette erreur n'a pas à voir avec les bibliothèques en conflit, c'est un indicateur en conflit (log_dir). Cela signifie que vous ajoutez un indicateur "--log_dir", et la bibliothèque glog utilisée par kubernetes a également un log_dir drapeau. C'est un problème avec l'ajout de drapeaux dans les bibliothèques lors de l'initialisation du package. Malheureusement, la vente ne changera rien. Vous pourrez peut-être contourner ce problème en manipulant le flag.CommandLine variable globale pour pointer vers un autre flag.FlagSet lorsque vous importez votre bibliothèque de journaux ou kubernetes, mais cela sera délicat car cela dépend de l'ordre d'importation.

4
Tim Allclair

J'ai rencontré un problème similaire lors de la commercialisation de mes dépendances à l'aide de glide.

Selon https://github.com/kubernetes/kubernetes/issues/25572 kubernetes n'a pas de glide.lock/glide.yml, l'aplatissement des dépendances ne se produit pas et à la fin le glog est défini deux fois puisque vendor/k8s.io/kubernetes/vendor est également inclus.

La solution de contournement du lien susmentionné a bien fonctionné pour moi:

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

3
Jefferson Girao

J'utilise la bibliothèque k8s et j'ai fait face à flag redefined: log_dir problème aussi. J'ai trouvé que plusieurs paquets de kubernetes ne sont pas chez mon fournisseur. Ensuite, je govendor add eux, puis il a été corrigé.

Je suppose que deux copies de glog ont été construites (une dans mon dossier fournisseur, une dans k8s.io/kubernetes/vendor dans mon $ GOPATH) lorsque ces paquets ne sont pas trouvés dans mon dossier fournisseur.

Comment trouver les paquets manquants? J'utilise une méthode stupide, renomme $ GOPATH/src/k8s.io en quelque chose d'autre et crée mon projet, vois ce qui n'a pas été trouvé.

3
Tong

Je voyais flag redefined: log_dir erreur et trace de pile pointée glog/glog_file.go:41 +0xd3.

La cause première du problème était le GOPATH.

J'avais deux exemplaires du même dépôt à différents endroits. Tout en essayant d'exécuter des tests dans l'une des copies, le package go a été sélectionné dans l'autre référentiel. J'ai donc eu deux définitions de tout dans glog.

J'ai renommé l'autre dépôt sous un nouveau nom, puis il a commencé à fonctionner.

Vérifiez donc votre GOPATH et assurez-vous que vous n'importez pas de bibliothèques ailleurs.

1
Vishal Kanaujia