”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 轻松管理和安装您的私有 Go 模块

轻松管理和安装您的私有 Go 模块

发布于2024-08-23
浏览:368

Easily manage and install your private Go modules

对于 Golang 开发人员来说,在处理公共存储库时管理和安装 Go 模块通常很简单。然而,当您需要使用私有 Go 模块时,事情会变得更加棘手。

除了使用私有 GOPROXY 之外,Go 模块工具链不提供用于处理私有模块的内置机制,并且正确设置和维护工具链并不是每个开发人员或组织都可以选择的。一些包存储库服务支持使用私有 Go 模块,但通常不会为开发人员提供最干净的体验。

因此,在大多数情况下,我们最终会安排复杂的 Git 配置(.netrc 或 .gitconfig)与一些 Go 环境变量相结合,以在使用 go get、go install 或 go mod download 时管理我们的私有存储库的身份验证.

这些 Git 配置的问题在于,它们并非对所有开发人员来说都是显而易见的,而且它们可能不安全,因为可能需要在文件系统中存储纯文本凭据。当配置 CI/CD 系统、构建 Docker 镜像等时,这些问题变得更加成问题

介绍 goproxy.dev

作为长期的 Golang 开发人员(来自 Go 模块甚至不存在的时代),我们一直梦想着有一天,使用私有 Go 库将像使用公共库一样简单且强大。

想象一下,开发您的私有 Go 库并将其推送到 GitHub,然后仅通过设置 GOPROXY 环境变量即可立即从项目源代码中获取新更改。没有棘手和不安全的 Git 配置,没有自托管 GOPROXY 维护,没有复杂且容易出错的发布工作流程,并且本地开发机器、Dockerfile 和 CI/CD 环境的设置相同。

向 goproxy.dev 打个招呼,这是一个与 GitHub 集成的私有 GOPROXY 服务,为您提供无缝 Go 私有模块安装

如何在开发工作流程中设置 goproxy.dev

只需使用您的 GitHub 帐户登录 goproxy.dev,授予您将使用的私有存储库的访问权限,然后导出您的 GOPROXY 和 GONOSUMDB 环境变量。

export [email protected],proxy.golang.org,direct
export GONOSUMDB=github.com/your-organization

这些 Go 环境变量可以直接从 shell 配置(.zshrc、.bashrc 等)或使用 go env -w 设置。

然后您可以运行常用的 go 命令来安装和下载您的私有模块。

go get github.com/your-organization/[email protected]
go install github.com/your-organization/go-module/cmd
...
go mod download

如何使用 goproxy.dev 构建 Docker 镜像

与goproxy.dev集成只需要设置两个环境变量。在 Docker 构建期间执行此操作的最佳方法是使用 Docker 构建机密功能。

在你的 Dockerfile 中:

COPY go.mod go.sum ./
RUN --mount=type=secret,id=GOPROXY \
    GOPROXY=$(cat /run/secrets/GOPROXY) \
    GONOSUMDB=github.com/your-organization \
    go mod download
RUN go build .

然后运行:

GOPROXY="[your GOPROXY value]" docker build --secret id=GOPROXY

如何使用 GitHub Actions 中的 goproxy.dev

只需为包含 GOPROXY URL 的 GitHub Actions 配置一个秘密,并在工作流程中使用它:

jobs:
  build:
    - run: |
        go mod download
        go build .
      env:
        GOPROXY: ${{ secrets.PRIVATE_GOPROXY }}
        GONOSUMDB: github.com/your-organization

 立即简化您的 Go 开发工作流程

通过 goproxy.dev,您在使用 Go 库时将获得最佳的开发人员体验。无论您依赖于开源公共库还是组织中的私有模块,您都将拥有统一的工作流程:设置 GOPROXY 环境变量,并获取特定版本、Git 分支或提交的依赖项。

立即注册我们的 14 天免费试用版,了解更多信息并开始使用 goproxy.dev。

版本声明 本文转载于:https://dev.to/goproxydev/easily-manage-and-install-your-private-go-modules-g74?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-07-03
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-03
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-07-03
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-03
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-03
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-03
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-07-03
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-07-03
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-03
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-07-03
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-07-03
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-03
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-07-03
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-07-03
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3