<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Homebrew on Nelson Figueroa</title><link>https://nelson.cloud/categories/homebrew/</link><description>Recent content in Homebrew on Nelson Figueroa</description><image><title>Nelson Figueroa</title><url>https://nelson.cloud/apple-touch-icon.png</url><link>https://nelson.cloud/categories/homebrew/</link></image><language>en</language><lastBuildDate>Sun, 09 Aug 2026 01:22:57 -0700</lastBuildDate><atom:link href="https://nelson.cloud/categories/homebrew/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Install a Specific Version of a Homebrew Package with brew extract</title><link>https://nelson.cloud/how-to-install-a-specific-version-of-a-homebrew-package-with-brew-extract/?ref=rss</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><guid>https://nelson.cloud/how-to-install-a-specific-version-of-a-homebrew-package-with-brew-extract/?ref=rss</guid><description>Use &lt;code&gt;brew extract&lt;/code&gt; to install a specific version of a homebrew package.</description><content:encoded><![CDATA[<p>I previously wrote about 

<a href="https://nelson.cloud/how-to-install-older-versions-of-homebrew-packages/">how to install older versions of homebrew packages</a>. That method involves installing a package from a Ruby file but it&rsquo;s outdated and doesn&rsquo;t always work. There&rsquo;s a better way with <code>brew extract</code>, although it still comes with caveats.</p>
<p>I&rsquo;ll be using <code>hugo</code> as an example. Let&rsquo;s say I wanted to install v0.145.0 because v0.146.0 introduced breaking changes that broke my theme.</p>
<blockquote><p><strong>tl;dr:</strong></p><p>To install hugo v0.145.0:</p>
<ul>
<li>Create a local tap with <code>brew tap-new $USER/local</code></li>
<li>Tap homebrew/core which is a 1.3GB clone at the time of writing</li>
<li>Extract the formula with <code>brew extract</code></li>
<li>Patch the <code>hugo</code> formula. This isn&rsquo;t needed for every formula.</li>
<li>Install as usual</li>
</ul></blockquote>

<p>Note that this process will point your <code>hugo</code> command to the older version, but you can switch between versions with <code>brew link</code>.</p>
<h2 id="create-a-local-tap">Create a local tap</h2>
<p>Run <code>brew tap-new $USER/local</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew tap-new <span class="nv">$USER</span>/local
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Initialized empty Git repository in /opt/homebrew/Library/Taps/nelson/homebrew-local/.git/
</span></span></span><span class="line"><span class="cl"><span class="go">[main (root-commit) 6af371f] Create nelson/local tap
</span></span></span><span class="line"><span class="cl"><span class="go"> 3 files changed, 111 insertions(+)
</span></span></span><span class="line"><span class="cl"><span class="go"> create mode 100644 .github/workflows/publish.yml
</span></span></span><span class="line"><span class="cl"><span class="go"> create mode 100644 .github/workflows/tests.yml
</span></span></span><span class="line"><span class="cl"><span class="go"> create mode 100644 README.md
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Created nelson/local
</span></span></span><span class="line"><span class="cl"><span class="go">/opt/homebrew/Library/Taps/nelson/homebrew-local
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">When a pull request making changes to a formula (or formulae) becomes green
</span></span></span><span class="line"><span class="cl"><span class="go">(all checks passed), then you can publish the built bottles.
</span></span></span><span class="line"><span class="cl"><span class="go">To do so, label your PR as `pr-pull` and the workflow will be triggered.
</span></span></span></code></pre></div><p>It will enable developer mode. This is normal and safe.</p>
<h2 id="tap-homebrewcore">Tap homebrew/core</h2>
<p>Next, run <code>brew tap --force homebrew/core</code>. At the time of writing, it&rsquo;s a 1.3GB download. This is necessary to get this working because Homebrew no longer keeps 

