web-dev-qa-db-ja.com

npm install -gに相当するGolang

コンピューターのどこからでもbashコマンドで実行できるようにインストールしたいコンパイル済みのGolangプログラムがある場合、どうすればよいですか?たとえば、nodejs

npm install -g express

コマンドを実行できるようにExpressをインストールします

express myapp

エクスプレスは、現在のディレクトリが何であれ、「myapp」と呼ばれるノードアプリケーションのファイルディレクトリを生成します。 goに相当するコマンドはありますか? 「go install」コマンドでは、実行するために実行可能ファイルを含むディレクトリにいる必要があると思います

前もって感謝します!

19
Ryan

私の知る限り、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)に挿入します。

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

または、実行可能ファイルを/usr/local/binにコピーまたはリンクすることもできます。

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

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 should not add dependency to go.mod#27643

13
Alec

Goでこれに最も近いものはgo getです。デフォルトでは、指定されたリポジトリURLからGoパッケージをフェッチします。また、シェルに$GOPATH変数を設定して、Goがパッケージを保存する場所(およびコードをコンパイルするときにパッケージを見つける場所)を認識できるようにする必要があります。 go get- tedパッケージ)。

構文例:

$ go get github.com/user/repo

npm-gフラグによって提供される動作はデフォルトであり、go getを使用してインストールされたパッケージは通常、グローバルに利用できます。

コマンドの詳細については、go get --helpを参照してください。

@helmbertで述べたように、スタンドアロンパッケージをインストールする場合は、$GOPATH$PATHに追加すると便利です。

3
Jules

TL; DR下部にあります。この結論に至った経緯と、より明白な解決策が機能しない理由を説明します。


この質問を見て、「ルートのGOPATH=/usrを設定できれば、/usr/bin//usr/src!にインストールできるだろう」と思った

だから私は明白なことを試しました:

  1. GOPATH=/usrをルートの.bashrcに追加します。
    そしてうまくいきました!
    並べ替え。
    あんまり。
    締め切りました、Sudoはルートの.bashrcを実行しません。 「セキュリティ」またはそのようなもの。

  2. env_setまたは/etc/sudoersの何かを実行します
    ターンアウト、/etc/sudoersremove環境変数のみを許可します。 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が「通常の」方法で使用されます。

0
SIGSTACKFAULT