2021-10-30 09:50:23 -03:00
# Homebrew Taps
2017-09-10 17:07:28 -03:00
2022-10-22 01:30:54 +00:00
After releasing to GitHub, GitLab, or Gitea, GoReleaser can generate and publish
2020-05-10 18:59:21 -03:00
a _homebrew-tap_ recipe into a repository that you have access to.
2017-09-10 17:07:28 -03:00
2020-04-05 02:02:06 +02:00
The `brews` section specifies how the formula should be created.
2017-09-10 17:07:28 -03:00
You can check the
2022-09-17 00:13:09 -03:00
[Homebrew documentation ](https://github.com/Homebrew/brew/blob/master/docs/How-to-Create-and-Maintain-a-Tap.md ),
2017-09-10 17:07:28 -03:00
and the
[formula cookbook ](https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md )
for more details.
2020-05-10 18:59:21 -03:00
```yaml
2021-12-23 01:52:01 +01:00
# .goreleaser.yaml
2019-06-10 10:35:19 -03:00
brews:
-
2023-04-02 17:16:21 -03:00
# Name of the recipe
#
# Default: ProjectName
# Templates: allowed
2019-06-10 10:35:19 -03:00
name: myproject
2023-07-27 01:19:45 +00:00
# Alternative names for the current recipe.
#
# Useful if you want to publish a versioned formula as well, so users can
# more easily downgrade.
#
# Since: v1.20 (pro)
# Templates: allowed
alternative_names:
- myproject@{{ .Version }}
- myproject@{{ .Major }}
2019-06-10 10:35:19 -03:00
# IDs of the archives to use.
2023-04-02 17:16:21 -03:00
# Empty means all IDs.
2019-06-10 10:35:19 -03:00
ids:
- foo
- bar
2022-09-17 00:13:09 -03:00
# GOARM to specify which 32-bit arm version to use if there are multiple
# versions from the build section. Brew formulas support only one 32-bit
# version.
2023-04-02 17:16:21 -03:00
#
# Default: 6
2019-09-27 02:46:05 +02:00
goarm: 6
2022-09-17 00:13:09 -03:00
# GOAMD64 to specify which amd64 version to use if there are multiple
# versions from the build section.
2023-04-02 17:16:21 -03:00
#
# Default: v1
goamd64: v1
2022-04-11 22:43:22 -03:00
2022-09-17 00:13:09 -03:00
# 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.
2019-08-13 20:28:03 +02:00
2023-04-02 17:16:21 -03:00
# URL which is determined by the given Token (github, gitlab or gitea).
2022-01-20 14:59:39 -03:00
#
# Default depends on the client.
2023-04-02 17:16:21 -03:00
# Templates: allowed
2022-10-13 01:09:34 +03:00
url_template: "https://github.mycompany.com/foo/bar/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
2019-06-10 10:35:19 -03:00
2019-08-31 10:33:06 -03:00
# Allows you to set a custom download strategy. Note that you'll need
# to implement the strategy and add it to your tap repository.
2020-01-26 09:50:26 -05:00
# Example: https://docs.brew.sh/Formula-Cookbook#specifying -the-download-strategy-explicitly
2021-08-31 22:41:09 -03:00
download_strategy: CurlDownloadStrategy
2019-06-10 10:35:19 -03:00
2022-09-17 00:13:09 -03:00
# Allows you to add a custom require_relative at the top of the formula
# template.
2019-06-10 10:35:19 -03:00
custom_require: custom_download_strategy
# Git author used to commit to the repository.
commit_author:
name: goreleaserbot
2022-05-18 12:12:42 -03:00
email: bot@goreleaser .com
2019-06-10 10:35:19 -03:00
2021-09-01 10:27:31 -03:00
# The project name and current git tag are used in the format string.
2023-04-02 17:16:21 -03:00
#
# Templates: allowed
2021-09-01 10:27:31 -03:00
commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}"
2019-06-10 10:35:19 -03:00
# Folder inside the repository to put the formula.
folder: Formula
# Caveats for the user of your binary.
caveats: "How to use this binary"
# Your app's homepage.
homepage: "https://example.com/"
2023-04-02 17:16:21 -03:00
# Your app's description.
#
# Templates: allowed
2019-06-10 10:35:19 -03:00
description: "Software to create fast and easy drum rolls."
2020-11-26 14:06:47 +01:00
# SPDX identifier of your app's license.
license: "MIT"
2019-06-10 10:35:19 -03:00
# Setting this will prevent goreleaser to actually try to commit the updated
# formula - instead, the formula file will be stored on the dist folder only,
# leaving the responsibility of publishing it to the user.
# If set to auto, the release will not be uploaded to the homebrew tap
# in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1
2023-05-19 14:25:59 +00:00
#
# Templates: allowed
2019-06-10 10:35:19 -03:00
skip_upload: true
# Custom block for brew.
# Can be used to specify alternate downloads for devel or head releases.
custom_block: |
head "https://github.com/some/package.git"
...
# Packages your package depends on.
dependencies:
2020-05-24 18:10:25 +03:00
- name: git
- name: zsh
type: optional
2022-08-17 22:58:41 -03:00
- name: fish
version: v1.2.3
2022-09-17 00:13:09 -03:00
# if providing both version and type, only the type will be taken into
# account.
2022-08-17 22:58:41 -03:00
- name: elvish
type: optional
version: v1.2.3
2019-06-10 10:35:19 -03:00
# Packages that conflict with your package.
conflicts:
- svn
- bash
# Specify for packages that run as a service.
plist: |
<?xml version="1.0" encoding="UTF-8"?>
2022-09-27 11:05:29 -03:00
# ...
2019-06-10 10:35:19 -03:00
2022-03-16 21:12:57 -03:00
# Service block.
2022-09-11 16:54:51 -03:00
#
2023-04-02 17:16:21 -03:00
# Since: v1.7
2022-03-16 21:12:57 -03:00
service: |
run: foo/bar
2022-09-27 11:05:29 -03:00
# ...
2022-03-16 21:12:57 -03:00
2019-06-10 10:35:19 -03:00
# So you can `brew test` your formula.
2023-07-30 03:03:54 +00:00
#
# Template: allowed
2019-06-10 10:35:19 -03:00
test: |
2022-09-27 11:05:29 -03:00
system "#{bin}/foo --version"
# ...
2019-06-10 10:35:19 -03:00
# Custom install script for brew.
2023-07-30 03:03:54 +00:00
#
# Template: allowed
2023-04-02 17:16:21 -03:00
# Default: 'bin.install "BinaryName"'
2019-06-10 10:35:19 -03:00
install: |
2022-09-27 11:05:29 -03:00
bin.install "some_other_name"
bash_completion.install "completions/foo.bash" => "foo"
# ...
2021-05-17 18:33:04 +01:00
2023-07-30 03:03:54 +00:00
# Additional install instructions so you don't need to override `install` .
#
# Template: allowed
# Since: v1.20.
extra_install: |
bash_completion.install "completions/foo.bash" => "foo"
man1.install "man/foo.1.gz"
# ...
2021-03-23 09:50:12 -05:00
# Custom post_install script for brew.
# Could be used to do any additional work after the "install" script
post_install: |
etc.install "app-config.conf"
2023-06-13 23:25:18 -03:00
# ...
{% include-markdown "../includes/repository.md" comments=false %}
2017-09-10 17:07:28 -03:00
```
2020-05-10 18:59:21 -03:00
!!! tip
2023-06-13 23:25:18 -03:00
2020-11-19 12:31:26 -08:00
Learn more about the [name template engine ](/customization/templates/ ).
2018-07-08 23:57:46 -07:00
2017-09-10 17:07:28 -03:00
By defining the `brew` section, GoReleaser will take care of publishing the
Homebrew tap.
2017-10-01 18:57:52 +02:00
Assuming that the current tag is `v1.2.3` , the above configuration will generate a
2017-09-10 17:07:28 -03:00
`program.rb` formula in the `Formula` folder of `user/homebrew-tap` repository:
```rb
class Program < Formula
desc "How to use this binary"
homepage "https://github.com/user/repo"
version "v1.2.3"
2019-06-10 10:35:19 -03:00
2022-02-19 17:41:32 -07:00
on_macos do
2019-06-10 10:35:19 -03:00
url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_macOs_64bit.zip"
sha256 "9ee30fc358fae8d248a2d7538957089885da321dca3f09e3296fe2058e7fff74"
2020-11-16 09:16:50 -03:00
end
2022-02-19 17:41:32 -07:00
on_linux
if Hardware::CPU.intel?
url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_Linux_64bit.zip"
sha256 "b41bebd25fd7bb1a67dc2cd5ee12c9f67073094567fdf7b3871f05fd74a45fdd"
end
if Hardware::CPU.arm? & & !Hardware::CPU.is_64_bit?
url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_Linux_armv7.zip"
sha256 "78f31239430eaaec01df783e2a3443753a8126c325292ed8ddb1658ddd2b401d"
end
if Hardware::CPU.arm? & & Hardware::CPU.is_64_bit?
url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_Linux_arm64.zip"
sha256 "97cadca3c3c3f36388a4a601acf878dd356d6275a976bee516798b72bfdbeecf"
end
2019-06-10 10:35:19 -03:00
end
2017-09-10 17:07:28 -03:00
depends_on "git"
2020-05-24 18:10:25 +03:00
depends_on "zsh" => :optional
2017-09-10 17:07:28 -03:00
def install
bin.install "program"
end
2021-05-17 18:33:04 +01:00
2021-03-23 09:50:12 -05:00
def post_install
etc.install "app-config.conf"
end
2017-09-10 17:07:28 -03:00
end
```
2020-05-10 18:59:21 -03:00
!!! info
2023-06-13 23:25:18 -03:00
2020-05-10 18:59:21 -03:00
Note that GoReleaser does not generate a valid homebrew-core formula.
The generated formulas are meant to be published as
[homebrew taps ](https://docs.brew.sh/Taps.html ), and in their current
form will not be accepted in any of the official homebrew repositories.
2020-09-06 11:22:09 -03:00
## Head Formulas
GoReleaser does not generate `head` formulas for you, as it may be very different
from one software to another.
Our suggestion is to create a `my-app-head.rb` file on your tap following
[homebrew's documentation ](https://docs.brew.sh/Formula-Cookbook#unstable-versions-head ).
2021-11-11 09:37:58 -03:00
2023-07-27 01:19:45 +00:00
## Versioned formulas
!!! success "GoReleaser Pro"
This requires [GoReleaser Pro ](/pro/ ).
GoReleaser can also create a versioned formula.
For instance, you might want to make keep previous minor versions available to
your users, so they easily downgrade and/or keep using an older version.
To do that, use `alternative_names` :
```yaml
# .goreleaser.yaml
brews:
- name: foo
alternative_names:
- "foo@{{ .Major }}.{{ .Minor }}"
# other fields
```
So, if you tag `v1.2.3` , GoReleaser will create and push `foo.rb` and
`foo@1.2.rb` .
Later on, you can tag `v1.3.0` , and then GoReleaser will create and push both
`foo.rb` (thus overriding the previous version) and `foo@1.3.rb` .
Your users can then `brew install foo@1.2` to keep using the previous version.
2023-05-11 14:47:00 +02:00
## GitHub Actions
To publish a formula from one repository to another using GitHub Actions, you cannot use the default action token.
You must use a separate token with content write privileges for the tap repository.
You can check the [resource not accessible by integration ](https://goreleaser.com/errors/resource-not-accessible-by-integration/ ) for more information.
2021-11-11 09:37:58 -03:00
## Limitations
- Only one `GOARM` build is allowed;
2023-06-14 23:34:41 -03:00
{% include-markdown "../includes/prs.md" comments=false %}