「go get」コマンドは、コード管理ツールを利用してコード パッケージとその依存パッケージをリモートでプルまたは更新し、コンパイルとインストールを自動的に完了します。 「go get」コマンドはリモートコードパッケージを動的に取得することができますが、「go get」コマンドを使用する前に、リモートパッケージに適合するGit、SVN、HGなどのコード管理ツールと、パッケージ名をパラメータで指定する必要があります。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
go get コマンドは、コード管理ツールを利用してコード パッケージとその依存パッケージをリモートでプルまたは更新し、コンパイルとインストールを自動的に完了できます。プロセス全体はアプリをインストールするのと同じくらい簡単です。
このコマンドは、リモート コード パッケージを動的に取得できます。現在サポートされているのは、BitBucket、GitHub、Google Code、Launchpad です。 go get コマンドを使用する前に、Git、SVN、HG などのリモート パッケージに一致するコード管理ツールをインストールし、パラメーターにパッケージ名を指定する必要があります。
このコマンドは、実際には内部的に 2 つのステップに分かれています。最初のステップはソース コード パッケージをダウンロードすることであり、2 番目のステップは go install を実行することです。
go get コマンド - コードを取得し、ワンクリックでコンパイルしてインストールします。
hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging
コマンド go get
要求に応じて要求 そして、実際の状況では、指定されたコード パッケージとその依存パッケージをインターネットからダウンロードまたは更新し、コンパイルしてインストールします。上の例では、有名なコード ホスティング サイト Github からプロジェクト (またはコード パッケージ) をダウンロードし、環境変数 GOPATH に含まれる最初のワークスペースにインストールしました。同時に、このコード パッケージのインポート パスが github.com/hyper-キャロット/go_lib/logging であることもわかります。
通常、独自のコードとサードパーティのコードを分離するために、2 つ以上のワークスペースをセットアップします。これで、ディレクトリ パス /home/hc/golang/lib を持つワークスペースができました。これは、環境変数 GOPATH 値の最初のディレクトリ パスです。環境変数 GOPATH に含まれるパスは、環境変数 GOROOT の値と同じにすることはできないことに注意してください。 go get
コマンドを使用してコード パッケージをダウンロードしてインストールすると、これらのコード パッケージは上のワークスペースにインストールされます。このワークスペースを一時的に Lib ワークスペースと呼びましょう。 go get github.com/hyper-キャロット/go_lib/logging
を実行すると、以下に示すように、コード パッケージが Lib 作業の src ディレクトリに保存され、適切にインストールされているはずです。
/home/hc/golang/lib: bin/ pkg/ linux_386/ github.com/ hyper-carrot/ go_lib/ logging.a src/ github.com/ hyper-carrot/ go_lib/ logging/ ...
go get コマンドは、プロジェクト内のすべてのサブディレクトリとソース コード ファイルを最初のワークスペースの src ディレクトリに保存し、src ディレクトリの下のすべてのサブディレクトリを保存します。特定のコード パッケージのインポート パスの一部またはすべてです。つまり、サブコード パッケージとソース コード ファイルはプロジェクト ディレクトリに直接保存する必要があり、プロジェクト ディレクトリに直接保存されているソース コード ファイルによって宣言されるパッケージ名は、(コマンド ソースでない限り) プロジェクト名と同じである必要があります。コードファイル)。これを行うと、
go get コマンドを使用して Github サイトからプロジェクトをダウンロードした後、他の人が直接プロジェクトを使用できるようになります。
gb のようなツールを使用している場合は、別の問題になります。このようなプロジェクトのルート ディレクトリはワークスペースと見なす必要があります (ただし、GOPATH 環境変数に追加する必要はありません)。 go get コマンドを使用する代わりに、
git clone によって Go 言語ワークスペースの外のどこかにダウンロードする必要があります。
リモート インポート パスの分析
実際、go get コマンドによって実行されるアクションはコード パッケージ リモート インポートとも呼ばれ、渡されます。コード パッケージのインポート パスであるコマンドのパラメーターは、コード パッケージのリモート インポート パスとも呼ばれます。
go get コマンドは、Github などの有名なコード ホスティング サイトからコード パッケージをダウンロードできるだけでなく、任意のコード バージョン管理システム (英語のバージョン管理システム、「チェックアウト」と呼ばれます) からもコード パッケージをダウンロードできます。 VCS 用のコード パッケージ)。どのコード ホスティング サイトでも、1 つ以上のコード バージョン管理システムを通じてコードのアップロードおよびダウンロード サービスが提供されます。したがって、より厳密に言えば、
go get コマンドが行うことは、コード バージョン管理システムのリモート リポジトリからコード パッケージをチェックアウト/更新し、コンパイルしてインストールすることです。
表 0-2 go getコマンドでサポートされる VCS
メインコマンド | 説明 | |
---|---|---|
hg | Mercurial は、Python 言語で実装された軽量の分散バージョン管理システムで、学習と使用が簡単で、拡張性が高くなります。 | |
git | Git はもともと、Linux カーネル開発の管理を支援するために Linux Torvalds によって開発されたオープン ソースの分散バージョン管理ソフトウェアでした。しかし、今では広く使われています。あらゆる規模のプロジェクトの効率的かつ高速なバージョン管理に使用されます。 | |
svn | Subversion はバージョン管理システムであり、ブランチの概念と機能をバージョン管理モデルに組み込んだ最初のシステムです。ただし、Git や Mercurial と比較すると、これは従来のバージョン管理システムのメンバーにすぎません。 | |
bzr | Bazaar は、オープンソースの分散バージョン管理システムです。しかしそれに比べて、VCS として使用するプロジェクトは多くありません。 |
コマンドは、チェックする前に、コード パッケージのリモート インポート パスに対応するバージョン管理システムとリモート ウェアハウスの URL を知っている必要があります。コードパッケージを取り出します。 コード パッケージがローカル ワークスペースにすでに存在する場合、これらの情報はそのパスを分析することによって直接決定されます。
コマンドでサポートされているいくつかのバージョン管理システムには共通点が 1 つあります。つまり、メタデータ ディレクトリは、名前の先頭に "." とそのメイン ディレクトリが付けられて、チェックアウトされたプロジェクト ディレクトリに保存されるということです。コマンド名。たとえば、Git はチェックアウトされたプロジェクト ディレクトリに「.git」という名前のサブディレクトリを追加します。したがって、コード パッケージで使用されるバージョン管理システムを決定するのは簡単です。さらに、コード パッケージはすでに存在しているため、コード バージョン管理システムの更新コマンドを使用してコード パッケージを更新するだけでよく、そのリモート ウェアハウスの URL を知る必要はありません。ローカル ワークスペースに既に存在するコード パッケージの場合、コード パッケージが強制的に更新されない限り、go get
コマンドは繰り返しダウンロードを実行しません。コード パッケージを強制的に更新する場合は、go get
コマンドの実行時に -u
タグを追加します。このマークアップは後で紹介します。 コード パッケージがローカル ワークスペースに存在しない場合、関連情報はコード パッケージのリモート インポート パスを分析することによってのみ取得できます。まず、
コマンドは、コード パッケージのリモート インポート パスで静的分析を実行します。分析プロセスをより便利かつ高速にするために、go get
コマンド プログラムには、いくつかの有名なコード ホスティング Web サイトの情報がプリセットされています。次の表に示すように:
マスター ドメイン名 | サポートされる VCS | コード パッケージのリモート インポート パスの例 | |
---|---|---|---|
bitbucket.org | Git、Mercurial | bitbucket.org/user/project | bitbucket.org/user/project/sub/directory|
github.com | Git | github.com/user/project | github.com/user/project/sub/directory|
code.google.com | Git、Mercurial、Subversion | code.google.com/p/project | code.google.com/p/project/sub/directorycode.google.com/p/project.subrepository code.google.com/p/project.subrepository/sub/directory |
launchpad.net | バザール | launchpad.net/project | launchpad.net/project/serieslaunchpad .net/project/series/sub/directory launchpad.net/ user/project/branch launchpad.net/user/project/branch/sub/directory |
hub.jazz.net | Git | hub.jazz.net/git/user/project | hub.jazz .net/ git/user/project/sub/directory
标记名称 | 标记描述 |
---|---|
-d | 让命令程序只执行下载动作,而不执行安装动作。 |
-f | 仅在使用-u 标记时才有效。该标记会让命令程序忽略掉对已下载代码包的导入路径的检查。如果下载并安装的代码包所属的项目是你从别人那里Fork过来的,那么这样做就尤为重要了。 |
-fix | 让命令程序在下载代码包后先执行修正动作,而后再进行编译和安装。 |
-insecure | 允许命令程序使用非安全的scheme(如HTTP)去下载指定的代码包。如果你用的代码仓库(如公司内部的Gitlab)没有HTTPS支持,可以添加此标记。请在确定安全的情况下使用它。 |
-t | 让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。 |
-u | 让命令利用网络来更新已有代码包及其依赖包。默认情况下,该命令只会从网络上下载本地不存在的代码包,而不会更新已有的代码包。 |
为了更好的理解这几个特有标记,我们先清除Lib工作区的src目录和pkg目录中的所有子目录和文件。现在我们使用带有-d
标记的go get
命令来下载同样的代码包:
hc@ubt:~$ go get -d github.com/hyper-carrot/go_lib/logging
现在,让我们再来看一下Lib工作区的目录结构:
/home/hc/golang/lib: bin/ pkg/ src/ github.com/ hyper-carrot/ go_lib/ logging/ ...
我们可以看到,go get
命令只将代码包下载到了Lib工作区的src目录,而没有进行后续的编译和安装动作。这个加入-d
标记的结果。
再来看-fix
标记。我们知道,绝大多数计算机编程语言在进行升级和演进过程中,不可能保证100%的向后兼容(Backward Compatibility)。在计算机世界中,向后兼容是指在一个程序或者代码库在更新到较新的版本后,用旧的版本程序创建的软件和系统仍能被正常操作或使用,或在旧版本的代码库的基础上编写的程序仍能正常编译运行的能力。Go语言的开发者们已想到了这点,并提供了官方的代码升级工具——fix
。fix
工具可以修复因Go语言规范变更而造成的语法级别的错误。关于fix
工具,我们将放在本节的稍后位置予以说明。
假设我们本机安装的Go语言版本是1.5,但我们的程序需要用到一个很早之前用Go语言的0.9版本开发的代码包。那么我们在使用go get
命令的时候可以加入-fix
标记。这个标记的作用是在检出代码包之后,先对该代码包中不符合Go语言1.5版本的语言规范的语法进行修正,然后再下载它的依赖包,最后再对它们进行编译和安装。
标记-u
的意图和执行的动作都比较简单。我们在执行go get
命令时加入-u
标记就意味着,如果在本地工作区中已存在相关的代码包,那么就是用对应的代码版本控制系统的更新命令更新它,并进行编译和安装。这相当于强行更新指定的代码包及其依赖包。我们来看如下示例:
hc@ubt:~$ go get -v github.com/hyper-carrot/go_lib/logging
因为我们在之前已经检出并安装了这个代码包,所以我们执行上面这条命令后什么也没发生。还记得加入标记-v
标记意味着会打印出被构建的代码包的名字吗?现在我们使用标记-u
来强行更新代码包:
hc@ubt:~$ go get -v -u github.com/hyper-carrot/go_lib/logging github.com/hyper-carrot/go_lib (download)
其中,“(download)”后缀意味着命令从远程仓库检出或更新了该行显示的代码包。如果我们要查看附带-u
的go get
命令到底做了些什么,还可以加上一个-x
标记,以打印出用到的命令。读者可以自己试用一下它。
智能的下载
命令go get
还有一个很值得称道的功能。在使用它检出或更新代码包之后,它会寻找与本地已安装Go语言的版本号相对应的标签(tag)或分支(branch)。比如,本机安装Go语言的版本是1.x,那么go get
命令会在该代码包的远程仓库中寻找名为“go1”的标签或者分支。如果找到指定的标签或者分支,则将本地代码包的版本切换到此标签或者分支。如果没有找到指定的标签或者分支,则将本地代码包的版本切换到主干的最新版本。
前面我们说在执行go get
命令时也可以加入-x
标记,这样可以看到go get
命令执行过程中所使用的所有命令。不知道读者是否已经自己尝试了。下面我们还是以代码包github.com/hyper-carrot/go_lib
为例,并且通过之前示例中的命令的执行此代码包已经被检出到本地。这时我们再次更新这个代码包:
hc@ubt:~$ go get -v -u -x github.com/hyper-carrot/go_lib github.com/hyper-carrot/go_lib (download) cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git fetch cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git show-refcd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git checkout origin/masterWORK=/tmp/go-build034263530
在上述示例中,go get
命令通过git fetch
命令将所有远程分支更新到本地,而后有用git show-ref
命令列出本地和远程仓库中记录的代码包的所有分支和标签。最后,当确定没有名为“go1”的标签或者分支后,go get
命令使用git checkout origin/master
命令将代码包的版本切换到主干的最新版本。下面,我们在本地增加一个名为“go1”的标签,看看go get
命令的执行过程又会发生什么改变:
hc@ubt:~$ cd ~/golang/lib/src/github.com/hyper-carrot/go_lib hc@ubt:~/golang/lib/src/github.com/hyper-carrot/go_lib$ git tag go1 hc@ubt:~$ go get -v -u -x github.com/hyper-carrot/go_lib github.com/hyper-carrot/go_lib (download) cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git fetch cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git show-ref cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git show-ref tags/go1 origin/go1 cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib git checkout tags/go1 WORK=/tmp/go-build636338114
将这两个示例进行对比,我们会很容易发现它们之间的区别。第二个示例的命令执行过程中使用git show-ref
查看所有分支和标签,当发现有匹配的信息又通过git show-ref tags/go1 origin/go1
命令进行精确查找,在确认无误后将本地代码包的版本切换到标签“go1”之上。
コマンドgo get
この関数は非常に便利です。コードが、複数の Go 言語バージョン用に同時に開発されたコード パッケージに直接的または間接的に依存している場合、正しいバージョンを自動的にチェックアウトできます。 go get
コマンドには、コード パッケージのマルチバージョンの依存関係を管理するための機能が組み込まれているとも言えます。
ここでは、go get
コマンドの使い方を紹介します。 go get
コマンドは、前に紹介した 2 つのコマンドと同様、Go 言語プログラムを作成したり、Go 言語プロジェクトを構築したりするときに欠かせない補助ツールです。
【関連する推奨事項: Go ビデオ チュートリアル 、プログラミング教育 】
以上がgo get コマンドの用途は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。