Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
go模块安装go工具_Go_Go Modules - Fatal编程技术网

go模块安装go工具

go模块安装go工具,go,go-modules,Go,Go Modules,我使用go模块作为依赖项管理,但在安装类似以下内容时遇到问题: go get -u github.com/go-critic/go-critic/... 上述结果是: go: cannot find main module; see 'go help modules' 试试这个命令 GO111MODULE=on go-get-u github.com/go-critic/go-critic/…编辑:此处的原始答案特别提到了go 1.11中的工具状态。自从Go 1.12发布以来,这已不再准确。

我使用go模块作为依赖项管理,但在安装类似以下内容时遇到问题:

go get -u github.com/go-critic/go-critic/...
上述结果是:

go: cannot find main module; see 'go help modules'
试试这个命令
GO111MODULE=on go-get-u github.com/go-critic/go-critic/…
编辑:此处的原始答案特别提到了go 1.11中的工具状态。自从Go 1.12发布以来,这已不再准确。有关在Go 1.12及更高版本中处理这种情况的详细信息,请参阅及其链接

如果
GO111MODULE
变量在上设置为
,则您必须在初始化的go模块目录树中才能使用
go get
,即使您试图获取工具而不是新的依赖项。这是一个众所周知且备受争议的问题:

短期解决方案是运行
GO111MODULE=off-go-get
。这将显式禁用模块支持,即使您当前在模块包中,并强制它仅使用您的GOPATH

从长远来看,通过
go-get
(或另一个命令,如带有标志的
go-install
)来支持工具安装是一个持续讨论的领域 到目前为止,几乎没有达成共识。然而,如果接受for Go 1.12,它将允许
Go get
在模块外工作,即使设置了
GO111MODULE=on

2019年2月,
GO111MODULE=on Go get
也可以工作。
(来自)

模块 当
GO111MODULE
设置为
on
时,
go
命令现在支持模块目录外的模块感知操作,前提是这些操作不需要解析相对于当前目录的导入路径或显式编辑
go.mod
文件。
诸如
go-get
go-list
go-mod-download
等命令的行为就像是在一个最初要求为空的模块中一样。
在此模式下,
go env GOMOD
报告系统的空设备(
/dev/null
NUL


刚在go1.11.2上出现了同样的问题。试图设置
GO111MODULE=on
,但无法修复

我的解决方案:

  • 升级至使用go 1.12.5:

    这可以解决
    go:找不到主模块;请参阅“转到帮助模块”
    问题

  • 然后我遇到了另一个问题
    go:无法使用path@versionGOPATH模式下的语法

    通过设置env
    GO111MODULE=on


  • 这里的其他几个答案在这一点上已经过时了

    至少有两种情况需要考虑:

    案例1 您想安装一个工具,但不想修改当前的
    go.mod
    以作为依赖项跟踪该工具

    简而言之,对于Go 1.12或1.13,最简单的解决方案是将
    cd
    放入没有
    Go.mod
    的目录,例如:

    $ cd /tmp
    $ go get github.com/some/tool@v1.0.1
    
    // +build tools
    
    package tools
    
    import (
        _ "golang.org/x/tools/cmd/stringer"
    )
    
    或者,是一个模块感知命令,用于安装或运行二进制文件,提供了额外的灵活性,包括在不改变当前模块的
    go.mod

    有关更多详细信息,请参阅此相关文档,包括Go 1.11的解决方案,以及Go 1.14中可能的新选项,用于在不更新您的
    Go.mod
    的情况下获取工具

    案例2 另一方面,如果您想在
    go.mod
    中明确跟踪作为版本依赖项的工具,请参阅模块wiki上的常见问题解答

    简而言之,您可以在一个单独的包中创建一个
    tools.go
    文件,并设置一个
    /+buildtools
    build标记,例如:

    $ cd /tmp
    $ go get github.com/some/tool@v1.0.1
    
    // +build tools
    
    package tools
    
    import (
        _ "golang.org/x/tools/cmd/stringer"
    )
    

    import语句允许
    go
    命令在模块的
    go.mod
    中精确记录工具的版本信息,而
    /+build tools
    build约束阻止正常构建实际导入工具。

    我也遇到了同样的问题,并且直接“几乎”解决了这个问题。起初它不起作用。这是因为模块已经初始化,在设置GO111MODULE=on之前,我已经运行了“go get…”命令


    为了让它工作,我删除了“go.mod”,通过运行“go mod init…”重新初始化mod,并重新运行必要的“go get…”命令。

    我遇到了同样的问题,并通过下面的命令解决了它


    $go env-w GO111MODULE=auto

    是否初始化了主模块“go mod init”?为了更好地理解,请转到这个问题。对于错误的描述,很抱歉,我的问题是将cli工具安装到我的$GOPATH/bin目录中。请参阅此相关内容,其中包括Go 1.11的选项、Go 1.12中添加的相关功能,以及Go 1.14中有望支持的功能。此魔术不起作用。我已经导出GO111MODULE=on。我想要的是在GO111MODULE=on的情况下将cli工具安装到$GOPATH/bin目录中。它使go-get工具在打开Go111模块后表现不同。=>GO111MODULE=on或GO111MODULE=autoFWIW,此答案是正确的,但不再正确。请参阅此以了解更多详细信息和Go 1.12、1.13的答案,以及Go 1.14中可能的新选项,以便在不更新Go.mod的情况下获得工具。此外,这个答案还涵盖了如果您想在go.mod中将工具作为版本依赖项显式跟踪该怎么做(例如,可能是因为您希望每个人都使用完全相同版本的linter或代码生成器,以避免由于不同的人使用的工具版本略有不同而出现抖动)。与我自己的相比,这是一个有趣的更新(最终陈腐)回答。赞成票。我刚刚花了一天时间试图解决
    工具造成的所有问题。go
    hack。我建议人们不要使用它。参见案例2,如果我在一个新克隆的项目上运行
    go mod download
    ,该项目有
    工具。go
    文件,那么我是否需要为每个t手动运行
    go install
    列出的ool