前言
Homebrew 標榜自己是 “macOS(或 Linux)缺失的軟件包的管理器”,使用 macOS 作為開發終端的用戶,往往繞不過 brew
這個軟件包管理工具。確實在 macOS 上沒有比 brew
更好用的軟件包管理工具了,基本上想用的 CLI 工具,只需一行命令就可一鍵安裝,非常的方便。記得去年博主還寫過一篇 《Golang 裝逼指南 Ⅱ:在 Homwebrew 上發佈 Golang 項目》,當時只是介紹瞭如何將 Golang 開發的 CLI 工具發佈到自建的 homebrew-tap 上。本文則是講解如何將自己開發的軟件,推送到官方的 homebrew-core 倉庫中,使用像 brew install kubecm
這樣的命令即可完成安裝。
Homebrew-core
homebrew-core 中存儲著所有官方的安裝腳本,而這些安裝腳本都是由軟件開發者自己提交 PR 合併到倉庫中的。同時 homebrew 也提供了查詢頁面,用戶可以在網頁 Homebrew Formulae 上查詢自己的軟件總共被下載安裝了多少次,如下:
新的項目只需向這個倉庫提交 PR 即可。
準備階段
首先需要在 GitHub 上 fork homebrew-core 項目。
然後在本地找到保存 homebrew-core 的目錄:
$ cd $(brew --repository homebrew/core)
新增 remote 地址為 fork 倉庫的地址:
$ git remote add <YOUR_USERNAME> https://github.com/<YOUR_USERNAME>/homebrew-core.git
這裡的 YOUR_USERNAME
是 GitHub username。
新建分支
這裡的操作就和向開源項目提交 PR 一樣,新建 branch 並創建安裝腳本。
$ git checkout master
更新 master 分支
$ brew update
從最新的 master 分支創建新 branch
$ git checkout -b <YOUR_BRANCH_NAME> origin/master
編寫腳本
首先需要使用 brew search <formula>
來查看上游倉庫中是否有同名的項目,同時確保你的項目是穩定版且帶有 tag
(不能只是一個 GitHub repo)。
使用 brew create
創建一個腳本模板,命令如下:
$ brew create https://example.com/foo-0.1.tar.gz
這裡的 URL 地址,就是 GitHub Release 頁面的 Source code(tar.gz)
的 URL 地址。
打開 Formula/foo.rb
可以看到:
class Foo < Formula
desc ""
homepage ""
url "https://example.com/foo-0.1.tar.gz"
sha256 "85cc828a96735bdafcf29eb6291ca91bac846579bcef7308536e0c875d6c81d7"
license ""
# depends_on "cmake" => :build
def install
# ENV.deparallelize
system "./configure", "--disable-debug",
"--disable-dependency-tracking",
"--disable-silent-rules",
"--prefix=#{prefix}"
# system "cmake", ".", *std_cmake_args
system "make", "install"
end
test do
system "false"
end
end
之後就是完善這個腳本,desc
、homepage
、license
都請根據項目情況填寫。
如果是 Golang 項目,則需要添加 Go 依賴 depends_on "go" => :build
,同時在 install
中完善安裝腳本,golang 開發的項目一般都是使用 go build
來構建。
注意: 與自建 homebrew-tap 不同,向官方提交 PR,需要使用源碼構建,不能只推送構建好的二進制文件!同時必須有 test 部分,否則將無法合併代碼。
這裡附上一份 kind 的腳本供大家參考:
class Kind < Formula
desc "Run local Kubernetes cluster in Docker"
homepage "https://kind.sigs.k8s.io/"
url "https://github.com/kubernetes-sigs/kind/archive/v0.9.0.tar.gz"
sha256 "c154289659a7ef30b301a0787ecfa2e08edaada6059bf5acefe9f3be1e026381"
license "Apache-2.0"
head "https://github.com/kubernetes-sigs/kind.git"
bottle do
cellar :any_skip_relocation
rebuild 1
sha256 "e40a2343bf999585fa4fcb1a1e9b801427e921c098fc3f7e3026c071a0e72520" => :big_sur
sha256 "e5ba99b5f14711e0dcb121a992d74c5ee6c6b0468b27e5200bf796d4987e13c0" => :catalina
sha256 "d52a780ad6af93a2a7c480a41c5178a461b9966ddc1adb66adde8ff3bce15238" => :mojave
sha256 "423ea750ae8589d1a199847f746d8e9b5b1f1d81ceff3a9dab2d63f161532588" => :high_sierra
end
depends_on "go" => :build
def install
system "go", "build", "-o", bin/"kind"
prefix.install_metafiles
# Install bash completion
output = Utils.safe_popen_read("#{bin}/kind", "completion", "bash")
(bash_completion/"kind").write output
# Install zsh completion
output = Utils.safe_popen_read("#{bin}/kind", "completion", "zsh")
(zsh_completion/"_kind").write output
# Install fish completion
output = Utils.safe_popen_read("#{bin}/kind", "completion", "fish")
(fish_completion/"kind.fish").write output
end
test do
# Should error out as creating a kind cluster requires root
status_output = shell_output("#{bin}/kind get kubeconfig --name homebrew 2>&1", 1)
assert_match "failed to list clusters", status_output
end
end
更多內容見官方文檔。
檢測腳本
在腳本完成後,請先進行如下測試,確保測試通過且無任何報錯。
$ brew tests
$ brew install --build-from-source <CHANGED_FORMULA>
$ brew test <CHANGED_FORMULA>
$ brew audit --strict <CHANGED_FORMULA>
提交代碼
在通過所有測試後,就可以提交代碼了,需要對每個更改單獨提交 PR,且 commit 有格式要求,一般為 <FORMULA_NAME> <NEW_VERSION>
如 kbecm 0.10.3
。
$ git add Formula/foo.rb
$ git commit -m 'foo 0.0.1'
$ git push --set-upstream <YOUR_USERNAME> <YOUR_BRANCH_NAME>
在這裡提交後,代碼就會 push 到之前 fork 的 homebrew/core
項目。
提交 PR
之後就可以在 GitHub 頁面操作提交 PR 了。項目維護者的響應還是很及時的,在 PR 通過所有 CI test 後,就會有維護者進行 review 並指出需要修改的地方,根據要求修復即可。
提交新版本
PR 合併成功後,如果要發佈新版本,這裡推薦兩種方式提交新版本。
CLI
brew
提供了十分簡單的方式自動創建 PR,命令如下:
$ brew bump-formula-pr --url https://example.com/foo-0.1.tar.gz
更多的信息可以通過 brew bump-formula-pr --help
查看。
GitHub action
這一步也可以在 GitHub action 中自動完成,使用 homebrew-bump-formula 插件。原理其實也是使用了 brew bump-formula-pr
,但是這樣就無需手動觸發,可以集成到 Release 的 CI 中。
name: Bump Homebrew kubecm formula
on:
push:
tags: 'v*'
jobs:
homebrew:
runs-on: ubuntu-latest
steps:
- name: Update Homebrew formula
uses: dawidd6/action-homebrew-bump-formula@v3
with:
# GitHub token, required, not the default one
token: ${{secrets.TOKEN}}
# Optional, defaults to homebrew/core
tap: USER/REPO
# Formula name, required
formula: FORMULA
# Optional, will be determined automatically
tag: ${{github.ref}}
# Optional, will be determined automatically
revision: ${{github.sha}}
# Optional, if don't want to check for already open PRs
force: false # true
注意: 這裡的 TOKEN
需要在 Personal Access Token 上申請,並手動添加到 repo 的 setting 中。
結語
總的來說,這一套流程都比較簡單,筆者也只是在 GitHub action 的 TOKEN
上浪費了一些時間。使用 brew
不但簡化了安裝步驟,提升了用戶體驗,還可以把諸如 completion
命令生成的自動補全腳本在安裝時就注入到系統中,無需在裝好後再進行其他操作,體驗極佳。