开发一个自己用的 homebrew/jswork 安装软件源

在mac下,homebrew是个很不错的软件安件工具;有时候,我们自己开发的一些小软件,也可以借助这个工具进行一键安装,我这里是复用 github上的 repo 来实现的。
更新于: 2024-11-28 08:15:22

在自己的 github上建立一个项目: homebrew-jswork

  1. 需要有相应的 ruby 脚本
  2. 继承自 Formula
  3. 实现一个 install 方法,其它的选择性实现(应该完整的实现会更好)

目录里有 Formula/t2k.rb

  1. Formula: 这个目录可以没有,不过我习惯把文件放一个目录里
  2. t2k就是自己要实现的类

实现t2k里的安装步骤

  • 这个实现是不行的,错误示范
class T2k < Formula
  homepage "https://github.com/afeiship/topics2keywords"
  url "https://github.com/afeiship/topics2keywords", :using => :git
  version "1.0.1"

  def install
    system "npm", "i", "-g", "@jswork/topics2keywords"
  end

  test do
    system "t2k --version"
  end
end

开发完成,执行这个程序的安装吧

brew install afeiship/jswork/t2k

本地缓存以及调试

cd /usr/local/Homebrew/Library/Taps/afeiship
rm -rf homebrew-jswork/ && http_proxy=http://127.0.0.1:9090 https_proxy=http://127.0.0.1:9090 brew install afeiship/jswork/t2k

brew create

# 会在这里生成一个 相关的 xxx.rb 文件
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

第一个有效的安装

  • aliyun-cli
 brew install afeiship/jswork/aliyun-cli

一个典型的安装脚本

class MyTool < Formula
  desc "My awesome CLI tool"
  homepage "https://example.com"
  url "https://example.com/my_tool.tar.gz"
  sha256 "abc123"

  def install
    libexec.install "my_tool" # 将文件放入 libexec 目录
    bin.install_symlink libexec/"my_tool" => "mytool"
    bin.write_env_script libexec/"my_tool", :MY_VAR => "my_value"
  end
end

开源的 github release 模板

class MyTool < Formula
  desc "My awesome CLI tool"
  homepage "https://github.com/username/repo"
  license "MIT" # 替换为实际的许可证类型

  # 动态版本逻辑(根据最新 GitHub Release)
  livecheck do
    url :stable # 使用 Formula 的 `stable` url 获取最新版本
    strategy :github_latest # 基于 GitHub 最新发布版本
  end

  # 下载地址和校验哈希(需要替换为你的实际项目信息)
  if Hardware::CPU.arm?
    url "https://github.com/username/repo/releases/latest/download/tool_Darwin_arm64.tar.gz"
    sha256 "替换为_arm64_文件的_SHA256"
  else
    url "https://github.com/username/repo/releases/latest/download/tool_Darwin_x86_64.tar.gz"
    sha256 "替换为_x86_64_文件的_SHA256"
  end

  # 安装逻辑
  def install
    bin.install "tool" => "gfl" # 安装并重命名为 gfl
  end

  # 测试逻辑
  test do
    assert_match version.to_s, shell_output("#{bin}/gfl --version")
  end
end