
# 通过客户端上传/下载Go组件
CodeArts Artifact支持与本地Go客户端对接，用户A可以通过客户端的方式将本地Go客户端中的私有组件上传至CodeArts Artifact私有依赖库，其他用户再通过客户端的方式从CodeArts Artifact私有依赖库下载用户A上传的Go组件，实现Go组件的共享或传递。
#### Go组件介绍
Go（Golang）组件指的是通过Go语言开发并发布的软件包或应用程序。这些制品可以是库（库包）、可执行文件（二进制文件）。
#### 约束与限制
不同用户账号的私有依赖库仓库密码不同，当用户以不同账号访问私有依赖库时，如果需要使用仓库密码，则需要在各仓库"操作指导"中重新下载配置文件获取仓库密码。
#### 前提条件
- 使用客户端工具为go，请确保已安装golang1.13及以上版本，且工程为go module工程。
- 已[创建Go仓库](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_01_0008.html)。
- 需要具备当前仓库的"下载/查看"权限，如需获取"下载/查看"的权限，请参考[配置私有依赖库权限](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_01_0047.html)配置。
 
#### 通过客户端上传Go组件
- Go Modules打包方式简介及包上传。 本文采用Go Modules打包方式完成Go组件的构建与上传。以下步骤中用到的username和password可以通过Go仓库的"操作指导"下载的配置文件中获取。
  打包命令主要包括以下几部分：
  1. 在工作目录中创建源文件夹。
     ```
     mkdir -p {module}@{version}
     ```
     
  
  2. 将代码源拷贝至源文件夹下。
     ```
     cp -rf . {module}@{version}
     ```
     
  
  3. 压缩组件zip包。
     ```
     zip -D -r [包名] [包根目录名称]
     ```
     
  
  4. 上传组件zip包与"go.mod"文件到私有依赖库中。
     ```
     curl -k -u {{username}}:{{password}} -X PUT {{repoUrl}}/{filePath} -T {{localFile}}
     ```
     根据打包的版本不同，组件目录结构有以下几种情况：
     - v2.0以下版本：目录结构与"go.mod"文件路径相同，无需附加特殊目录结构。
     
     - v2.0以上（包括v2.0）版本：
       - "go.mod"文件中第一行以"/vX"结尾：目录结构需要包含"/vX"。例如，版本为v2.0.1，目录需要增加"v2"。
       
       - "go.mod"文件中第一行不以"/vN"结尾：目录结构不变，上传文件名需要增加"+incompatible"。
       
       
       下面分别对不同的版本举例说明。
       
      
  
  
  **v2.0以下版本打包**。
  以下图所示"go.mod"文件为例。
  ![](https://support.huaweicloud.com/usermanual-cloudartifact/zh-cn_image_0000002513699508.png)
  1. 在工作目录中创建源文件夹。 命令行中，参数"module"的值为"example.com/demo"，参数"version"自定义为1.0.0。因此命令如下：
     ```
     mkdir -p ~/example.com/demo@v1.0.0
     ```
     
  
  2. 将代码源拷贝至源文件夹下。 参数值与上一步一致，命令行如下：
     ```
     cp -rf . ~/example.com/demo@v1.0.0/
     ```
     
  
  3. 压缩组件zip包。 首先，使用以下命令，进入组件zip包所在根目录的上层目录。
     ```
     cd ~
     ```
     然后，使用zip命令将代码压缩成组件包。命令行中，"包根目录名称"为"example.com""包名"自定义为"v1.0.0.zip"，因此命令如下：
     ```
     zip -D -r v1.0.0.zip  example.com/
     ```
     
  
  4. 上传组件zip包与"go.mod"文件到私有依赖库中。 命令行中，参数"username"、"password"、"repoUrl"均可通过私有依赖库配置文件获取。
     - 对于zip包，参数"filePath"为"example.com/demo/@v/v1.0.0.zip"，"localFile"为"v1.0.0.zip"。
     
     - 对于"go.mod"文件，参数"filePath"为"example.com/demo/@v/v1.0.0.mod"，"localFile"为"example.com/demo@v1.0.0/go.mod"。
     
     
     因此命令如下（参数username、password、repoUrl请参照私有依赖库配置文件自行修改）：
     ```
     curl -k -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/@v/v1.0.0.zip -T v1.0.0.zip
     curl -k -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/@v/v1.0.0.mod -T example.com/demo@v1.0.0/go.mod
     ```
     
     
   
- **v2.0** **以上版本打包，且** **"go.mod"** **文件中第一行以** **"/vX"** **结尾** 。
  以下图所示"go.mod"文件为例。
  ![](https://support.huaweicloud.com/usermanual-cloudartifact/zh-cn_image_0000002545299387.png)
  1. 在工作目录中创建源文件夹。 命令行中，参数"module"的值为"example.com/demo/v2"，参数"version"自定义为"2.0.0"。因此命令如下：
     ```
     mkdir -p ~/example.com/demo/v2@v2.0.0
     ```
     
  
  2. 将代码源拷贝至源文件夹下。
     参数值与上一步一致，命令行如下：
     ```
     cp -rf . ~/example.com/demo/v2@v2.0.0/
     ```
     
  
  3. 压缩组件zip包。 首先，使用以下命令，进入组件zip包所在根目录的上层目录。
     ```
     cd ~
     ```
     然后，使用zip命令将代码压缩成组件包。命令行中，"包根目录名称"为"example.com""包名"自定义为"v2.0.0.zip"，因此命令如下：
     ```
     zip -D -r v2.0.0.zip  example.com/
     ```
     
  
  4. 上传组件zip包与"go.mod"文件到私有依赖库中。 命令行中，参数"username"、"password"、"repoUrl"均可通过私有依赖库配置文件获取。
     - 对于zip包，参数"filePath"为"example.com/demo/v2/@v/v2.0.0.zip"，"localFile"为"v2.0.0.zip"。
     
     - 对于"go.mod"文件，参数"filePath"为"example.com/demo/v2/@v/v2.0.0.mod"，"localFile"为"example.com/demo/v2@v2.0.0/go.mod"。
     
     
     因此命令如下（参数username、password、repoUrl请参照私有依赖库配置文件自行修改）：
     ```
     curl -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/v2/@v/v2.0.0.zip -T v2.0.0.zip
     curl -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/v2/@v/v2.0.0.mod -T example.com/demo/v2@v2.0.0/go.mod
     ```
     
   
- **v2.0以上版本打包，且"go.mod"文件中第一行不以"/vX"结尾** 。
  以下图所示"go.mod"文件为例。
  ![](https://support.huaweicloud.com/usermanual-cloudartifact/zh-cn_image_0000002545219395.png)
  1. 在工作目录中创建源文件夹。 命令行中，参数"module"的值为"example.com/demo"，参数"version"自定义为"3.0.0"。因此命令如下：
     ```
     mkdir -p ~/example.com/demo@v3.0.0+incompatible
     ```
     
  
  2. 将代码源拷贝至源文件夹下。 参数值与上一步一致，命令行如下：
     ```
     cp -rf . ~/example.com/demo@v3.0.0+incompatible/
     ```
     
  
  3. 压缩组件zip包。 ~首先，使用以下命令，进入组件zip包所在根目录的上层目录。~
     ```
     cd ~
     ```
     然后，使用zip命令将代码压缩成组件包。命令行中，"包根目录名称"为"example.com""包名"自定义为"v3.0.0.zip"，因此命令如下：
     ```
     zip -D -r v3.0.0.zip  example.com/
     ```
     
  
  4. 上传组件zip包与"go.mod"文件到私有依赖库中。 命令行中，参数"username"、"password"、"repoUrl"均可通过私有依赖库配置文件获取。
     - 对于zip包，参数"filePath"为"example.com/demo/@v/v3.0.0+incompatible.zip"，"localFile"为"v3.0.0.zip"。
     
     - 对于"go.mod"文件，参数"filePath"为"example.com/demo/@v/v3.0.0+incompatible.mod"，"localFile"为"example.com/demo@v3.0.0+incompatible/go.mod"。
     
     
     因此命令如下（参数username、password、repoUrl请参照私有依赖库配置文件自行修改）：
     ```
     curl -k -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/@v/v3.0.0+incompatible.zip -T v3.0.0.zip
     curl -k -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/@v/v3.0.0+incompatible.mod -T example.com/demo@v3.0.0+incompatible/go.mod
     ```
     
   
 
#### 通过客户端下载Go组件
go客户端无法忽略证书校验，需要先把私有依赖库对应的域名证书添加到本地证书信任列表里，执行以下步骤添加信任证书列表。
1. 导出证书。 
   ```
   openssl s_client -connect {host}:443 -showcerts </dev/null 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |openssl x509 -outform PEM >mycertfile.pem
   openssl x509 -outform der -in mycertfile.pem -out mycertfile.crt
   ```
   mycertfile.pem和mycertfile.crt即为下载的证书。
   
   
2. 将证书加入到根证书信任列表中。
3. 执行go命令下载依赖包： 
   ```
   ##1.v2.0以下版本包
   go get -v <moudlename>
   ##2.v2.0以上(包含2.0)版本包
   ##a.zip包里有go.mod且路径以/vN结尾的
   go get -v {{moduleName}}/vN@{{version}}
   ##b.zip包里不含go.mod或go.mod 第一行里不以/vN结尾的
   go get -v {moduleName}}@{{version}}+incompatible
   ```
   
   
 
