簡體   English   中英

Golang相當於npm install -g

[英]Golang equivalent of npm install -g

如果我有一個編譯好的 Golang 程序,我想安裝這樣我就可以在我的計算機上的任何地方使用 bash 命令運行它,我會怎么做? 例如,在 nodejs

npm install -g express

安裝 express 以便我可以運行命令

express myapp

express 會在我當前的目錄中為一個名為“myapp”的節點應用程序生成一個文件目錄。 go 是否有等效命令? 我相信現在使用“go install”命令,您必須在包含可執行文件的目錄中才能運行它

提前致謝!

使用 Go >= 1.11,如果您的當前目錄位於基於模塊的項目中,或者您在環境中設置了GO111MODULE=on ,則go 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 不應該添加對 go.mod #27643 的依賴

據我所知,沒有直接等價於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

為此, .zshrc下行放入您的.bashrc (或.zshrc ,具體取決於您使用的外殼):

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

或者,您也可以將可執行文件復制或鏈接到/usr/local/bin

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

在 Go 中最接近的類似物是go get 默認情況下,它將從提供的存儲庫 URL 獲取 Go 包,並需要在您的 shell 中設置$GOPATH變量,以便 Go 知道在哪里存儲包(以及隨后在編譯代碼時根據go getgo get找到它們) -ted 包)。

示例語法:

$ go get github.com/user/repo

npm-g標志提供的行為是默認的,使用go get安裝的包通常是全局可用的。

有關該命令的更多信息,請參閱go get --help

正如@helmbert 所提到的,如果您要安裝獨立軟件包,將您的$GOPATH添加到您的$PATH很有用。

Linux 用戶的簡短解決方案:

  1. 像往常一樣使用go get命令
  2. .bashrc添加到.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. 重新啟動終端或獲取它。 已安裝的二進制文件將在全球范圍內可用。

TL; DR在底部。 我將向您介紹我是如何得出這個結論的,以及為什么更明顯的解決方案不起作用。


看到這個問題,我想“如果我可以設置 root 的GOPATH=/usr ,它會在/usr/bin//usr/src安裝東西!”

所以我嘗試了顯而易見的事情:

  1. GOPATH=/usr添加到 root 的.bashrc
    它奏效了!
    有點。
    並不真地。
    事實證明, sudo不執行 root 的.bashrc 為了“安全”或類似的東西。

  2. /etc/sudoersenv_set或其他東西
    事實證明, /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。

從 Go >= 1.16開始,推薦的安裝可執行文件的方法是使用

go install package@version

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

可執行文件(主包)安裝到由指定的目錄GOBIN環境變量,默認為$GOPATH/bin$HOME/go/bin如果GOPATH環境變量未設置。 您需要將此目錄添加到PATH變量以全局運行可執行文件。 就我而言,我已將此行添加到我的~/.zshrc文件中。 (如果您使用的是 bash,請將其添加到~/.bash_profile文件中):

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

Go 團隊發布了一篇關於此更改的博客文章,以下是解釋引用:

我們曾經推薦使用 go get -u program 來安裝一個可執行文件,但是這種用法與 go get 在 go.mod 中添加或更改模塊版本要求的含義造成了太多混淆。

有關更多詳細信息,請參閱go install文檔

如果你沒有安裝 go,你可以使用gobinaries 它從 github repo 構建項目的按需二進制文件。

安裝 go 包的命令是:

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

如果您使用的是 zsh:

首先:安裝您的 package 使用:

go install package@version

然后,您編輯 your.zshrc 文件

nano ~/.zshrc

將此行添加到 .zshrc 文件的末尾:

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

最后但並非最不重要的:

source ~/.zshrc

然后打開一個新終端並執行您的命令:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM