Ошибка переопределения флага 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 на что-то еще и строю свой проект, посмотрю, что не найдено. Затем добавьте его ~