我在我的项目中使用glog flag 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等的销售库吗?如果是,哪一个更受欢迎?
答案 0 :(得分:3)
该错误与冲突的库无关,它是一个冲突的标志(log_dir
)。这意味着你要添加一个“--log_dir”标志,kubernetes使用的glog库也有一个log_dir
标志。这是在包init期间在库中添加标志的问题。不幸的是,售卖不会改变任何东西。您可以通过在导入日志库或kubernetes时操纵flag.CommandLine
全局变量指向不同的flag.FlagSet
来解决此问题,但这将非常棘手,因为它取决于导入顺序。 / p>
答案 1 :(得分:3)
在使用glide供应我的依赖项时遇到了类似的问题。
根据https://github.com/kubernetes/kubernetes/issues/25572 kubernetes没有glide.lock / glide.yml,依赖性展平不会发生,最终glog被定义两次,因为还包括vendor / k8s.io / kubernetes / vendor。
上述链接的解决方法对我有用:
glide install --strip-vendor --strip-vcs
答案 2 :(得分:3)
我使用k8s库并遇到flag redefined: log_dir
问题。
我发现我的供应商中没有几个kubernetes包。然后我govendor add
,然后它被修复了。
我猜想在我的供应商文件夹中找不到这些软件包时,会构建两个glog副本(一个在我的供应商文件夹中,一个在我的$ GOPATH中的k8s.io/kubernetes/vendor中)。
如何查找丢失的包裹?我使用愚蠢的方式,将$ GOPATH / src / k8s.io重命名为其他内容并构建我的项目,查看未找到的内容。然后添加它〜
答案 3 :(得分:0)
我看到<body>
<aside>
<svg viewBox="0 0 100 100">
<defs>
<pattern id="pattern1" height="100%" width="100%" patternContentUnits="objectBoundingBox">
<image height="1" preserveAspectRatio="slice" xlink:href="https://i.imgur.com/8OtgM8B.jpg" />
</pattern>
</defs>
<polygon fill="url(#pattern1)" points="0,0 70,0 100,100 0,100"/>
</svg>
</aside>
<article>
<h1>Title</h1>
<p>Sample Text</p>
</article>
</body>
错误,并且堆栈跟踪指向flag redefined: log_dir
。
此问题的根本原因是glog/glog_file.go:41 +0xd3
。
我在不同的位置有两个相同的仓库的副本。尝试在其中一个副本中运行测试时,从另一个仓库中选择了go软件包。所以我在GOPATH
中对所有事物都有两个定义。
我将另一个存储库重命名为新名称,然后它开始工作。
因此,请检查您的glog
并确保您没有从其他地方导入库。