首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于带有子包的golang源,AWS CodeBuild失败。

对于带有子包的golang源,AWS CodeBuild失败。
EN

Stack Overflow用户
提问于 2018-11-19 20:30:27
回答 2查看 1.3K关注 0票数 1

当我试图使用CodeBuild golang映像1.10构建我的golang项目时,它失败了,无法找到子包。一些背景:

申请的组织方式如下:

代码语言:javascript
运行
复制
/go/src/company/app
/go/src/company/app/sub1
/go/src/company/app/sub2
etc...

这在我的开发机器上构建得很好。然而,当被代码构建所拉动时,它会被拉到一个不同的目录(/codebuild/output/srcNNN/src/<some path>)中,其中<some path>会根据触发构建的原因而有所不同。

我最初是通过将代码复制到golang目录(/codebuild/output/srcNNN)来工作的,但是由于GOPATH目录的CodeBuild环境变量在前面插入了/go:(/go:/codebuild/output/srcNNN),所以我使用了观察到的./.复制。然而,这是丑陋的,并失败了,因为我一开始就以另一种方式启动了构建。

我的问题是,是否有一个好的方法使这一工作?我的下一个想法是将字符串操作应用于观察到的路径,并在那里进行复制,以获得(希望)更高的可靠性。但这只有在GOPATH符合我的假设的情况下才能奏效。

任何想法都将不胜感激。

说明:在代码中导入包时,导入外部包的步骤如下:

代码语言:javascript
运行
复制
import (
    "context"
    ...
}

子包不是显式导入的,而是在部署代码时发现的,如上面所示(/go/src/company/app)。然而,AWS CodeBuild并不以这种方式引入代码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-20 17:09:03

如果您使用的是Golang1.11或更高版本,请参见下面的更新以获得完整的答案.我们不再使用我最初的工作了。

我找到了答案。我将在这里发布它,以防它对其他人有帮助,但它依赖于AWS CodeBuild中的观察到的行为来工作,所以我不认为它是理想的。

在我的buildspec.yaml中,我能够通过以下方法实现构建:

  1. 通过从一开始删除“${THEGOPATH}:”从${GOPATH}中获取/go
  2. 将所有代码复制到${THEGOPATH}/src/<app path>
  3. 将其他存储库复制到${THEGOPATH}/src/<other app path>
  4. 正常导入外部依赖项(在本例中,go get ./...或显式)
  5. 构建并强制输出名称(从CodeBuild启动时,它使用不同的目录名)

buildspec.yaml看起来如下所示:

代码语言:javascript
运行
复制
phases:
  install:
    commands:
      - echo GOPATH - $GOPATH
      - export THEGOPATH=`echo $GOPATH | cut -c 5-`
      - echo THEGOPATH = $THEGOPATH
      - mkdir -p ${THEGOPATH}/src/company/app1
      - mkdir -p  ${THEGOPATH}/src/company/other_repository_dependency
      - echo Copy source files to go root
      - cp -a ${CODEBUILD_SRC_DIR}/. ${THEGOPATH}/src/company/app1/${PACKAGE}
      - cp -a ${CODEBUILD_SRC_DIR_other_dep}/. ${THEGOPATH}/src/app/other_repository_dependecy/.
      - ls ${THEGOPATH}/src/
  build:
    commands:
      - echo Build started on `date`
      - echo Getting packages
      - go get ./...
      - echo DOING THE BUILD
      - go build -ldflags "<some flags>" -o "appname"
      - go test ./...
  post_build:
    commands:
      - echo Build completed on `date`
      - ls -al
      - pwd
artifacts:
  files:
    - appname

更新--今天我们尝试用go模块构建更好的修复(自1.11以来就可以获得),请参阅这里了解go模块的说明。

使用go模块,我们将当前源模块app1定义为go.mod文件中的company-name.com,如下所示:

代码语言:javascript
运行
复制
module company-name.com/app1

go 1.12
require (
   ... *for example*
   github.com/golang/mock v1.3.1
   github.com/google/btree v1.0.0 // indirect
   github.com/google/go-cmp v0.3.0
   ... *etc*

我们甚至以这种方式引用外部文件(尽管您需要弄清楚如何使用git存储库进行身份验证。我们使用内置在buildspec中的凭证助手进行https身份验证)。所以,我们的导入块现在看起来是这样的:

代码语言:javascript
运行
复制
     import ( 
       "company-name.com/app1/subpackage1"
       abbrev "company-name.com/app1/subpackage2"
       "company-name.com/externalpkg"  // In another private git repo of ours
       ... //etc
     )
     ... //golang source follows here*

最后,我们将以下环境变量添加到buildspec中:

代码语言:javascript
运行
复制
  variables:
    GO111MODULE: "on"
    git-credential-helper: yes

这些确保了模块在路径中工作(谢谢amwill04提醒我注意我的遗漏),并允许我们的Git存储库的凭据正确地进行设置。

在这样做的过程中,我们完成了我们所需要的一切:

  1. 通过更改对go模块的引用,我们可以轻松地引用子包。
  2. 我们能够锁定所有依赖项的版本。
  3. 通过在company-name.com上实现一个简单的服务器,我们可以引用应用程序中的其他私有模块
票数 3
EN

Stack Overflow用户

发布于 2019-06-07 01:08:17

这就是我所采取的方法。

代码语言:javascript
运行
复制
version: 0.2

env:
  variables:
    PACKAGE: "github.com/rhyselsmore/foo"

phases:
  install:
    commands:
      # AWS Codebuild Go images use /go for the $GOPATH so let's copy our
      # application source code into that directory structure.
      - mkdir -p "/go/src/$(dirname ${PACKAGE})"
      - ln -s "${CODEBUILD_SRC_DIR}" "/go/src/${PACKAGE}"
      - # Make sure we're in the package directort within our GOPATH
      - cd "/go/src/${PACKAGE}"

现在假设包变量是您正在构建的存储库的根,我们可以发出go命令。让我们一条条地把它拆开。

代码语言:javascript
运行
复制
- mkdir -p "/go/src/$(dirname ${PACKAGE})"

这将在GOPATH中为您的包创建一个新目录。

代码语言:javascript
运行
复制
- ln -s "${CODEBUILD_SRC_DIR}" "/go/src/${PACKAGE}"

这将从CodeBuild项目的根创建一个符号链接到Go包。

代码语言:javascript
运行
复制
- cd "/go/src/${PACKAGE}"

这将启动在Go包的CWD中执行的代码构建操作的其余部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53382185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档