<a href="https://github.com/homebrew/homebrew-core" target="_blank" rel="noopener">homebrew-core</a> cloned locally. The <code>brew extract</code> command needs the full git history to search for older versions.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew tap --force homebrew/core
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ JSON API formula.jws.json                                                                                                                                    Downloaded   32.0MB/ 32.0MB
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ JSON API cask.jws.json                                                                                                                                       Downloaded   15.4MB/ 15.4MB
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Tapping homebrew/core
</span></span></span><span class="line"><span class="cl"><span class="go">Cloning into &#39;/opt/homebrew/Library/Taps/homebrew/homebrew-core&#39;...
</span></span></span><span class="line"><span class="cl"><span class="go">remote: Enumerating objects: 3385552, done.
</span></span></span><span class="line"><span class="cl"><span class="go">remote: Counting objects: 100% (544/544), done.
</span></span></span><span class="line"><span class="cl"><span class="go">remote: Compressing objects: 100% (119/119), done.
</span></span></span><span class="line"><span class="cl"><span class="go">remote: Total 3385552 (delta 497), reused 427 (delta 425), pack-reused 3385008 (from 4)
</span></span></span><span class="line"><span class="cl"><span class="go">Receiving objects: 100% (3385552/3385552), 1.08 GiB | 48.36 MiB/s, done.
</span></span></span><span class="line"><span class="cl"><span class="go">Resolving deltas: 100% (2612327/2612327), done.
</span></span></span><span class="line"><span class="cl"><span class="go">Tapped 5 commands and 8313 formulae (8,851 files, 1.3GB).
</span></span></span></code></pre></div><h2 id="extract-the-desired-version">Extract the desired version</h2>
<p>Now we can use <code>brew extract</code>. This command will find a commit where the formula was at the version we want and copy that locally as <code>&lt;package&gt;@&lt;version&gt;.rb</code>.</p>
<p>In this case we want Hugo v0.145.0, so we run <code>brew extract --version=0.145.0 hugo $USER/local</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew extract --version<span class="o">=</span>0.145.0 hugo <span class="nv">$USER</span>/local
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Searching repository history
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Writing formula for hugo at 0.145.0 from revision a110fdb to:
</span></span></span><span class="line"><span class="cl"><span class="go">/opt/homebrew/Library/Taps/nelson/homebrew-local/Formula/hugo@0.145.0.rb
</span></span></span></code></pre></div><h2 id="patch-the-formula">Patch the formula</h2>
<p>This isn&rsquo;t needed for every formula and is something I ran into specifically with Hugo. Without this patch, you&rsquo;ll run into errors.</p>
<p>After running <code>brew extract</code>, edit the file: <code>/opt/homebrew/Library/Taps/$USER/homebrew-local/Formula/hugo@0.145.0.rb</code>.</p>
<p>Change this line:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="nb">system</span> <span class="s2">&#34;go&#34;</span><span class="p">,</span> <span class="s2">&#34;build&#34;</span><span class="p">,</span> <span class="o">*</span><span class="n">std_go_args</span><span class="p">(</span><span class="ss">ldflags</span><span class="p">:,</span> <span class="ss">tags</span><span class="p">:)</span></span></span></code></pre></div><p>To this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="nb">system</span> <span class="s2">&#34;go&#34;</span><span class="p">,</span> <span class="s2">&#34;build&#34;</span><span class="p">,</span> <span class="o">*</span><span class="n">std_go_args</span><span class="p">(</span><span class="ss">output</span><span class="p">:</span> <span class="n">bin</span><span class="o">/</span><span class="s2">&#34;hugo&#34;</span><span class="p">,</span> <span class="ss">ldflags</span><span class="p">:,</span> <span class="ss">tags</span><span class="p">:)</span></span></span></code></pre></div><p>The reason we need to patch this file is because it prevents the error:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">command not found: /opt/homebrew/Cellar/hugo@0.145.0/0.145.0/bin/hugo</span></span></code></pre></div><p>It&rsquo;s a mismatch between the path Homebrew expects (<code>bin/hugo</code>) vs the path that is created when using <code>brew extract</code> on Hugo (<code>bin/hugo@0.145.0</code>).</p>
<h2 id="install-the-older-version">Install the older version</h2>
<p>Now that Hugo is extracted and patched, we can install with <code>brew install hugo@0.145.0</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew install hugo@0.145.0
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ JSON API cask.jws.json
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ JSON API formula.jws.json
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Fetching downloads for: hugo@0.145.0
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ Formula hugo@0.145.0 (0.145.0)
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Installing hugo@0.145.0 from nelson/local
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; go build -o=/opt/homebrew/Cellar/hugo@0.145.0/0.145.0/bin/hugo -tags=extended withdeploy -ldflags=-s -w -X github.com/gohugoio/hugo/common/hugo.commitHash=nelson -X github.com/gohugoio/hugo/common/
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; /opt/homebrew/Cellar/hugo@0.145.0/0.145.0/bin/hugo gen man --dir /opt/homebrew/Cellar/hugo@0.145.0/0.145.0/share/man/man1
</span></span></span><span class="line"><span class="cl"><span class="go">Warning: These files were overwritten during the `brew link` step:
</span></span></span><span class="line"><span class="cl"><span class="go">/opt/homebrew/etc/bash_completion.d/hugo
</span></span></span><span class="line"><span class="cl"><span class="go">.
</span></span></span><span class="line"><span class="cl"><span class="go">.
</span></span></span><span class="line"><span class="cl"><span class="go">.
</span></span></span><span class="line"><span class="cl"><span class="go">/opt/homebrew/share/zsh/site-functions/_hugo
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">They have been backed up to: /Users/nelson/Library/Caches/Homebrew/Backup
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Summary
</span></span></span><span class="line"><span class="cl"><span class="go">🍺  /opt/homebrew/Cellar/hugo@0.145.0/0.145.0: 53 files, 73MB, built in 8 seconds
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Running `brew cleanup hugo@0.145.0`...
</span></span></span><span class="line"><span class="cl"><span class="go">Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
</span></span></span><span class="line"><span class="cl"><span class="go">Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Caveats
</span></span></span><span class="line"><span class="cl"><span class="go">zsh completions have been installed to:
</span></span></span><span class="line"><span class="cl"><span class="go">  /opt/homebrew/share/zsh/site-functions
</span></span></span></code></pre></div><p>Hugo v0.145.0 is now installed. There&rsquo;s a warning with long output in the previous example due to the normal Hugo package being already installed but that is expected. Homebrew is now pointing the <code>hugo</code> binary to v0.145.0 instead of the latest version (v0.160.1 at the time of writing). We can verify with <code>hugo version</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> hugo version
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">hugo v0.145.0+extended+withdeploy darwin/arm64 BuildDate=2025-02-26T15:41:25Z VendorInfo=brew
</span></span></span></code></pre></div><p>We can also see that Hugo v0.145.0 is installed along with the latest version with <code>brew list | grep hugo</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew list <span class="p">|</span> grep hugo
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">hugo
</span></span></span><span class="line"><span class="cl"><span class="go">hugo@0.145.0
</span></span></span></code></pre></div><h2 id="switching-between-versions-with-brew-link">Switching Between Versions with <code>brew link</code></h2>
<p>Currently the <code>hugo</code> command is pointing to v0.145.0. To have it point back to the regular version, run <code>brew unlink hugo &amp;&amp; brew link --overwrite hugo</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew unlink hugo <span class="o">&amp;&amp;</span> brew link --overwrite hugo
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Unlinking /opt/homebrew/Cellar/hugo/0.160.1... 2 symlinks removed.
</span></span></span><span class="line"><span class="cl"><span class="go">Linking /opt/homebrew/Cellar/hugo/0.160.1... 49 symlinks created.
</span></span></span></code></pre></div><p>And if we want <code>hugo</code> to point back to the old version, run <code>brew unlink hugo@0.145.0 &amp;&amp; brew link --overwrite hugo@0.145.0</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew unlink hugo@0.145.0 <span class="o">&amp;&amp;</span> brew link --overwrite hugo@0.145.0
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Unlinking /opt/homebrew/Cellar/hugo@0.145.0/0.145.0... 1 symlinks removed.
</span></span></span><span class="line"><span class="cl"><span class="go">Linking /opt/homebrew/Cellar/hugo@0.145.0/0.145.0... 48 symlinks created.
</span></span></span></code></pre></div><p>At first I expected <code>brew link --overwrite hugo</code> to work right off the bat, but running both <code>brew unlink</code> and <code>brew link --overwrite</code> is necessary to switch between versions properly. This is because Homebrew tracks linked formulas and actual symlinks on disk separately. To help Homebrew track things properly we need to run both <code>brew unlink</code> to clean the records, then <code>brew link --overwrite</code> to write the new symlinks.</p>
<p>There&rsquo;s no need to use <code>brew pin</code> to prevent the older version of Hugo from updating. Since this is a local copy, there is no remote repository that would be updated that would in turn update our local version. You can even try running <code>brew update</code> to see the warning message:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew update
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Updating Homebrew...
</span></span></span><span class="line"><span class="cl"><span class="go">Warning: No remote &#39;origin&#39; in /opt/homebrew/Library/Taps/nelson/homebrew-local, skipping update!
</span></span></span><span class="line"><span class="cl"><span class="go">Already up-to-date.
</span></span></span></code></pre></div><h2 id="removing-the-older-version">Removing the Older Version</h2>
<p>If you no longer need Hugo v0.145.0 you can run <code>brew uninstall hugo@0.145.0</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew uninstall hugo@0.145.0
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Uninstalling /opt/homebrew/Cellar/hugo@0.145.0/0.145.0... (53 files, 73MB)
</span></span></span></code></pre></div><p>If you don&rsquo;t have any other packages you extracted with <code>brew extract</code>, you can also remove your local tap with <code>brew untap $USER/local</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew untap <span class="nv">$USER</span>/local
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Untapping nelson/local...
</span></span></span><span class="line"><span class="cl"><span class="go">Untapped 1 formula (34 files, 36.7KB).
</span></span></span></code></pre></div><p>Finally, if you don&rsquo;t plan on using <code>brew extract</code> again in the future, you can remove the local clone of homebrew-core with <code>brew untap homebrew/core</code>. This will clean up the 1.3GB of files that was downloaded:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew untap homebrew/core
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Untapping homebrew/core...
</span></span></span><span class="line"><span class="cl"><span class="go">Untapped 5 commands and 8313 formulae (8,975 files, 1.3GB).
</span></span></span></code></pre></div><p>Then re-link <code>hugo</code> to the latest version with <code>brew unlink hugo &amp;&amp; brew link hugo</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew unlink hugo <span class="o">&amp;&amp;</span> brew link hugo
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Unlinking /opt/homebrew/Cellar/hugo/0.160.1... 2 symlinks removed.
</span></span></span><span class="line"><span class="cl"><span class="go">Linking /opt/homebrew/Cellar/hugo/0.160.1... 49 symlinks created.
</span></span></span></code></pre></div><h2 id="references">References</h2>
<ul>
<li>

