Ошибка переопределения флага glog

Я использую glog flag log_dir в моем проекте. Недавно я импортировал библиотеку кубернетов и начал получать эту панику в режиме

panic:./aaa.test flag redefined: 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

Похоже, что библиотека glog, которая продается k8s, противоречит той, которую я использую. Представляет ли каталог поставщика решение для этой проблемы? Должен ли я использовать распространенные библиотеки, такие как glide, govendor, gb и т.д.? Если да, какой из них предпочтительнее?

Ответ 1

Эта ошибка не связана с конфликтующими библиотеками, это противоречивый флаг (log_dir). Это означает, что вы добавляете флаг "-log_dir", а библиотека glog, используемая кубернетами, также имеет флаг log_dir. Это проблема с добавлением флагов в библиотеки во время инициализации пакета. К сожалению, продажа ничего не изменит. Возможно, вы сможете обойти это, манипулируя глобальной переменной flag.CommandLine, указывая на другую flag.FlagSet при импорте вашей библиотеки журналов или кубернетов, но это будет сложно, поскольку это зависит от порядка импорта.

Ответ 2

Я столкнулся с аналогичной проблемой при распространении моих зависимостей с использованием глиссады.

В соответствии с https://github.com/kubernetes/kubernetes/issues/25572 kubernetes не имеет glide.lock/glide.yml, сглаживание зависимостей не происходит и в конце концов определяется дважды, так как также включен поставщик /k 8s.io/kubernetes/vendor.

Обходной путь от вышеупомянутой ссылки работал хорошо для меня:

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

Ответ 3

Я использую библиотеку k8s и сталкиваюсь с проблемой flag redefined: log_dir. Я обнаружил, что несколько пакетов кубернетов не в моем продавце. Тогда я govendor add их, тогда он был исправлен.

Я предполагаю, что была построена одна копия glog (одна в моей папке поставщика, одна в k8s.io/kubernetes/vendor в моем $GOPATH), когда эти пакеты не найдены в моей папке поставщика.

Как узнать недостающие пакеты? Я использую глупый путь, переименую $GOPATH/src/k8s.io на что-то еще и строю свой проект, посмотрю, что не найдено. Затем добавьте его ~