发布一个 Homebrew 包

洛竹 等级 357 0 0

相关概念

Keg(酒桶)

安装好的脚本、软件等。比如 gh,如果有安装。执行下面的指令可查看位置:

open /usr/local/bin/gh

Cellar(酒窖)

所有用 Homebrew 安装在本地的脚本、软件组成的集合。可以通过以下指令查看本地目前都安装了哪些脚本:

open /usr/local/Cellar/

Formula(配方)

定义如何下载、编译和安装脚本或软件的 Ruby 脚本;

Tap(专案)

一个包含若干 Formula 的 GitHub 专案。执行以下指令可以查看本地都有哪些 Tap:

open /usr/local/Homebrew/Library/Taps

官方专案库是 Homebrew/homebrew-core,想要通过 brew install 直接安装都要像该库贡献 Formula。本地安装在 /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core

项目初期我们没有必要急于将我们的项目发布到 Homebrew(官方也不一定给你合进去)。其实官方还提供了第三方 Tap 的机制,本文就是如何制作一个 Homebrew 包并发布到自己的 Tap 的。

创建 Tap

在 GitHub 上创建自己的仓库,创建仓库的命名方式必须是以 homebrew-<demo> 的规则命名。我们这里以 youngjuning/homebrew-tap 为例。并把 tap 同步到本地:

brew tap youngjuning/homebrew-tap https://github.com/youngjuning/homebrew-tap.git

注意:不要命名为 homebrew-core,之后你向 homebrew/homebrew-core 贡献代码会冲突

提示:我们可以执行 cd $(brew --repository youngjuning/tap) 打开本地 tap

制作 Formula

假设我们用 Go 开发了一个 CLI 工具,并构建除了二进制文件 tpc。接下来的步骤就是制作 Formula。

1、打出压缩包,格式必须是 *.tar.gz

tar zcvf tpc_0.0.1.tar.gz tpc

2、然后在 youngjuning/tpc 创建 Release 并将上一步生成的 tpc_0.0.1.tar.gz 文件当作附件上传。然后我们得到压缩包地址 https://github.com/youngjuning/tpc/releases/download/v0.0.1/tpc_0.0.1.tar.gz 供配方软连接到这个脚本文件

3、生成 Formula

brew create https://github.com/youngjuning/tpc/releases/download/v0.0.1/tpc_0.0.1.tar.gz --tap youngjuning/homebrew-tap

这条命令会在 /usr/local/Homebrew/Library/Taps/youngjuning/homebrew-tap/ 下创建一个 tpc.rb 文件,文件名是仓库名。

然后我们打开 /usr/local/Homebrew/Library/Taps/youngjuning/homebrew-tap/tpc.rb 对安装方式做一下调整:

def install
    bin.install "tpc"
end

做完这些操作后,在 /usr/local/Homebrew/Library/Taps/youngjuning/homebrew-tap/ 目录下,执行 git 操作提交代码到 github

多版本

以上我们完成了一个简单的 Homebrew 包,还有一个要紧的问题是,如何提供历史版本。Homebrew 对此也做了约定。假如我们要提供 0.0.1 版本的 tpc,你将做如下工作:

1、新建 tpc@0.0.1.rb 并将 tpc.rb 中的内容复制进来。

2、将 tpc@0.0.1.rb 中的 class Tpc 修改为 class TpcAT001

3、url 中 的地址修改为指向 0.0.1 版本的压缩包地址

安装

# 后续可以使用该命令更新 tap
$ brew tap youngjuning/tap
$ brew install tpc

或者

$ brew install youngjuning/tap/tpc

升级

$ brew upgrade youngjuning/tap/tpc

发布一个 Homebrew 包

收藏
评论区

相关推荐