<a href="https://docs.brew.sh/Manpage" target="_blank" rel="noopener">https://docs.brew.sh/Manpage</a></li>
<li>

<a href="https://github.com/orgs/Homebrew/discussions/2941" target="_blank" rel="noopener">https://github.com/orgs/Homebrew/discussions/2941</a></li>
<li>

<a href="https://emmer.dev/blog/installing-old-homebrew-formula-versions/" target="_blank" rel="noopener">https://emmer.dev/blog/installing-old-homebrew-formula-versions/</a></li>
</ul>
]]></content:encoded></item><item><title>Find Unnecessary Homebrew Packages with "brew leaves"</title><link>https://nelson.cloud/find-unnecessary-homebrew-packages-with-brew-leaves/?ref=rss</link><pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate><guid>https://nelson.cloud/find-unnecessary-homebrew-packages-with-brew-leaves/?ref=rss</guid><description>Use the &amp;lsquo;brew leaves&amp;rsquo; command to find potentially unnecessary Homebrew packages.</description><content:encoded><![CDATA[<p>

<a href="https://brew.sh/" target="_blank" rel="noopener">Homebrew</a> has a 

<a href="https://docs.brew.sh/Manpage#leaves---installed-on-request---installed-as-dependency" target="_blank" rel="noopener">&ldquo;brew leaves&rdquo;</a> command that shows all installed packages that are not depended on by other packages. That means that they can be uninstalled without causing issues to other installed Homebrew packages. It&rsquo;s good to regularly run this command to keep Homebrew from getting too bloated.</p>
<p>Here&rsquo;s what my <code>brew leaves</code> output looks like at the time of this writing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew leaves
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">automake
</span></span></span><span class="line"><span class="cl"><span class="go">bat
</span></span></span><span class="line"><span class="cl"><span class="go">black
</span></span></span><span class="line"><span class="cl"><span class="go">coreutils
</span></span></span><span class="line"><span class="cl"><span class="go">ffmpeg
</span></span></span><span class="line"><span class="cl"><span class="go">go
</span></span></span><span class="line"><span class="cl"><span class="go">htop
</span></span></span><span class="line"><span class="cl"><span class="go">hugo
</span></span></span><span class="line"><span class="cl"><span class="go">jq
</span></span></span><span class="line"><span class="cl"><span class="go">libksba
</span></span></span><span class="line"><span class="cl"><span class="go">libpq
</span></span></span><span class="line"><span class="cl"><span class="go">libtool
</span></span></span><span class="line"><span class="cl"><span class="go">libyaml
</span></span></span><span class="line"><span class="cl"><span class="go">node
</span></span></span><span class="line"><span class="cl"><span class="go">openssl@1.1
</span></span></span><span class="line"><span class="cl"><span class="go">pkg-config
</span></span></span><span class="line"><span class="cl"><span class="go">postgresql@14
</span></span></span><span class="line"><span class="cl"><span class="go">python-typing-extensions
</span></span></span><span class="line"><span class="cl"><span class="go">tldr
</span></span></span><span class="line"><span class="cl"><span class="go">tree
</span></span></span><span class="line"><span class="cl"><span class="go">yt-dlp
</span></span></span><span class="line"><span class="cl"><span class="go">zlib
</span></span></span></code></pre></div><p>In my case, I know I don&rsquo;t need the <code>libpq</code> package anymore. So I can remove this package and then run <code>brew leaves</code> again to confirm it&rsquo;s gone.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew remove libpq
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Uninstalling /opt/homebrew/Cellar/libpq/16.1_1... (2,380 files, 29.9MB)
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew leaves
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">automake
</span></span></span><span class="line"><span class="cl"><span class="go">bat
</span></span></span><span class="line"><span class="cl"><span class="go">black
</span></span></span><span class="line"><span class="cl"><span class="go">coreutils
</span></span></span><span class="line"><span class="cl"><span class="go">ffmpeg
</span></span></span><span class="line"><span class="cl"><span class="go">go
</span></span></span><span class="line"><span class="cl"><span class="go">htop
</span></span></span><span class="line"><span class="cl"><span class="go">hugo
</span></span></span><span class="line"><span class="cl"><span class="go">jq
</span></span></span><span class="line"><span class="cl"><span class="go">libksba
</span></span></span><span class="line"><span class="cl"><span class="go">libtool
</span></span></span><span class="line"><span class="cl"><span class="go">libyaml
</span></span></span><span class="line"><span class="cl"><span class="go">node
</span></span></span><span class="line"><span class="cl"><span class="go">openssl@1.1
</span></span></span><span class="line"><span class="cl"><span class="go">pkg-config
</span></span></span><span class="line"><span class="cl"><span class="go">postgresql@14
</span></span></span><span class="line"><span class="cl"><span class="go">python-typing-extensions
</span></span></span><span class="line"><span class="cl"><span class="go">tldr
</span></span></span><span class="line"><span class="cl"><span class="go">tree
</span></span></span><span class="line"><span class="cl"><span class="go">yt-dlp
</span></span></span><span class="line"><span class="cl"><span class="go">zlib
</span></span></span></code></pre></div><p>And now <code>libpq</code> is gone! Try out <code>brew leaves</code> yourself. You may be surprised at the amount of things installed that you may not actually need.</p>
<h2 id="references">References</h2>
<ul>
<li>

