My homebrew story is always something along the lines of:
Me: Please install software A.
Homebrew: In order to install it I will also install 20 libraries (some need to be built from source), update openssl, update Python and wreck all virtual environments. Also since its been a while I decided it must be time to upgrade your other unrelated packages. Enjoy!
I've been using this for a while now, much better versioning system. Great tooling support with multiple backends, fast and information rich CLI. Highly recommended over brew.
Homebrew also takes a wikipedia style approach to package maintenance where any of hundreds of unvetted internet randos can push any unsigned changes they want to all users of that package with no review.
When you install Homebrew you are literally granting access to virtually anyone remote access to your laptop.
Any security leaders in an org that allow Homebrew on workstations used for anything remotely sensitive should be fired.
I have been restricted from disallowing it at some orgs, which is my cue to leave before a major supply chain attack is blamed on me.
As someone for whom Nix and MacPorts are a bit too much of a chore, I find that three things massively improve the Homebrew user experience:
1. If you do Python development, use “uv” or any other Python interpreter-management tool which uses precompiled Python installations from a reputable source. This removes the pain of sorting out compile dependencies for Python itself, as well as solving the “unrelated brew install command trashed all my Python virtualenvs” issue. Whether you use uv or some other Python-version-manager, I hope we can all agree that Brew-managed Python for development, as well as pyenv-compiled Python, are just garbage. As a bonus, “uv” gives you decent reproducibility on a lot of other platforms, if you ever want to develop or share your software to someone on a different version of MacOS or a different OS.
2. ‘export HOMEBREW_NO_AUTO_UPDATE=1’ in all your profiles to turn off the automatic updating of unrelated dependencies. That feature is so stupid. Yes, even given security issues and changing system deps.
3. Keep MacOS updated to current minus one point version, and make sure to fully uninstall/reinstall XCode/XCode CLT every time you update MacOS, and then check “brew doctor” every time you do. I’ve had far too many “brew decides to build from source” situations that boil down to Homebrew detecting my OS or build chain as not up to date with the last 6 months of MacOS updates, or lacking prebuilt artifacts for a very recently-released version.
None of this is a defense or indictment of Homebrew itself. I’m not commenting on whether or not this should be necessary (lord knows I’ve updated into plenty of MacOS misfeature releases just to get Homebrew working again). These are just relatively easy steps that allowed me to forget Homebrew build/install issues entirely.
Nix-Darwin completely broke on my not at all locked down fresh out of the box from Apple work Mac, refusing to uninstall itself even, so I had to wipe and reinstall macOS. (It was a new machine, so it wasn't a huge deal, but I'd really wanted it to work.)
for future reference you should really consider installing it with the determinate nix installer [0] instead. it's multi-platform and among other things creates an install receipt so that changes can be painlessly reverted.
Fairly sure that is what I used, though I remember being confused about whether Determinate Systems was the legit way, or super opinionated not necessarily most supported way, which was going to be least friction/widest adoption, etc.
I remember when homebrew first came out it was pretty snappy and didn't do a bunch of extraneous nonsense. A remarkably precipitous decline in software quality
Except that’s just your opinion, not everyone agrees that it’s "in decline" or does "nonsense". Homebrew is exactly what I want from my desktop package manager: I want everything I install from Homebrew to always be in an evergreen state, I’m ok with everything being in latest and Homebrew forcing package maintainers to work with the latest of their dependencies. This ends up being remarkably stable, and I actually get a looot less of version incompatibilities than when I used Linux (easy because I don’t get any with Homebrew).
If I want a specific version of something I don’t mind using a specific version manager (eg. asdf or mise)
Or the rose-tinted glasses have come off. Homebrew is simultaneously a very impressive "my first package manager" experience as well as a chronically deficient packaging solution.
well, I prefer they added the forced update, since many people never updated it. So when they run brew install X, they got the 2 year old version of X.
Me: Please install software A.
Homebrew: In order to install it I will also install 20 libraries (some need to be built from source), update openssl, update Python and wreck all virtual environments. Also since its been a while I decided it must be time to upgrade your other unrelated packages. Enjoy!