龙空技术网

使用 GoReleaser 和 Homebrew 分发您的 Go CLI 工具

启辰8 23

前言:

此刻各位老铁们对“wget克隆网站”可能比较讲究,同学们都想要学习一些“wget克隆网站”的相关内容。那么小编在网络上搜集了一些有关“wget克隆网站””的相关知识,希望同学们能喜欢,朋友们快快来了解一下吧!

在 Duro,我和我的团队制作了一个实用的 CLI 工具,使我们能够快速轻松地为我们的平台创建微服务。该工具为 TypeScript、linting、与我们的共享库的集成以及用于将服务推送到云的特定 Github Actions 设置了标准服务配置。拥有它真是太好了。

我们不断地用它来调整一些东西,修复一些小问题并改变我们的配置。我们决定使用GoReleaser来帮助我们对工具进行版本控制并创建二进制文件并将其发布到 Github。太棒了。

直到我们不得不分发它。

修订版开始增加,试图确保您拥有该工具的最新版本是一件很麻烦的事情。本着“把事情做好”的精神,我们只是让每个人都下载它并在完成后删除它。这不是一个很好的解决方案,但是嘿,我们还有更多事情要担心。

最近,我决定亲自向这个工具展示一些爱(并讨好我的开发人员同事),尝试通过 Homebrew 管理这个工具的版本。我不知道 Homebrew 的内部工作原理,所以我决定深入研究。

自制基础知识

Homebrew 是一个包管理器,允许用户通过简单的界面安装包。如果您需要curl但没有,您只需运行brew install curlHomebrew 即可获取它。如果需要,您甚至可以指定包的特定版本。

Homebrew 如何知道从哪里获取东西?

Homebrew 有一个核心包列表,您可以在此处浏览,并且在您输入 时即可使用这些包brew install。每个包都有一个Formula,它只是一个 Ruby 文件,显示包的最新 SHA 是什么,并允许 Homebrew 根据您的操作系统选择正确的二进制文件。下面是一个公式示例:

class Wget < Formula  homepage ";  url ";  sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"  def install    system "./configure", "--prefix=#{prefix}"    system "make", "install"  endend

存储此公式的存储库称为tap。事实上,核心包的列表存储在core tap中。这不仅是您可以拥有的水龙头;您可以创建自己的水龙头。

如何创建水龙头以及创建后会发生什么?

有关于如何创建 tap 的标准文档。

简而言之,当您输入 时brew tap <tap_name> <URL>,它将转到该 URL 并克隆存储库并将其保存在 中$(brew --repository)/Library/Taps。然后,当您输入 时brew install <package>,它将首先搜索核心分接头,然后搜索您创建的任何其他分接头。然后,它将查找公式 Ruby 文件,并从公式中的指定位置获取最新的包(或您指定的版本),并将其放入 Homebrew 的路径中,以便您可以访问它。

如何创建公式?

您可以手动创建一个,但GoReleaser 可以为您完成。

这是基本配置:

brews:  -    # Name of the recipe    #    # Default: ProjectName    # Templates: allowed    name: some_app    # Folder inside the repository to put the formula.    folder: Formula    # Your app's description.    #    # Templates: allowed    description: "Put in description here."    # Repository to push the generated files to.    repository:      owner: example      name: some_app      branch: brew-releases/{{ .Version }}      token: "{{ .Env.GITHUB_TOKEN }}"      pull_request:        enabled: true        base:          owner: example          name: some_app          branch: master    # NOTE: make sure the url_template, the token and given repo (github or    # gitlab) owner and name are from the same kind.    # We will probably unify this in the next major version like it is    # done with scoop.    # URL which is determined by the given Token (github, gitlab or gitea).    #    # Default depends on the client.    # Templates: allowed    url_template: "{{ .Tag }}/{{ .ArtifactName }}"    # Allows you to set a custom download strategy. Note that you'll need    # to implement the strategy and add it to your tap repository.    # Example:     download_strategy: GitHubPrivateRepositoryReleaseDownloadStrategy    custom_require: './custom_release_strategy'    # Git author used to commit to the repository.    commit_author:      name: goreleaserbot      email: goreleaserbot@example.com    # The project name and current git tag are used in the format string.    #    # Templates: allowed    commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}"

在这里,GoReleaser 将为您生成 Ruby 公式文件,并尝试将其提交Formula到此存储库中的文件夹中。就我而言,我们对主分支进行了保护,因此我们必须指定使用新公式自动创建 PR 的部分。

我们还有一个 Github Action,每当在我们的存储库中创建新标签时,它都会使用GoReleaser 的自定义操作来触发发布。现在我们所要做的就是使用新标签创建一个版本,GitHub Action 将使用二进制文件准备一个版本,然后使用更新的公式自动创建 PR。一旦合并,Homebrew 应该负责更新修订版本。

然后就是FTWbrew tap和brew install组合!(您的环境变量中可能需要有 GitHub 个人访问令牌HOMEBREW_GITHUB_API_TOKEN)。

听起来没那么糟糕!你为什么抱怨这很痛苦?

啊,是这样。问题所在。

Homebrew 使用几种不同的方法来下载/克隆存储库,例如CurlDownloadStrategy(它的作用与它所说的完全一样)。

他们曾经支持一个名为GitHubPrivateRepositoryReleaseDownloadStrategy. 顾名思义:它从 GitHub 私有存储库下载版本。当我自己研究这样做时,有大量的文档表明使用该策略是为了乐趣和利润。

问题是,Homebrew 不再支持该策略。然后GoReleaser 停止支持它。

搞砸了?并非如此,这要感谢社区和开源软件的帮助!

GoReleaser 问题中的这条评论告诉我,我可以从旧版本的 Homebrew 中复制旧代码,并将它们包含到我的 GoReleaser 公式中。

我认为最终我们使用了此处提出的建议以及此 Gist 链接中包含的代码。Formula我们将该代码放入存储库中的同一文件夹中并将其命名为custom_release_strategy.rb. custom_require该文件在该部分的字段中被指向brews,并自动将其包含在公式文件中,以便 Homebrew 知道如何下载包。

希望这可以帮助任何想要构建自己的 CLI 工具并通过 Homebrew 发布它的人!

标签: #wget克隆网站