<a href="https://docs.brew.sh/Manpage#leaves---installed-on-request---installed-as-dependency" target="_blank" rel="noopener">https://docs.brew.sh/Manpage#leaves---installed-on-request---installed-as-dependency</a></li>
</ul>
]]></content:encoded></item><item><title>How To Install Older Versions of Homebrew Packages</title><link>https://nelson.cloud/how-to-install-older-versions-of-homebrew-packages/?ref=rss</link><pubDate>Tue, 18 Apr 2023 00:00:00 +0000</pubDate><guid>https://nelson.cloud/how-to-install-older-versions-of-homebrew-packages/?ref=rss</guid><description>How to install a specific version of Homebrew packages.</description><content:encoded><![CDATA[<blockquote><p><strong>Warning: This method is outdated!:</strong></p><p>The approach outlined in this post still works in some cases, but as Homebrew has changed, this method has become unreliable. You may run into errors like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Error: Couldn&#39;t find manifest matching bottle checksum.</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Error: An exception occurred within a child process:
</span></span><span class="line"><span class="cl">  NoMethodError: undefined method &#39;user&#39; for nil</span></span></code></pre></div><p>A cleaner approach is <code>brew extract</code>, which copies the historical formula into a local tap so Homebrew has the context it needs. See my newer post instead: 

