如何使golang项目模块可访问gitlab上的其他项目管道?

9nvpjoqh  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(116)

我在本地机器上创建了两个项目。一个称为中间件,另一个称为身份验证。
两者都有模块。用于中间件项目的模块名为gitlab.com/nrs16/util,用于项目认证的模块名为gitlab.com/nrs16/authentication。
项目认证导入模块gitlab.com/nrs16/util并使用其部分功能。当我在本地运行它时,
这两个项目在gitlab上都有各自的仓库。对于身份验证,我创建了一个管道来构建它的二进制文件,但是它在go mod tidy上失败,并出现以下错误

go: gitlab.com/nrs16/authentication/src imports
    gitlab.com/nrs16/util: module gitlab.com/nrs16/util: git ls-remote -q origin in /go/pkg/mod/cache/vcs/93c72a4658a85380430fcf63ad9a84a56291aad8ea2eb7f78ecda66ceb9f7e58: exit status 128:
    fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.

遗嘱执行人是壳牌

这是.gitlab-ci.yml的内容:

stages:
  - build

variables:
  GO111MODULE: "on"

build:
  stage: build
  image: golang:1.21.0
  script:
    - go mod tidy
    - go mod download
    - go build -o authentication ./src/*.go
  artifacts:
    paths: 
      - src/.authentication

中间件go.mod:

module gitlab.com/nrs16/util

go 1.21.0

require (
    github.com/dgrijalva/jwt-go v3.2.0+incompatible
    github.com/spf13/viper v1.16.0
    golang.org/x/crypto v0.13.0
)

require (
    github.com/fsnotify/fsnotify v1.6.0 // indirect
    github.com/hashicorp/hcl v1.0.0 // indirect
    github.com/magiconair/properties v1.8.7 // indirect
    github.com/mitchellh/mapstructure v1.5.0 // indirect
    github.com/pelletier/go-toml/v2 v2.0.8 // indirect
    github.com/spf13/afero v1.9.5 // indirect
    github.com/spf13/cast v1.5.1 // indirect
    github.com/spf13/jwalterweatherman v1.1.0 // indirect
    github.com/spf13/pflag v1.0.5 // indirect
    github.com/subosito/gotenv v1.4.2 // indirect
    golang.org/x/sys v0.12.0 // indirect
    golang.org/x/text v0.13.0 // indirect
    gopkg.in/ini.v1 v1.67.0 // indirect
    gopkg.in/yaml.v3 v3.0.1 // indirect
)

在authentication/src/目录下的main.go文件中导入

package main

import (
    "database/sql"
    _ "encoding/json"
    "fmt"
    "log"
    "net/http"

    middleware "gitlab.com/nrs16/util"

    "github.com/gorilla/mux"
    _ "github.com/lib/pq"
)

备注:

中间件项目在gitlab上是公开的,我不确定这是否足以在运行环境中创建它的模块。
我怎样才能使util模块对运行者来说是可访问的,以便进行项目身份验证构建?此外,runner is shared runner在我的本地机器上运行良好,但这是预期的,因为该模块是在我的本地PC上创建的,但只是认为我也会分享这个
我是新来的,所以我试着检查chatGPT。它说我应该直接用go.mod文件推送项目中间件,我也这么做了,并公开它,我也这么做了。
我还将模块名称从www.example.com更改gitlab.com/nrs16/util为util,它在我的本地PC上也工作得很好。但我仍然在管道中的go build命令中得到这个错误:

package util is not in std (/usr/local/go/src/util)

完整的.gitlab-ci.yml内容:

stages:
  - build

variables:
  GO111MODULE: "on"

build:
  stage: build
  image: golang:1.21.0
  script:
    - go build -o authentication ./src/*.go
  artifacts:
    paths: 
      - src/.authentication

main.go:

package main

import (
    "database/sql"
    _ "encoding/json"
    "fmt"
    "log"
    "net/http"

    middleware "util"

    "github.com/gorilla/mux"
    _ "github.com/lib/pq"
)
lvmkulzt

lvmkulzt1#

好吧,这不是一个 * 实际 * 的答案,但它应该帮助你前进。不幸的是,在你如何尝试使用Go时,似乎有同样的主要问题是错误的,所以这是太多的评论。子弹点在这里没有真实的的秩序。

  • 如果你有问题,最好避免那些复杂的、特殊的、例外的、可行的但不寻常的事情。下面的几乎所有建议在技术上都是错误的,这只是最简单,最理智,最不容易出错的方法。
  • Go语言程序的基本构建块是“包”:你构建包,你测试包。不是文件。“Go Module”可能不是你习惯的其他语言:“模块”是一组版本化在一起的包。即具有相同的生命周期。
  • 停止像go build -o authentication ./src/*.go这样的东西这是 * 错误的 * 图片Go代码这样:1.不要将源文件放在src文件夹中。这在其他语言中可能很常见,但不要在Go中这样做。永远不要使用文件参数调用go build。您可以通过运行要构建的包的文件夹中的go build来构建Go程序。
  • 使用文件夹的正确名称!根据约定,文件夹名称应该是包名称或程序名称(对于主包),而不是其他名称。1 m2n1x你还记得吗?)不要制作“util”包。特别是如果看起来有一些域(中间件)。称它们为“中间件”或“金融服务”或“支付”。不要创建不相关的东西的包。
  • 读取(如果可能的话)https://go.dev/doc/tutorial/create-modulehttps://go.dev/doc/tutorial/workspaceshttps://go.dev/doc/code。它详细地解释了一切。
  • 始终包括问题中所有模块的整个go.mod
  • 如果您想使用多个模块(例如,出于教育目的),并且您使用gitlab,您必须gitlab.com/<UserOrg>/<Project>的形式命名您的模块。* 永远不要**将模块命名为“test”或“main”。永远不要将模块命名为“util”、“strings”或“foo”。总是使用像“foo.bar.nil/whatever”或“www.example.com“这样的名称example.org/myfirst/try(这是给予你更好的错误消息的唯一原因;但是您遇到了问题,更好的错误消息有助于解决问题)。
  • 始终使用完全限定的导入路径,如“example.org/myfirst/try/some/package/in/there”。永远不要使用相对导入。
  • 在签入代码之前运行go mod tidy。如果你想要一个专用的“源代码下载步骤”(这是不必要的!))可以在CI上执行go mod download。但同样,没有必要,去建设将照顾下载无论如何。
  • 如果一个CI作业希望使用来自不同存储库的代码,则它必须能够从该存储库下载代码。您不允许gitlab.com/nrs16/authentication checkout gitlab.com/nrs16/util,因此出现错误。注意最后一行:“如果这是一个私有存储库,请参阅https://golang.org/doc/faq#git_https以获取更多信息。”如果您的存储库不是公共的,则需要在CI上执行类似git config "url.ssh:// [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) /.insteadof" "https://gitlab.com/"的smth。
  • 访问私有存储库是一个常见的问题,你会发现几个答案。允许Gitlab存储库A访问存储库B的一种方法是在B上配置Deploy Key,并将A上的SSH_PRIVATE_KEY变量设置为该键。

相关问题