gogetとgoinstallの違いは何ですか?


83

goツールでしばらく遊んだ後、それは次のようになりますgo get

  1. (オプションで)ダウンロード、
  2. コンパイル、
  3. とインストール

go install単純にソフトウェアの一部

  1. コンパイルします
  2. とインストール

それ。この場合、go installコマンドがgo get優先されるのに、なぜコマンドが存在するのですか?

回答:


79

go installローカルで作業する場合のワークフローの一部です。ライブラリを使用したいが、何らかの理由で変更が必要だとします。あなたはするでしょう:

  • go get -d library、それをダウンロードするだけです。
  • ダウンロードしたパッケージに変更を加えます。
  • go install library ローカルバージョンをインストールします。

私の知る限り、ダウンロードしgo getてはならないことを示すフラグがないため、go installここで置き換えることはできません。

新しいパッケージを最初から開発する場合も、同じワークフローが使用されます。


1
いいですね、最初の例のおかげで理解できたと思います。ただし、2番目のパッケージ(新しいパッケージを最初から開発する)でも使用go get ./path/to/local_packageでき、使用した場合と同じように動作しgo install ./path/to/local_packageますよね?この場合、ダウンロードプロセスがないためです。
thiagowfx 2014

go installあなたの目標をより明確にしますが、私は両方が同じことを達成すると思います。として宣言されたものを含むいくつかのパッケージでテストしましたがmain、それらは同等のようでした。ドキュメントには、このコマンドが非常に不足しています。
BoppreH 2014

ここでは、gccが必要ですが、は必要ありgo getませんgo install。それはこの説明とどのように関連していますか?
AndreKR 2016年

3
私はこの答えに同意しません。ライブラリを再ダウンロードしないため、3番目の箇条書きのgo get代わりに使用することもできます(追加しない限り)。ライブラリを最初から作成するときにも使用できます。完全に冗長なようです。go installgo get-ugo getgo install
サイモン

34

go get この順序で2つの主要なことを行います。

  • $GOPATH/src/<import-path>インポートパスで指定されたパッケージ(ソースコード)とその依存関係をダウンロードして保存し、

  • を実行します go install

-dフラグは、( go get -d)に指示go getパッケージをダウンロードした後に停止します。つまり、実行しgo getないように指示しますgo install


違い:

go get //パッケージをダウンロードする必要があるかどうかを確認し、必要に応じてダウンロードしてからコンパイルします

go install //パッケージのダウンロードの部分をスキップし、コンパイルするだけです(パッケージが不足している場合はエラーがスローされます)


GOPATH環境変数について

GOPATH環境変数は、移動ツールで使用されます。getbuildおよびinstallパッケージ化できるように設定する必要があり、ワークスペースの場所を指定します。Goコードを開発するときに設定する必要がある唯一の環境変数である可能性があります。

繰り返しGOPATHますが、はGoのインストールではなく、ワークスペースを指す必要があります。

たとえば、Windowsでは、ワークスペースがにあると判断した場合は、値を次のようc:\gowork\に設定する必要があります。GOPATHc:\gowork

ここに画像の説明を入力してください

ソースコードは次の場所にある必要がc:\gowork\src\<some project folder>\あります。go getコマンドプロンプトでc:\gowork\src\<some project folder>\実行すると、c:\gowork\bin\c:\gowork\pkg\が作成されます。


go installモジュール対応のセットアップでパッケージをダウンロードします。
BerkantIpek20年

2

go 1.16(Q1 2021)を使用すると、その違いがより明確になり、問題40276の一部としてCL266360で実装されることに注意してください。

go installバージョンサフィックスが付いた引数を受け入れるようになりました(たとえばgo install example.com/cmd@v1.0.0)。
これが原因go installするモジュール対応モードでパッケージをビルドしてインストールし無視してgo.modファイル1が存在する場合、現在のディレクトリにまたは任意の親ディレクトリを。
これは、メインモジュールの依存関係に影響を与えずに実行可能ファイルをインストールする場合に役立ちます

go install(上記のように)バージョンサフィックスの有無にかかわらず、モジュールモードでパッケージをビルドおよびインストールするための推奨される方法になりました。

go get-dパッケージをビルドせずに現在のモジュールの依存関係を調整するには、フラグとともに使用する必要がありますパッケージのビルドとインストールgo getを使用することは非推奨です
では、今後のリリースで、-dフラグは常に有効になります


たぶん私はこれの背後にある理由を知らないだけです...しかし、あなたが単一のビルド/インストールコマンドを無効にしたい理由がわかりません。これは私が見た他のパッケージマネージャーとは異なります
Trevor Jex

@TrevorJexがgithub.com/golang/go/issues/40276を再読み込みしましたが、ビルド/インストールコマンドはまだ1つありますgo install。そして、現在のモジュールコンテキストに関係なく、特定のバージョンでパッケージをインストールします。それは古いものと比較して改善go getです。
vonC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.