<a href="https://nelson.cloud/how-to-install-a-specific-version-of-a-homebrew-package-with-brew-extract/" target="_blank" rel="noopener">How to Install a Specific Version of a Homebrew Package with brew extract</a>.</p>
</blockquote>

<p>It&rsquo;s possible to install older versions of Homebrew packages by saving an older version of the corresponding Ruby file locally and running <code>brew install &lt;package&gt;.rb</code>. I&rsquo;ll use the <code>terraform</code> package as an example.</p>
<blockquote><p><strong>tl;dr:</strong></p><p>If I wanted to downgrade to Terraform 1.3.6, I would need to:</p>
<ul>
<li>Find the Ruby file for that specific version of 

<a href="https://github.com/Homebrew/homebrew-core/blob/169f333f93fe0703b542cdf75b1decd4cb78f68d/Formula/terraform.rb" target="_blank" rel="noopener">Terraform on the Homebrew GitHub repo</a></li>
<li>Download the Ruby file</li>
<li>Uninstall the current version of terraform by running <code>brew remove terraform</code></li>
<li>Install the older version defined in the Ruby file by running <code>HOMEBREW_DEVELOPER=true brew install --formulae terraform.rb</code></li>
</ul></blockquote>

<p>Let&rsquo;s say we have <code>terraform</code> version 1.4.5 but we need <code>terraform</code> version 1.3.6. We can start by browsing to 

