
# 通过编译构建任务发布/获取Go私有组件
在企业级软件开发中，开发团队经常需要使用私有组件来构建和部署应用，以确保代码的安全性和专有性。然而，在实际操作中，开发人员可能会遇到从私有依赖库获取依赖包时的困难，导致编译构建任务失败。本文档将介绍如何通过编译构建任务发布私有组件到Go私有依赖库，以及如何从Go私有依赖库获取依赖包完成编译构建任务，解决开发人员在使用私有组件时遇到的问题。
#### 费用说明
该功能需要使用代码托管（CodeArts Repo）服务与编译构建（CodeArts Build）服务，需要[开通/购买华为云码道服务组合套餐](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0002.html)。
#### 前提条件
- 已有可用项目。如果没有项目，请先[新建CodeArts项目](https://support.huaweicloud.com/usermanual-devcloud/codearts_01_0027.html)，例如项目名称为project_go。

- 已[创建GO格式私有依赖库](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_01_0008.html)。
- 已添加当前账号对当前私有库的"上传"、"下载/查看"私有库组件权限，具体操作请参考[配置私有依赖库权限](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_01_0047.html)。
 
 #### 发布私有组件到Go私有依赖库
1. 下载私有依赖库配置文件。 
   1. 使用华为云账号[访问CodeArts Artifact的私有依赖库](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_01_0007.html#section0)。
   
   2. 选择已创建好的Go私有依赖库。单击页面右侧"操作指导"。
   
   3. 在弹框中单击"下载配置文件"。 ![](https://support.huaweicloud.com/bestpractice-cloudartifact/zh-cn_image_0000002510836214.png "点击放大")
      
      
   
   
   
   
2. 配置代码仓库。 
   1. 进入代码托管服务。创建Go语言代码仓库（操作步骤请参考[新建代码仓库](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0013.html)）。本文中使用仓库模板"Go Web Demo"创建代码仓库。
   
   2. 准备"go.mod"文件，并[上传至代码仓库](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0064.html)的根目录中。本文中使用的"go.mod"文件如下所示：
      ![](https://support.huaweicloud.com/bestpractice-cloudartifact/zh-cn_image_0000002480237192.png)
      
   
   
   
   
3. 配置并执行编译构建任务。 
   1. 在代码仓库中，单击页面右上角"设置构建"，页面跳转至"新建编译构建任务"页面。 在页面中选择"空白构建模板"，单击"下一步"。
      
   
   2. 添加步骤"Go语言构建"。 ![](https://support.huaweicloud.com/bestpractice-cloudartifact/zh-cn_image_0000002512397079.png "点击放大")
      
   
   3. 编辑步骤"Go语言构建"。
      1. 工具版本按照实际选择，本文中选择"go-1.13.1"。
      
      2. 在步骤"Go语言构建"的末尾添加命令：
         ```
         cd $GOPATH/src/
         zip -D -r v1.0.0.zip  example.com/
         ```
         
      
      3. 将文件中的"Configuring Go Environment Variables on LINUX"下的步骤复制到命令框中。 将配置文件中Go发布命令代码段复制到命令框中，并参考[Go Modules打包方式简介]替换命令行中的参数信息（本文打包版本为"v1.0.0"）。
         例如：
         ```
         curl -u "<USER>:<PASSWORD>" -X PUT https://<URL>//example.com/demo/@v/v1.0.0.zip -T $GOPATH/src/v1.0.0.zip
         curl -u "<USER>:<PASSWORD>" -X PUT https://<URL>/example.com/demo/@v/v1.0.0.mod -T $GOPATH/src/example.com/demo/go.mod
         ```
         
       
   
   4. 单击"新建并执行"，启动构建任务执行。 待页面提示"构建成功"时，进入Go私有依赖库，可找到通过构建任务上传的Go私有组件。
      ![](https://support.huaweicloud.com/bestpractice-cloudartifact/zh-cn_image_0000002526247414.png "点击放大")
      
      
   
   
   
   
 
#### 从Go私有依赖库获取依赖包
![](https://support.huaweicloud.com/bestpractice-cloudartifact/public_sys-resources/caution_3.0-zh-cn.png)
只能获取非当前代码仓构建的软件包，否则执行下载命令时将提示：can't request explicit version of path in main module。
1. 参考[发布私有组件到Go私有依赖库]，下载私有依赖库配置文件。
2. 进入代码托管服务，创建Go语言代码仓库（操作步骤请参考[新建代码仓库](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0013.html)）。本文中使用仓库模板"Go Web Demo"创建代码仓库。
3. 配置并执行编译构建任务。 
   1. 在代码仓库中，单击页面右上角"设置构建"，页面跳转至"新建编译构建任务"页面。 在页面中选择"空白构建模板"，单击"下一步"。
      
   
   2. 添加步骤"Go语言构建"。
   
   3. 编辑步骤"Go语言构建"。
      1. 工具版本按照实际选择，本文中选择"go-1.13.1"。
      
      2. 删除已有命令行，打开已下载的私有依赖库配置文件，将文件中的"Configuring Go Environment Variables on LINUX"下的步骤复制到命令框中。
      
      3. 根据下载版本，选择配置文件中"go下载命令"相应的命令行复制到命令框中，并将"\<modulename\>"参数值。（本文中为"example.com/demo"）。 例如：
         ```
         go get -v example.com/demo@v1.0.0
         ```
         
       
   
   
   
   
4. 单击"新建并执行"，启动构建任务执行。 
   ![](https://support.huaweicloud.com/bestpractice-cloudartifact/public_sys-resources/note_3.0-zh-cn.png)
   如果要下载的软件包是当前代码仓构建的软件包，执行下载命令时将提示：can't request explicit version of path in main module。请下载非当前代码仓构建的软件包。
   待页面提示"构建成功"时，查看构建任务详情，在日志中找到类似如下内容，说明编译构建任务从私有依赖库完成了依赖包下载并构建成功。
   ![](https://support.huaweicloud.com/bestpractice-cloudartifact/zh-cn_image_0000002557372477.png "点击放大")
   
   
 
 #### Go Modules打包方式简介
本文采用Go Modules打包方式完成Go组件的构建与上传。
打包命令主要包括以下几部分：
1. 在工作目录中创建源文件夹。
   ```
   mkdir -p {module}@{version}
   ```
   
2. 将代码源拷贝至源文件夹下。
   ```
   cp -rf . {module}@{version}
   ```
   
3. 压缩组件zip包。
   ```
   zip -D -r [包名] [包根目录名称]
   ```
   
4. 上传组件zip包与"go.mod"文件到私有依赖库中。
   ```
   curl -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/bestpractice-cloudartifact/zh-cn_image_0000002512517051.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 -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/@v/v1.0.0.zip -T v1.0.0.zip
     curl -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/bestpractice-cloudartifact/zh-cn_image_0000002480397166.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/bestpractice-cloudartifact/zh-cn_image_0000002512517049.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 -u {{username}}:{{password}} -X PUT {{repoUrl}}/example.com/demo/@v/v3.0.0+incompatible.zip -T v3.0.0.zip
     curl -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
     ```
     
   
 
