首页 > 解决方案 > 如何找到导致“Sirupsen/logrus”与“sirupsen/logrus”意外模块路径错误的依赖关系?

问题描述

我正在尝试将https://github.com/appscode/voyager从 glide 转换为 go mod。

我收到如下错误:

go: github.com/Sirupsen/logrus@v1.4.1: parsing go.mod: unexpected module path "github.com/sirupsen/logrus"
go: error loading module requirements

如何找到这个旧的 Sirupsen 模块的来源?

标签: gogo-modules

解决方案


如何找到这个旧的 Sirupsen 模块的来源?

使用 Go 1.13 beta ( go get golang.org/dl/go1.13beta1 && go1.13beta1 download) 甚至更好,尝试最新的 Go on tip / master ( go get golang.org/dl/gotip && gotip download)。

Go 1.13 总体上改进了错误消息。它应该对您的情况有所帮助,包括最有可能显示导致错误的导入链。

例如:

$ gotip build .
go: example.com/temp/mod imports
        github.com/docker/libcompose/docker imports
        github.com/Sirupsen/logrus: github.com/Sirupsen/logrus@v1.4.2: parsing go.mod:
        module declares its path as: github.com/Sirupsen/logrus
                but was required as: github.com/sirupsen/logrus

在该示例中,您可以看到docker/libcompose/docker正在导入旧的且现在不正确的大写版本的Sirupsen/logrus.

Sirupsen/logrus人们看到vs. case 不匹配的最常见原因sirupsen/logrus是在导入github.com/docker/docker或其他 docker 存储库之一时。导入 docker repos 与模块有点混淆,包括因为:

  • docker/docker回购不遵循 semver 。
  • 回购中有一个非常古老的v1.13.1semver 标签docker/docker
    • 即使它已经有几年历史了,它仍然是该 repo 上的“最新”semver 标签,因此go如果您不要求更具体的版本,命令默认选择旧版本。
    • 该旧docker/docker版本导入旧的且不正确的大写字母Sirupsen/logrus,然后会触发上述问题中报告的错误。
  • docker 客户端包在 v1.13.1 之后发生了重大变化。
  • 关于docker/dockerdocker/engine存储库以及使用什么导入路径通常存在混淆。
  • docker repos 没有go.mod文件。

对于docker/dockerrepo,导入路径仍然是github.com/docker/docker,但它需要来自github.com/docker/engine,因此推荐的方法通常是让 docker 导入器执行import "github.com/docker/docker"并将其编辑go.mod为如下内容:

require (
    github.com/docker/docker v1.13.1
)

replace github.com/docker/docker => github.com/docker/engine <tag-or-commit-hash>

Docker 问题#39302跟踪尝试记录使用模块时如何导入 docker repos。


推荐阅读