<a href="https://github.com/Homebrew/homebrew-core/tree/master/Formula" target="_blank" rel="noopener">https://github.com/Homebrew/homebrew-core/tree/master/Formula</a> and try to find the formula for <code>terraform</code> under the <code>t</code> directory.</p>
<blockquote><p><strong>Note:</strong></p>Terraform has since been removed from 

<a href="https://github.com/Homebrew/homebrew-core" target="_blank" rel="noopener">homebrew-core</a> after its 

<a href="https://www.hashicorp.com/en/blog/hashicorp-adopts-business-source-license" target="_blank" rel="noopener">license change</a>, so the <code>blob/master</code> URL no longer exists. I&rsquo;ll be using a Terraform link pinned to a specific commit hash. For any package that is still in homebrew-core, the URL pattern previously described still applies: <code>https://github.com/Homebrew/homebrew-core/blob/master/Formula/&lt;directory-containing-package&gt;/&lt;package-name&gt;.rb</code></blockquote>

<img src="/how-to-install-older-versions-of-homebrew-packages/formulas.webp" alt="List of Homebrew formulas" width="720" height="410" style="max-width: 100%; height: auto; aspect-ratio: 3120 / 1780;" loading="lazy" decoding="async">
<p>Since there are a lot of files here, it&rsquo;s easier to just modify the URL path in the browser. Modify the path based on the directory the command is in: Take the name of the package and append it at the end of the url, adding <code>/&lt;directory-containing-package&gt;/&lt;package-name&gt;.rb</code> to the URL. The <code>.rb</code> is important because all Homebrew packages are defined in Ruby (files with the <code>.rb</code> extension).</p>
<p>In this case, we&rsquo;ll append <code>/t/terraform.rb</code> to the URL like so: 

