"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 등 원격 패키지와 일치하는 코드 관리 도구를 설치하고 매개변수에 패키지 이름을 제공해야 합니다.
이 명령은 실제로 내부적으로 두 단계로 나뉩니다. 첫 번째 단계는 소스 코드 패키지를 다운로드하는 것이고, 두 번째 단계는 go install을 실행하는 것입니다.
go get 명령 - 한 번의 클릭으로 코드 가져오기, 컴파일 및 설치
hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging
명령 go get
은 요구 사항에 따라 인터넷에서 지정된 코드 패키지와 해당 콘텐츠를 다운로드하거나 업데이트할 수 있습니다. 실제 조건 종속성 패키지를 컴파일하고 설치합니다. 위의 예에서는 유명한 코드 호스팅 사이트 Github에서 프로젝트(또는 코드 패키지)를 다운로드하여 환경 변수 GOPATH에 포함된 첫 번째 작업 공간에 설치했습니다. 동시에 우리는 이 코드 패키지의 가져오기 경로가 github.com/hyper-carrot/go_lib/logging이라는 것도 알고 있습니다. 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
일반적으로 자체 코드와 타사 코드를 분리하기 위해 두 개 이상의 작업 공간을 설정합니다. 이제 디렉토리 경로가 /home/hc/golang/lib인 작업공간이 생겼으며 이는 환경 변수 GOPATH 값의 첫 번째 디렉토리 경로입니다. 환경 변수 GOPATH에 포함된 경로는 환경 변수 GOROOT의 값과 동일할 수 없습니다. 좋습니다. go get
명령을 사용하여 코드 패키지를 다운로드하고 설치하면 이러한 코드 패키지가 위 작업공간에 설치됩니다. 이 작업 공간을 임시로 Lib 작업 공간이라고 부르겠습니다. go get github.com/hyper-carrot/go_lib/logging
을 실행하면 아래와 같이 코드 패키지가 Lib 작업의 src 디렉터리에 저장되고 올바르게 설치되어야 합니다.
package analyzer // import "hypermind.cn/talon/analyzer"
go get
명령은 프로젝트 아래의 모든 하위 디렉터리와 소스 코드 파일을 첫 번째 작업 공간의 src 디렉터리에 저장하고, 모든 하위 디렉터리와 소스 파일은 src에 저장합니다. 디렉터리는 첫 번째 작업공간의 src 디렉터리에 저장됩니다. 이 디렉터리는 코드 패키지 가져오기 경로의 일부 또는 전체가 됩니다. 즉, 서브코드 패키지와 소스코드 파일을 프로젝트 디렉터리에 직접 저장해야 하며, 프로젝트 디렉터리에 직접 저장된 소스코드 파일에서 선언한 패키지 이름은 프로젝트 이름과 동일해야 합니다(명령 소스가 아닌 경우). 코드 파일). 이렇게 하면 다른 사람들이 go get
명령을 사용하여 Github 사이트에서 프로젝트를 다운로드한 후 바로 사용할 수 있습니다. 🎜🎜사실 goc2p 프로젝트처럼 프로젝트 루트 디렉터리의 경로를 작업공간 경로로 직접 사용하는 것은 권장하지 않습니다. 이렇게 하는 주된 이유는 독자들이 Go 언어의 프로젝트 구조와 작업공간 개념을 더 쉽게 이해할 수 있도록 하고, 또 다른 프로젝트 구조도 볼 수 있도록 하기 위함입니다. 물론 프로젝트에서 gb와 같은 도구를 사용하는 경우 이는 또 다른 문제입니다. 이러한 프로젝트의 루트 디렉터리는 작업 공간으로 간주되어야 합니다(그러나 GOPATH 환경 변수에 추가할 필요는 없습니다). go get
명령을 사용하는 대신 git clone
을 통해 Go 언어 작업공간 외부 어딘가에 다운로드해야 합니다. 🎜🎜🎜원격 가져오기 경로 분석🎜🎜🎜실제로 go get
명령으로 수행되는 작업을 코드 패키지 원격 가져오기라고도 하며, 코드 패키지 가져오기 경로로 명령에 전달되는 매개 변수는 다음과 같습니다. 이를 코드 패키지 원격 가져오기 경로라고 합니다. 🎜🎜 go get
명령은 Github와 같은 유명한 코드 호스팅 사이트뿐만 아니라 해당 명령이 지원하는 모든 코드 버전 제어 시스템(영어 버전 제어 시스템, VCS라고도 함)에서도 코드 패키지를 다운로드할 수 있습니다. .코드 패키지를 확인하세요. 모든 코드 호스팅 사이트는 하나 이상의 코드 버전 제어 시스템을 통해 코드 업로드 및 다운로드 서비스를 제공합니다. 따라서 보다 엄밀하게 말하면 go get
명령이 하는 일은 코드 버전 관리 시스템의 원격 저장소에서 코드 패키지를 체크아웃/업데이트하고 컴파일하고 설치하는 것입니다. 🎜🎜이 명령에서 지원하는 VCS 정보는 다음과 같습니다. 🎜🎜표 0-2 go get
명령에서 지원하는 VCS🎜🎜Name | Main command | Description |
---|---|---|
Mercurial | hg | Mercurial은 Python 언어로 구현된 경량 분산 버전 제어 시스템으로, 배우고 사용하기 쉽고 확장성이 뛰어납니다. |
Git | git | Git은 원래 Linux 커널 개발 관리를 돕기 위해 Linux Torvalds에서 개발한 오픈 소스 분산 버전 제어 소프트웨어였습니다. 그러나 이제는 널리 사용됩니다. 모든 규모의 프로젝트에 대한 효과적인 고속 버전 관리에 사용됩니다. |
Subversion | svn | Subversion은 버전 제어 시스템이며 브랜치의 개념과 기능을 버전 제어 모델에 통합한 최초의 시스템입니다. 그러나 Git 및 Mercurial과 비교하면 이는 전통적인 버전 제어 시스템의 구성원일 뿐입니다. |
Bazaar | bzr | Bazaar는 오픈 소스 분산 버전 관리 시스템입니다. 하지만 이에 비해 VCS로 활용하는 프로젝트는 많지 않습니다. |
go get
명령은 코드 패키지를 체크아웃하기 전에 버전 관리 시스템과 코드 패키지의 원격 가져오기 경로에 해당하는 원격 웨어하우스의 URL을 알아야 합니다. go get
命令在检出代码包之前必须要知道代码包远程导入路径所对应的版本控制系统和远程仓库的URL。
如果该代码包在本地工作区中已经存在,则会直接通过分析其路径来确定这几项信息。go get
命令支持的几个版本控制系统都有一个共同点,那就是会在检出的项目目录中存放一个元数据目录,名称为“.”前缀加其主命令名。例如,Git会在检出的项目目录中加入一个名为“.git”的子目录。所以,这样就很容易判定代码包所用的版本控制系统。另外,又由于代码包已经存在,我们只需通过代码版本控制系统的更新命令来更新代码包,因此也就不需要知道其远程仓库的URL了。对于已存在于本地工作区的代码包,除非要求强行更新代码包,否则go get
命令不会进行重复下载。如果想要强行更新代码包,可以在执行go get
命令时加入-u
标记。这一标记会稍后介绍。
如果本地工作区中不存在该代码包,那么就只能通过对代码包远程导入路径进行分析来获取相关信息了。首先,go get
命令会对代码包远程导入路径进行静态分析。为了使分析过程更加方便快捷,go get
go get
명령이 지원하는 여러 버전 제어 시스템에는 한 가지 공통점이 있습니다. 즉, 메타데이터 디렉터리는 이름 앞에 "."가 붙은 상태로 체크아웃된 프로젝트 디렉터리에 저장된다는 것입니다. 주 명령 이름 . 예를 들어 Git은 체크아웃된 프로젝트 디렉터리에 ".git"이라는 하위 디렉터리를 추가합니다. 따라서 코드 패키지에서 사용하는 버전 제어 시스템을 쉽게 결정할 수 있습니다. 게다가 코드 패키지가 이미 존재하기 때문에 코드 버전 관리 시스템의 업데이트 명령을 통해서만 코드 패키지를 업데이트하면 되므로 해당 원격 웨어하우스의 URL을 알 필요가 없습니다. 로컬 작업공간에 이미 존재하는 코드 패키지의 경우, 코드 패키지가 강제로 업데이트되지 않는 한 go get
명령은 해당 패키지를 반복적으로 다운로드하지 않습니다. 코드 패키지를 강제로 업데이트하려면 go get
명령 실행 시 -u
태그를 추가하면 됩니다. 이 마크업은 나중에 소개하겠습니다. 코드 패키지가 로컬 작업 공간에 존재하지 않는 경우 코드 패키지의 원격 가져오기 경로를 분석해야만 관련 정보를 얻을 수 있습니다. 먼저 go get
명령은 코드 패키지의 원격 가져오기 경로에 대한 정적 분석을 수행합니다. 분석 과정을 보다 편리하고 빠르게 만들기 위해 go get
명령 프로그램은 여러 유명 코드 호스팅 웹사이트의 정보를 미리 설정해 두었습니다. 아래 표:
Git, Mercurial | bitbucket.org/user/project | bitbucket.org/user/project/sub/의 코드 보관 정보 디렉토리GitHub | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
github.com/user /project | github.com/user/project/sub/directory | Google 코드 프로젝트 호스팅 | 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/ 디렉토리 一般情况下,代码包远程导入路径中的第一个元素就是代码托管网站的主域名。在静态分析的时候, 如果对代码包远程导入路径的静态分析或/和动态分析成功并获取到对应的版本控制系统和远程仓库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 로그인 후 복사 将这两个示例进行对比,我们会很容易发现它们之间的区别。第二个示例的命令执行过程中使用
到这里,我向大家介绍了 go get 명령 사용법을 소개합니다. go get 명령은 앞서 소개한 두 명령과 마찬가지로 Go 언어 프로그램을 작성하고 Go 언어 프로젝트를 빌드할 때 없어서는 안 될 보조 도구입니다. 】🎜위 내용은 go get 명령의 용도는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요! 본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
최신 이슈
자식 창이 부모 창을 작동하지만 출력이 응답하지 않습니다.
처음 두 문장은 실행 가능하지만 마지막 문장은 구현할 수 없습니다.
에서 2024-04-19 15:37:47
0
1
1624
상위 창에 출력이 없습니다.
document.onclick = function(){ window.opener.document.write('나는 자식 창의 출력입니다.');
에서 2024-04-18 23:52:34
0
1
1532
관련 주제
더>
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
|