Gradle技术之四 - Gradle的Task详解
1 Gradle的Task详解 1 Task定义和配置 2 Task的执行 3 Task的依赖和执行顺序 4 Task类型 5 Task结合gradle的生命周期 6 Task实战 1.1 Task定义和配置 1.1.1 查看所有的task java ./gradlew tasks 输出 Task :tasks
<Dart基础>Dart简介
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 一、简
前端开发神器Charles从入门到卸载
前言 本文将带大家学习使用前端开发神器charles,从基本的下载安装到常见配置使用,为大家一一讲解。 一、花式夸奖Charles 截取 Http 和 Https 网络封包。 支持重发网络请求,方便后端调试。 支持修改网络请求参数。 支持网络请求的截获并动态修改。 支持模拟慢速网络。 好,骑上我心爱的小摩托,准备上路... 二、下载
半小时掌握Android Gradle
目前国内对Android领域的探索已经越来越深,不少技术领域如插件化、热修复、构建系统等都对Gradle有迫切的需求,不懂Gradle将无法完成上述事情。所以Gradle必须要学习。 Gradle 里的几乎任何东西都是基于这两个基础概念: task project 掌握了这两个,你就掌握了一大半的 Gradle 知识了。 首先讲 Task
Dart教程(一):dart安装
一、安装dart sdk brew tap dartlang/dart brew install dart 二、安装VSCode 去官网下载即可 三、安装dart插件 (https://imghelloworld.osscnbeijing.aliyuncs.com/af7d1de25caf6599a4839b56f4f0d
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
完全背包问题
问题描述 有n种物品和一个容量为c的背包,每种物品都就可以选择任意多个,第i种物品的价值为v\i\,体积为w\i\,求解:在不超过背包容量的情况下,选择放入哪些物品能够使得背包中的价值最大?跟01背包一样,完全背包也是一个很经典的动态规划问题,不同的地方在于01背包问题中,每件物品最多选择一件;而在完全背包问题中,只要背包装得下,每件物品可
向 Deno 学习脚本的管理
前言 🌱如果你使用过 Deno、Go 或者配置过 Android Studio,那么你一定对配置环境变量不陌生。那么如果我们自己写了一个脚本或者命令行工具,如何分享给朋友们玩呢?最简单的当然是直接把脚本放出去,供别人手动下载和手动配置环境变量。但这既不优雅,也不利于传播,本文就是研读了 Deno 的安装机制后,总结出的一套可用的二进制可执行文件分发教程
我的 Mac 开发环境
Homebrew访问 安装。使用 Homebrew 安装 Apple(或您的 Linux 系统)没有预装但 。Homebrew 将大大降低维护环境的时间。本文后面将尽可能使用 Homebrew。 brew install:安装 brew uninstall:卸载 brew update:更新 homebrew brew upgr
发布一个 Homebrew 包
相关概念 Keg(酒桶)安装好的脚本、软件等。比如 gh,如果有安装。执行下面的指令可查看位置:shellopen /usr/local/bin/gh Cellar(酒窖)所有用 Homebrew 安装在本地的脚本、软件组成的集合。可以通过以下指令查看本地目前都安装了哪些脚本:shellopen /usr/local/Ce
python打包时没有将matplotlibrc文件打包
检查打包后,不能正常启动exe文件方法: 1、用pyinstaller D xxx.py 生成文件夹2、在Terminal中进入打包的目录下运行.exe文件(直接输入xxx.exe回车),查看错误我的错误是FileNotFoundError: [Errno 2] No such file or directory: 'D:\\PyCharm2020.1\\w
易班自动刷网薪系统
写在前面 Python 课最后的大作业,跟大哥们一起写这个小玩意,因为学院好像很喜欢刷这些东西,总体来说挺简单的 分到我的模块刚刚好需要手机抓包,网页端易班登陆进去没有发动态的模块了,模块在维护 后续会更新其他人的板块并尝试做出来真正的模拟登陆(逆向app或者使用appium提取loginToken) 源码python coding: utf8 """@T
python打包,安装包方法
一、编写模块进入项目目录cd /home/pysetup vi foo.pyview plainprint?class MyClass(): def init(self): self.blog "http://blog.liuts.com" def printblog(self): print s
你不可不知的JS面试题(第三期)
1、什么是闭包?如图所示,闭包就是一个定义在函数内部的函数,其作用是将函数内部和函数外部连接起来。大家知道,作用域的问题,就是在函数内部定义的变量称为局部变量,外部取不到值。下面我们通过代码来更加详细地看一下: function A()        let x  1;        return function B()            c
小记面试题-2021
CSS类 1.解释浮动及其工作原理浮动的元素可以向左或者向右移动,直到它的外边缘碰到包含元素(父元素)或另一个浮动元素的边框为止。要想使元素浮动,必须为元素设置一个宽度。虽然浮动的元素已不在文档流中, 但是它浮动后所处的位置依然在浮动之前的水平方向上。因为浮动元素不在文档流中,所以文档流中的块元素表现的就像浮动元素不存在一样,下面的元素会填补原来的位置。有些