<a href="https://github.com/Homebrew/homebrew-core/blob/6785b6baa9a6ce18c8230de9e9f0f847547dda9a/Formula/t/terraform.rb" target="_blank" rel="noopener">https://github.com/Homebrew/homebrew-core/blob/6785b6baa9a6ce18c8230de9e9f0f847547dda9a/Formula/t/terraform.rb</a></p>
<p>That URL will then take us to the Ruby file where the <code>terraform</code> Homebrew package is defined.</p>
<img src="/how-to-install-older-versions-of-homebrew-packages/terraform.webp" alt="Terraform Homebrew formula" width="720" height="410" style="max-width: 100%; height: auto; aspect-ratio: 3120 / 1780;" loading="lazy" decoding="async">
<p>Next, click the &ldquo;History&rdquo; link on the upper right above the code, or just click on this link 

<a href="https://github.com/Homebrew/homebrew-core/commits/master/Formula/t/terraform.rb" target="_blank" rel="noopener">https://github.com/Homebrew/homebrew-core/commits/master/Formula/t/terraform.rb</a>. In the next page, scroll down until you see the &ldquo;terraform: update 1.3.6 bottle&rdquo; link. Note that you may need to click on &ldquo;Browse History&rdquo; at the bottom of this page before continuing your search.</p>
<img src="/how-to-install-older-versions-of-homebrew-packages/1.3.6.webp" alt="Commit history for the terraform formula" width="720" height="410" style="max-width: 100%; height: auto; aspect-ratio: 3120 / 1780;" loading="lazy" decoding="async">
<p>Click on the 

<a href="https://github.com/Homebrew/homebrew-core/commit/169f333f93fe0703b542cdf75b1decd4cb78f68d" target="_blank" rel="noopener">terraform: update 1.3.6 bottle</a> link to see this page:</p>
<img src="/how-to-install-older-versions-of-homebrew-packages/commit.webp" alt="Commit for terraform 1.3.6" width="720" height="395" style="max-width: 100%; height: auto; aspect-ratio: 3840 / 2110;" loading="lazy" decoding="async">
<p>On the right side above the code block, click on the three dots, then click on &ldquo;View file&rdquo;.</p>
<img src="/how-to-install-older-versions-of-homebrew-packages/view-file.webp" alt="Three dots menu showing view file link" width="720" height="353" style="max-width: 100%; height: auto; aspect-ratio: 1872 / 918;" loading="lazy" decoding="async">
<p>This will take you to the 

<a href="https://github.com/Homebrew/homebrew-core/blob/169f333f93fe0703b542cdf75b1decd4cb78f68d/Formula/terraform.rb" target="_blank" rel="noopener">package formula for this specific version of terraform</a>.</p>
<img src="/how-to-install-older-versions-of-homebrew-packages/older-terraform.webp" alt="Formula for terraform 1.3.6" width="720" height="395" style="max-width: 100%; height: auto; aspect-ratio: 3840 / 2110;" loading="lazy" decoding="async">
<p>On the upper right side of the code block, click on &ldquo;Raw&rdquo;. This 

