【问题标题】:Golang equivalent of npm install -gGolang 相当于 npm install -g
【发布时间】:2016-08-07 14:21:13
【问题描述】:

如果我有一个编译好的 Golang 程序,我想安装它,以便我可以在计算机上的任何地方使用 bash 命令运行它,我会怎么做?比如在nodejs中

npm install -g express

安装 express 以便我可以运行命令

express myapp

并且 express 会在我当前的目录中为一个名为“myapp”的节点应用程序生成一个文件目录。是否有等效的命令?我相信现在使用“go install”命令,您必须在包含可执行文件的目录中才能运行它

提前致谢!

【问题讨论】:

  • 您将 GOPATH/bin 添加到您的 PATH 中吗? (或者你在寻找某种go package manager?)

标签: go npm bin npm-install goinstall


【解决方案1】:

更新:如果您使用 Go 1.16,此答案仍然有效,但 go install 已更改,现在是安装可执行包的推荐方法。有关解释,请参阅 Karim 的答案:https://stackoverflow.com/a/68559728/10490740

使用 Go >= 1.11,如果您的当前目录位于基于模块的项目中,或者您在环境中设置了 GO111MODULE=ongo get 将不会“全局”安装包。它会将它们添加到您项目的 go.mod 文件中。

从 Go 1.11.1 开始,设置 GO111MODULE=off 可以规避这种行为:

GO111MODULE=off go get github.com/usr/repo

基本上,通过禁用此单个命令的模块功能,它将按预期安装到 GOPATH。

不使用模块的项目仍然可以go get正常安装二进制文件到$GOPATH/bin

关于这种行为变化的讨论很长,并且记录了多个问题,从这里分支:golang/go - cmd/go: go get should not add a dependency to go.mod #27643

【讨论】:

  • 这是我要找的信息,你找到了!
  • 随着 Go 1.17 GOPATH 和 GO111MODULE 将被删除。这种情况你知道怎么处理吗?
  • Sasha,你可以从 Go 1.16 开始使用go install package@version。我在stackoverflow.com/a/68559728/844134的答案中添加了详细信息
【解决方案2】:

据我所知,没有直接等同于npm install -g。最接近的等价物不是go install,而是go get。来自帮助页面 (go help get):

用法:go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]

获取下载并安装导入路径命名的包, 以及它们的依赖项。

默认情况下,go get 将二进制文件安装到$GOPATH/bin,因此使这些二进制文件可从任何地方调用的最简单方法是将该目录添加到您的$PATH

为此,将以下行放入您的.bashrc(或.zshrc,具体取决于您使用的shell):

export PATH="$PATH:$GOPATH/bin"

或者,您也可以将可执行文件复制或链接到/usr/local/bin

ln -s $GOPATH/bin/some-binary /usr/local/bin/some-binary

【讨论】:

  • 当时这是正确的(感谢您的帮助),但对于遇到此问题的任何人来说,值得注意的是,现在有一个 go install 可以构建二进制文件并将其放入您的$GOPATH/bin
  • 我必须安装 go.mod 文件中列出的所有依赖项。我可以使用 go get 命令做一个我的一个,但是还有其他替代方法吗?像 npm i 这样的东西,它会一次安装所需的依赖项。
【解决方案3】:

从 Go 开始 >= 1.16 推荐的安装可执行文件的方法是使用

go install package@version

例如,go install github.com/fatih/gomodifytags@latest

可执行文件(主包)安装到由GOBIN 环境变量命名的目录,如果未设置GOPATH 环境变量,则默认为$GOPATH/bin$HOME/go/bin。您需要将此目录添加到您的 PATH 变量中以全局运行可执行文件。就我而言,我已将此行添加到我的 ~/.zshrc 文件中。 (如果您使用的是 bash,请将其添加到 ~/.bash_profile 文件中):

export PATH="$HOME/go/bin:$PATH"

Go 团队发布了一个 blog post 关于这个变化,这里是解释引用:

我们曾经推荐使用 go get -u 程序来安装一个可执行文件,但是这种使用导致与 go get 用于在 go.mod 中添加或更改模块版本要求的含义混淆。

更多详情请参考go install documentation

【讨论】:

    【解决方案4】:

    在 Go 中与此最接近的类似物是 go get。默认情况下,它将从提供的存储库 URL 获取 Go 包,并需要在您的 shell 中设置一个 $GOPATH 变量,以便 Go 知道在哪里存储包(以及随后在编译代码时根据@找到它们的位置987654323@-ted 包)。

    示例语法:

    $ go get github.com/user/repo
    

    npm-g 标志提供的行为是默认的,使用go get 安装的包通常全局可用。

    有关该命令的更多信息,请参阅go get --help

    正如@helmbert 所提到的,如果您要安装独立软件包,将您的$GOPATH 添加到您的$PATH 非常有用。

    【讨论】:

    • 当我使用这个时,go/bin 文件夹是不变的。文件还有其他地方可以去吗?
    【解决方案5】:

    Linux 用户的简短解决方案:

    1. 照常使用go get 命令
    2. 将以下行添加到.bashrc
    # This is the default GOPATH, you should confirm with the 'go env' command
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    
    1. 重新启动终端或获取它。已安装的二进制文件将在全球范围内可用。

    【讨论】:

      【解决方案6】:

      TL;DR 在底部。我将向您介绍我是如何得出这个结论的,以及为什么更明显的解决方案不起作用。


      看到这个问题,我想“如果我可以设置root的GOPATH=/usr,它会在/usr/bin//usr/src中安装东西!”

      所以我尝试了显而易见的事情:

      1. GOPATH=/usr 添加到root 的.bashrc
        它奏效了!
        有点。
        不是真的。
        事实证明,sudo 没有执行 root 的 .bashrc。为了“安全”或类似的东西。

      2. env_set/etc/sudoers中的某事
        事实证明,/etc/sudoers 只能删除 环境变量。没有env_set 指令。
        (据我所知)

      3. 挖掘man sudoers
        sudo 从哪里获得它的默认环境变量集?
        嗯,列表中的第一个是/etc/environment,所以这是我使用的。


      sudo echo "GOPATH=/usr" >> /etc/environment
      sudo go get <repo>
      

      二进制文件将被放入/usr/bin,源代码将被放入/usr/src

      以非 root 身份运行 go 将以“正常”方式使用 GOPATH。

      【讨论】:

      • 您也可以GOPATH=/ 并安装在/bin/src 中。
      • 通常,/bin/usr/bin 只能由您的发行版包管理器修改。 /usr/local 是进行系统范围修改的更好地方。你不会不小心踩到包管理器的脚趾,而且权限通常更容易被非特权更改(例如,在 macOS 上)。
      【解决方案7】:

      如果你没有安装 go,你可以使用gobinaries。它从 github repo 构建项目的按需二进制文件。

      安装 go 包的命令是:

      curl -sf https://gobinaries.com/rakyll/hey | sh
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 2021-05-15
        • 2017-04-09
        • 1970-01-01
        相关资源
        最近更新 更多