goツールでしばらく遊んだ後、それは次のようになりますgo get:
- (オプションで)ダウンロード、
- コンパイル、
- とインストール
go install単純にソフトウェアの一部
- コンパイルします
- とインストール
それ。この場合、go installコマンドがgo get優先されるのに、なぜコマンドが存在するのですか?
回答:
go installローカルで作業する場合のワークフローの一部です。ライブラリを使用したいが、何らかの理由で変更が必要だとします。あなたはするでしょう:
go get -d library、それをダウンロードするだけです。go install library ローカルバージョンをインストールします。私の知る限り、ダウンロードしgo getてはならないことを示すフラグがないため、go installここで置き換えることはできません。
新しいパッケージを最初から開発する場合も、同じワークフローが使用されます。
go installあなたの目標をより明確にしますが、私は両方が同じことを達成すると思います。として宣言されたものを含むいくつかのパッケージでテストしましたがmain、それらは同等のようでした。ドキュメントには、このコマンドが非常に不足しています。
go get代わりに使用することもできます(追加しない限り)。ライブラリを最初から作成するときにも使用できます。完全に冗長なようです。go installgo get-ugo getgo install
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環境変数は、移動ツールで使用されます。get、buildおよび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モジュール対応のセットアップでパッケージをダウンロードします。
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フラグは常に有効になります。
go get ./path/to/local_packageでき、使用した場合と同じように動作しgo install ./path/to/local_packageますよね?この場合、ダウンロードプロセスがないためです。