<a href="https://raw.githubusercontent.com/Homebrew/homebrew-core/169f333f93fe0703b542cdf75b1decd4cb78f68d/Formula/terraform.rb" target="_blank" rel="noopener">gives us the exact code we need</a> to install Terraform 1.3.6. Save the code locally to a file called <code>terraform.rb</code>. You can manually copy and paste or use <code>curl</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">curl https://raw.githubusercontent.com/Homebrew/homebrew-core/169f333f93fe0703b542cdf75b1decd4cb78f68d/Formula/terraform.rb &gt; terraform.rb</span></span></code></pre></div><p>Then, remove the existing package:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew remove terraform
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Uninstalling /usr/local/Cellar/terraform/1.4.5... (6 files, 69MB)
</span></span></span></code></pre></div><p>Then run <code>brew install</code> but specify the file you saved locally to install the older version. Note that as of 

<a href="https://github.com/Homebrew/brew/releases/tag/4.6.4" target="_blank" rel="noopener">Homebrew version 4.6.4</a> you can no longer install formulae directly from a file. You can get around this by specifying 

<a href="https://github.com/Homebrew/brew/pull/20414" target="_blank" rel="noopener">the environment variable</a> <code>HOMEBREW_DEVELOPER</code>.</p>
<p>So to install Terraform from the file we just downloaded, run <code>HOMEBREW_DEVELOPER=true brew install --formulae terraform.rb</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> <span class="nv">HOMEBREW_DEVELOPER</span><span class="o">=</span><span class="nb">true</span> brew install --formulae terraform.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Fetching downloads for: terraform
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ Bottle Manifest terraform (1.3.6)
</span></span></span><span class="line"><span class="cl"><span class="go">✔︎ Bottle terraform (1.3.6)
</span></span></span><span class="line"><span class="cl"><span class="go">Warning: terraform 1.5.7 is available and more recent than version 1.3.6.
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Pouring terraform--1.3.6.arm64_ventura.bottle.tar.gz
</span></span></span><span class="line"><span class="cl"><span class="go">🍺  /opt/homebrew/Cellar/terraform/1.3.6: 7 files, 64MB
</span></span></span><span class="line"><span class="cl"><span class="go">==&gt; Running `brew cleanup terraform`...
</span></span></span><span class="line"><span class="cl"><span class="go">Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
</span></span></span><span class="line"><span class="cl"><span class="go">Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
</span></span></span></code></pre></div><p>Now <code>terraform</code> version 1.3.6 is installed!</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> terraform version
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Terraform v1.3.6
</span></span></span><span class="line"><span class="cl"><span class="go">on darwin_arm64
</span></span></span></code></pre></div><blockquote><p><strong>Pro Tip:</strong></p><p>You can pin the current version so it doesn&rsquo;t upgrade in the future.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew pin terraform</span></span></code></pre></div><p>The next time you run <code>brew upgrade</code> it will be skipped:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> brew upgrade
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Warning: Not upgrading 1 pinned package:
</span></span></span><span class="line"><span class="cl"><span class="go">terraform 1.5.7
</span></span></span></code></pre></div><p>When you&rsquo;re ready to upgrade, you can unpin it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew unpin terraform</span></span></code></pre></blockquote>

<h2 id="references">References</h2>
<ul>
<li>

<a href="https://docs.brew.sh/Manpage" target="_blank" rel="noopener">https://docs.brew.sh/Manpage</a></li>
<li>

<a href="https://docs.brew.sh/FAQ#how-do-i-stop-certain-formulae-from-being-updated" target="_blank" rel="noopener">https://docs.brew.sh/FAQ#how-do-i-stop-certain-formulae-from-being-updated</a></li>
</ul>
]]></content:encoded></item></channel></rss>