Heim > Artikel > Backend-Entwicklung > Was nützt der Befehl go get?
Der Befehl „go get“ kann mithilfe von Codeverwaltungstools Codepakete und ihre abhängigen Pakete aus der Ferne abrufen oder aktualisieren und die Kompilierung und Installation automatisch abschließen. Der Befehl „go get“ kann das Remote-Codepaket dynamisch abrufen. Bevor Sie den Befehl „go get“ verwenden, müssen Sie ein Codeverwaltungstool installieren, das dem Remote-Paket entspricht, z. B. Git, SVN, HG usw Der Paketname muss im Parameter angegeben werden.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Der Befehl go get kann mithilfe von Codeverwaltungstools Codepakete und ihre abhängigen Pakete aus der Ferne abrufen oder aktualisieren und die Kompilierung und Installation automatisch abschließen. Der gesamte Vorgang ist so einfach wie die Installation einer App.
Dieser Befehl kann Remote-Codepakete dynamisch abrufen. Derzeit werden BitBucket, GitHub, Google Code und Launchpad unterstützt. Bevor Sie den Befehl go get verwenden, müssen Sie ein Codeverwaltungstool installieren, das dem Remote-Paket entspricht, z. B. Git, SVN, HG usw., und im Parameter einen Paketnamen angeben.
Dieser Befehl ist intern tatsächlich in zwei Schritte unterteilt: Der erste Schritt besteht darin, das Quellcodepaket herunterzuladen, und der zweite Schritt besteht darin, go install auszuführen.
go get command – Code abrufen, kompilieren und installieren mit einem Klick
hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging
Command go get
kann das angegebene Codepaket und seinen Inhalt je nach Bedarf aus dem Internet herunterladen oder aktualisieren Ist-Bedingungen Abhängigkeitspakete, kompilieren und installieren Sie sie. Im obigen Beispiel haben wir ein Projekt (oder Codepaket) von der bekannten Code-Hosting-Site Github heruntergeladen und es im ersten Arbeitsbereich installiert, der in der Umgebungsvariablen GOPATH enthalten ist. Gleichzeitig wissen wir auch, dass der Importpfad dieses Codepakets github.com/hyper-carrot/go_lib/logging ist. go get
可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。在上面这个示例中,我们从著名的代码托管站点Github上下载了一个项目(或称代码包),并安装到了环境变量GOPATH中包含的第一个工作区中。与此同时,我们也知道了这个代码包的导入路径就是github.com/hyper-carrot/go_lib/logging。
一般情况下,为了分离自己与第三方的代码,我们会设置两个或更多的工作区。我们现在有一个目录路径为/home/hc/golang/lib的工作区,并且它是环境变量GOPATH值中的第一个目录路径。注意,环境变量GOPATH中包含的路径不能与环境变量GOROOT的值重复。好了,如果我们使用go get
命令下载和安装代码包,那么这些代码包都会被安装在上面这个工作区中。我们暂且把这个工作区叫做Lib工作区。在我们运行go get github.com/hyper-carrot/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/ ...
另一方面,如果我们想把一个项目上传到Github网站(或其他代码托管网站)上并被其他人使用的话,那么我们就应该把这个项目当做一个代码包来看待。其实我们在之前已经提到过原因,go get
命令会将项目下的所有子目录和源码文件存放到第一个工作区的src目录下,而src目录下的所有子目录都会是某个代码包导入路径的一部分或者全部。也就是说,我们应该直接在项目目录下存放子代码包和源码文件,并且直接存放在项目目录下的源码文件所声明的包名应该与该项目名相同(除非它是命令源码文件)。这样做可以让其他人使用go get
命令从Github站点上下载你的项目之后直接就能使用它。
实际上,像goc2p项目这样直接以项目根目录的路径作为工作区路径的做法是不被推荐的。之所以这样做主要是想让读者更容易的理解Go语言的工程结构和工作区概念,也可以让读者看到另一种项目结构。当然,如果你的项目使用了gb这样的工具那就是另外一回事了。这样的项目的根目录就应该被视为一个工作区(但是你不必把它加入到GOPATH环境变量中)。它应该由git clone
下载到Go语言工作区之外的某处,而不是使用go get
命令。
远程导入路径分析
实际上,go get
命令所做的动作也被叫做代码包远程导入,而传递给该命令的作为代码包导入路径的那个参数又被叫做代码包远程导入路径。
go get
命令不仅可以从像Github这样著名的代码托管站点上下载代码包,还可以从任何命令支持的代码版本控制系统(英文为Version Control System,简称为VCS)检出代码包。任何代码托管站点都是通过某个或某些代码版本控制系统来提供代码上传下载服务的。所以,更严格地讲,go get
命令所做的是从代码版本控制系统的远程仓库中检出/更新代码包并对其进行编译和安装。
该命令所支持的VCS的信息如下表:
表0-2 go get
Um unseren eigenen Code vom Code Dritter zu trennen, richten wir im Allgemeinen zwei oder mehr Arbeitsbereiche ein. Wir haben jetzt einen Arbeitsbereich mit dem Verzeichnispfad /home/hc/golang/lib, und es ist der erste Verzeichnispfad im Wert der Umgebungsvariablen GOPATH. Beachten Sie, dass der in der Umgebungsvariablen GOPATH enthaltene Pfad nicht mit dem Wert der Umgebungsvariablen GOROOT identisch sein darf. Wenn wir den Befehl go get
verwenden, um Codepakete herunterzuladen und zu installieren, werden diese Codepakete im Arbeitsbereich oben installiert. Nennen wir diesen Arbeitsbereich vorübergehend den Lib-Arbeitsbereich. Nachdem wir go get github.com/hyper-carrot/go_lib/logging
ausgeführt haben, sollte das Codepaket im src-Verzeichnis der Lib-Arbeit gespeichert und ordnungsgemäß installiert sein, wie unten gezeigt:
package analyzer // import "hypermind.cn/talon/analyzer"🎜Wenn wir andererseits ein Projekt auf die Github-Website (oder eine andere Code-Hosting-Website) hochladen und von anderen verwendet werden möchten, sollten wir das Projekt als Codepaket behandeln. Tatsächlich haben wir den Grund bereits erwähnt. Der Befehl
go get
speichert alle Unterverzeichnisse und Quellcodedateien unter dem Projekt im src-Verzeichnis des ersten Arbeitsbereichs und alle Unterverzeichnisse und Quelldateien im src Das Verzeichnis wird im src-Verzeichnis des ersten Arbeitsbereichs gespeichert. Das Verzeichnis ist ein Teil oder der gesamte Importpfad eines Codepakets. Mit anderen Worten, wir sollten Subcode-Pakete und Quellcodedateien direkt im Projektverzeichnis speichern, und der Paketname, der von der direkt im Projektverzeichnis gespeicherten Quellcodedatei deklariert wird, sollte mit dem Projektnamen identisch sein (es sei denn, es handelt sich um eine Befehlsquelle). Codedatei). Auf diese Weise können andere Ihr Projekt direkt verwenden, nachdem sie es mit dem Befehl go get
von Github heruntergeladen haben. 🎜🎜Tatsächlich wird nicht empfohlen, den Pfad des Projektstammverzeichnisses wie beim goc2p-Projekt direkt als Arbeitsbereichspfad zu verwenden. Der Hauptgrund dafür besteht darin, den Lesern das Verständnis der Projektstruktur und der Arbeitsbereichskonzepte der Go-Sprache zu erleichtern und den Lesern auch die Möglichkeit zu geben, eine andere Projektstruktur zu sehen. Wenn Ihr Projekt natürlich Tools wie gb verwendet, ist das eine andere Sache. Das Stammverzeichnis eines solchen Projekts sollte als Arbeitsbereich betrachtet werden (Sie müssen es jedoch nicht zur Umgebungsvariablen GOPATH hinzufügen). Es sollte irgendwo außerhalb des Go-Spracharbeitsbereichs mit git clone
heruntergeladen werden, anstatt den Befehl go get
zu verwenden. 🎜🎜🎜Remote-Importpfadanalyse🎜🎜🎜Tatsächlich wird die vom Befehl go get
ausgeführte Aktion auch als Codepaket-Remoteimport bezeichnet, und der an den Befehl übergebene Parameter lautet als Codepaket-Importpfad Dies wird als Codepaket-Remote-Importpfad bezeichnet. 🎜🎜Der Befehl go get
kann nicht nur Codepakete von bekannten Code-Hosting-Sites wie Github herunterladen, sondern auch von jedem Code-Versionskontrollsystem (englisches Versionskontrollsystem, als VCS bezeichnet), das vom Befehl unterstützt wird . Schauen Sie sich das Codepaket an. Jede Code-Hosting-Site bietet Code-Upload- und Download-Dienste über ein oder mehrere Code-Versionskontrollsysteme. Genauer gesagt checkt der Befehl go get
das Codepaket aus dem Remote-Repository des Codeversionskontrollsystems aus/aktualisiert es und kompiliert und installiert es. 🎜🎜Die von diesem Befehl unterstützten VCS-Informationen lauten wie folgt: 🎜🎜Tabelle 0-2 VCS unterstützt vom Befehl go get
🎜🎜Name | Hauptbefehl | Beschreibung |
---|---|---|
Mercurial | hg | Mercurial ist ein leichtes verteiltes Versionskontrollsystem, das in der Python-Sprache implementiert, einfach zu erlernen und zu verwenden und hoch skalierbar ist. |
Git | git | Git war ursprünglich eine verteilte Open-Source-Versionskontrollsoftware, die von Linux Torvalds entwickelt wurde, um die Verwaltung der Linux-Kernel-Entwicklung zu unterstützen. Aber mittlerweile ist es weit verbreitet. Es dient der effektiven und schnellen Versionsverwaltung von Projekten jeder Größe. |
Subversion | svn | Subversion ist ein Versionskontrollsystem und das erste System, das das Konzept und die Funktionalität von Zweigen in das Versionskontrollmodell integriert. Aber im Vergleich zu Git und Mercurial ist es nur ein Mitglied des traditionellen Versionskontrollsystems. |
Bazaar | bzr | Bazaar ist ein verteiltes Open-Source-Versionskontrollsystem. Aber im Vergleich dazu gibt es nicht viele Projekte, die es als VCS verwenden. |
Der Befehl go get
muss das Versionskontrollsystem und die URL des Remote-Warehouses kennen, die dem Remote-Importpfad des Codepakets entspricht, bevor er das Codepaket auscheckt. go get
命令在检出代码包之前必须要知道代码包远程导入路径所对应的版本控制系统和远程仓库的URL。
如果该代码包在本地工作区中已经存在,则会直接通过分析其路径来确定这几项信息。go get
命令支持的几个版本控制系统都有一个共同点,那就是会在检出的项目目录中存放一个元数据目录,名称为“.”前缀加其主命令名。例如,Git会在检出的项目目录中加入一个名为“.git”的子目录。所以,这样就很容易判定代码包所用的版本控制系统。另外,又由于代码包已经存在,我们只需通过代码版本控制系统的更新命令来更新代码包,因此也就不需要知道其远程仓库的URL了。对于已存在于本地工作区的代码包,除非要求强行更新代码包,否则go get
命令不会进行重复下载。如果想要强行更新代码包,可以在执行go get
命令时加入-u
标记。这一标记会稍后介绍。
如果本地工作区中不存在该代码包,那么就只能通过对代码包远程导入路径进行分析来获取相关信息了。首先,go get
命令会对代码包远程导入路径进行静态分析。为了使分析过程更加方便快捷,go get
go get
unterstützte Versionskontrollsysteme haben eines gemeinsam: Im ausgecheckten Projektverzeichnis wird ein Metadatenverzeichnis mit einem Namen mit dem Präfix „.“ gespeichert Hauptbefehlsname. Beispielsweise fügt Git dem ausgecheckten Projektverzeichnis ein Unterverzeichnis mit dem Namen „.git“ hinzu. Daher ist es einfach, das vom Codepaket verwendete Versionskontrollsystem zu bestimmen. Da das Codepaket bereits vorhanden ist, müssen wir das Codepaket außerdem nur über den Aktualisierungsbefehl des Codeversionskontrollsystems aktualisieren, sodass wir die URL seines Remote-Warehouses nicht kennen müssen. Bei Codepaketen, die bereits im lokalen Arbeitsbereich vorhanden sind, lädt der Befehl go get
sie nicht wiederholt herunter, es sei denn, es ist erforderlich, das Codepaket zwangsweise zu aktualisieren. Wenn Sie das Codepaket zwangsweise aktualisieren möchten, können Sie das Tag -u
hinzufügen, wenn Sie den Befehl go get
ausführen. Dieses Markup wird später eingeführt. Wenn das Codepaket nicht im lokalen Arbeitsbereich vorhanden ist, können die relevanten Informationen nur durch Analyse des Remote-Importpfads des Codepakets abgerufen werden. Zunächst führt der Befehl go get
eine statische Analyse des Remote-Importpfads des Codepakets durch. Um den Analyseprozess bequemer und schneller zu gestalten, hat das Befehlsprogramm go get
die Informationen mehrerer bekannter Code-Hosting-Websites voreingestellt. Tabelle unten:
Git, Mercurial | bitbucket.org/user/project | bitbucket.org/user/project/sub/ VerzeichnisGitHub | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
github.com/user /project | github.com/user/project/sub/directory | Google Code Project Hosting | code.google.com |||||||||||||||
code.google.com/p/project | code.google.com/p/project/sub/directory | code.google.com/p/project.subrepositorycode.google.com /p/project.subrepository/sub/directory | |||||||||||||||
Bazaar | launchpad.net/project | launchpad.net/project/series | launchpad.net/project/series/sub/directorylaunchpad.net/ user/project/branch launchpad.net/ user/project/ branch/sub/directory |
||||||||||||||
IBM DevOps Services | hub.jazz.net | Git | hub.jazz.net /git/user/project hub.jazz.net/git/user/project/sub/ Verzeichnis 一般情况下,代码包远程导入路径中的第一个元素就是代码托管网站的主域名。在静态分析的时候, 如果对代码包远程导入路径的静态分析或/和动态分析成功并获取到对应的版本控制系统和远程仓库URL,那么 自定义代码包远程导入路径 如果你想把你编写的(被托管在不同的代码托管网站上的)代码包的远程导入路径统一起来,或者不希望让你的代码包中夹杂某个代码托管网站的域名,那么你可以选择自定义你的代码包远程导入路径。这种自定义的实现手段叫做“导入注释”。导入注释的写法示例如下: package analyzer // import "hypermind.cn/talon/analyzer" 代码包 导入注释的写法如同一条代码包导入语句。不同的是,它出现在了单行注释符 github.com/hyper-carrot/talon/analyzer // 标准的导入路径 hypermind.cn /talon/analyzer // 导入注释中的导入路径 你想用你自己的域名替换掉标准导入路径中的哪部分由你自己说了算。不过一般情况下,被替换的部分包括代码托管网站的域名以及你在那里的用户ID就可以了。这足以达到我们最开始说的那两个目的。 虽然我们在talon项目中的所有代码包中都加入了类似的导入注释,但是我们依然无法通过
<meta name="go-import" content="import-prefix vcs repo-root"> 实际上, 好了,在我们做好上述处理程序之后, 注意,具体的代码包源码存放路径会是/home/hc/golang/lib/src/hypermind.cn/talon/analyzer。也就是说,存放路径(包括代码包源码文件以及相应的归档文件的存放路径)会遵循导入注释中的路径(这里是 hc@ubt:~$ go get github.com/hyper-carrot/talon/analyzer package github.com/hyper-carrot/talon/analyzer: code in directory /home/hc/golang/lib/src/github.com/hyper-carrot/talon/analyzer expects import "hypermind.cn/talon/analyzer" 与自定义的代码包远程导入路径有关的内容我们就介绍到这里。从中我们也可以看出,Go语言为了让使用者的项目与代码托管网站隔离所作出的努力。只要你有自己的网站和一个不错的域名,这就很容易搞定并且非常值得。这会在你的代码包的使用者面前强化你的品牌,而不是某个代码托管网站的。当然,使你的代码包导入路径整齐划一是最直接的好处。 OK,言归正传,我下面继续关注 命令特有标记
表0-4
为了更好的理解这几个特有标记,我们先清除Lib工作区的src目录和pkg目录中的所有子目录和文件。现在我们使用带有 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语言版本是1.5,但我们的程序需要用到一个很早之前用Go语言的0.9版本开发的代码包。那么我们在使用 标记 hc@ubt:~$ go get -v github.com/hyper-carrot/go_lib/logging 因为我们在之前已经检出并安装了这个代码包,所以我们执行上面这条命令后什么也没发生。还记得加入标记 hc@ubt:~$ go get -v -u github.com/hyper-carrot/go_lib/logging github.com/hyper-carrot/go_lib (download) 其中,“(download)”后缀意味着命令从远程仓库检出或更新了该行显示的代码包。如果我们要查看附带 智能的下载 命令 前面我们说在执行 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 在上述示例中, 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 将这两个示例进行对比,我们会很容易发现它们之间的区别。第二个示例的命令执行过程中使用 Diese Funktion des Befehls 到这里,我向大家介绍了 go get verwenden. Der Befehl go get ist wie die beiden zuvor vorgestellten Befehle ein unverzichtbares Hilfswerkzeug, wenn wir Go-Sprachprogramme schreiben und Go-Sprachprojekte erstellen. 【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht 】🎜 |
Das obige ist der detaillierte Inhalt vonWas nützt der Befehl go get?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!