go get和go install之间有什么区别?

go get和go install之间有什么区别?,go,Go,在使用go工具一段时间后,它看起来像go-get: (可选)下载 汇编 安装 一个软件,而只需安装 汇编 安装 它。在这种情况下,go-install命令为什么会存在,因为go-get取代了它?go-install是本地工作流程的一部分。假设您想使用一个库,但由于某些原因需要进行更改。你会做: go get-d库,它只下载它 对下载的软件包进行更改 转到安装库安装本地版本 据我所知,go-get没有任何标志表明它不应该下载,因此它不能在这里替换go-install 当您从头开始开发新包时,使

在使用
go
工具一段时间后,它看起来像
go-get

  • (可选)下载
  • 汇编
  • 安装
  • 一个软件,而
    只需安装

  • 汇编
  • 安装

  • 它。在这种情况下,
    go-install
    命令为什么会存在,因为
    go-get
    取代了它?

    go-install
    是本地工作流程的一部分。假设您想使用一个库,但由于某些原因需要进行更改。你会做:

    • go get-d库
      ,它只下载它
    • 对下载的软件包进行更改
    • 转到安装库
      安装本地版本
    据我所知,
    go-get
    没有任何标志表明它不应该下载,因此它不能在这里替换
    go-install

    当您从头开始开发新包时,使用相同的工作流


    编辑:6年后,Go 1.16更新并澄清了
    Go install
    Go get
    的用法:

    Go get
    按此顺序执行两项主要操作:

    • 下载并将导入路径中命名的包(源代码)及其依赖项保存在
      $GOPATH/src/
      中,然后

    • 执行
      go安装

    -d
    标志(
    go-get-d
    )指示下载包后停止
    go-get
    ;也就是说,它指示
    go-get
    不要执行
    go-install


    区别:

    go get
    //验证是否需要下载软件包,如果需要下载,然后编译

    go install
    //跳过下载包的部分,只需编译即可(如果缺少任何包,这将引发错误)


    关于
    GOPATH
    环境变量

    Go工具使用
    GOPATH
    环境变量。必须设置它才能
    获取
    构建
    安装
    软件包,并指定工作区的位置。它可能是开发Go代码时需要设置的唯一环境变量

    同样,
    GOPATH
    不应该指向Go安装,而是指向您的工作区

    例如,在Windows上,如果您决定您的工作区位于
    c:\gowork\
    ,则需要将
    GOPATH
    值设置为
    c:\gowork

    您的源代码应该位于
    c:\gowork\src\\\\
    中,运行
    后,在命令提示符下从
    c:\gowork\src\\\\
    中获取
    ,您将看到
    c:\gowork\bin\\
    c:\gowork\pkg\\
    正在创建中。

    注意,这将使差异更加清楚,作为以下部分实现:

    go install
    现在接受带有版本后缀的参数(例如,
    go install example.com/cmd@v1.0.0
    )。
    这会导致
    go install
    以模块感知模式构建和安装软件包,忽略当前目录或任何父目录(如果有)中的
    go.mod
    文件。
    这对于在不影响主模块依赖关系的情况下安装可执行文件非常有用

    go install
    ,无论是否带有版本后缀(如上所述),现在是以模块模式构建和安装软件包的推荐方式

    go-get
    应与
    -d
    标志一起使用,以调整当前模块的依赖关系,而无需构建软件包,不推荐使用
    go-get
    构建和安装软件包 在未来版本中,
    -d
    标志将始终处于启用状态


    很好,我想我现在明白了,多亏了你的第一个例子。但是,在您的第二个软件包(从头开始开发新软件包)中,我也可以使用
    go-get./path/to/local\u-package
    ,它的行为与我使用
    go-install./path/to/local\u-package
    的行为相同,对吗?因为在这种情况下没有下载过程。
    go install
    使您的目标更加明确,但我认为两者都可以实现相同的目标。我用几个包进行了测试,包括声明为
    main
    的包,它们看起来是等价的。这个命令上的文档非常缺乏。它说,
    go-get
    需要gcc,但
    go-install
    不需要gcc。这与这个描述有什么关系?我不同意这个答案。您也可以在第三个要点中使用
    go-get
    而不是
    go-install
    ,因为
    go-get
    不会重新下载库(除非添加
    -u
    )。从头开始编写库时,也可以使用
    go-get
    go install
    似乎完全多余。
    go install
    确实在模块感知设置中下载了该软件包。也许我只是不知道这背后的原因。。。但我不明白为什么要禁用单个构建/安装命令。这与我见过的任何其他包管理器都不同seen@TrevorJex重新阅读,仍然有一个生成/安装命令:
    go install
    。它会这样做,在特定版本安装包,而不管当前模块上下文如何。与旧的
    go-get
    相比,这是一个改进。