Homebrew / homebrew-bundle

📦 Bundler for non-Ruby dependencies from Homebrew, Homebrew Cask and the Mac App Store.
MIT License
5.26k stars 281 forks source link

--cleanup: "Refusing to untap [tap] because it contains the following installed formulae or casks" #1246

Open MatthiasPortzel opened 11 months ago

MatthiasPortzel commented 11 months ago

My Brewfile contains

tap "sass/sass"
brew "sass/sass/sass"

Sass has a build dependency on dart-lang/dart/dart (src). So in order to install/upgrade/build sass, Homebrew taps dart-lang/dart and installs dart.

When running brew bundle install --cleanup:

This seems like a logic error where dart isn't uninstalled because it's a build dependency, but Brew attempts to untap dart-lang/dart anyways. If I manually uninstall dart and then re-run, Brew will successfully untap.

MikeMcQuaid commented 11 months ago

Good catch. This is a limitation in the tap cleanup logic. https://github.com/Homebrew/homebrew-bundle/blob/f3389cc6ab60a49ae01dfdd343beb937b1f48c55/lib/bundle/commands/cleanup.rb#L137-L142 needs to be updated to consider current_formulae. For now, though, the obvious workaround is to add that tap to your Brewfile as brew bundle dump will just unconditionally dump all of those anyway (and that's what we expect to have as the input to brew bundle cleanup rather than hand-crafted Brewfiles)

MatthiasPortzel commented 11 months ago

In this case, is it correct that dart should be installed at all after the initial build? My first instinct is that since it's not listed in the Brewfile, it should be removed when passed --cleanup. It's weird that dart isn't removed, but also isn't directly installed by the Brewfile (in the case where sass is already installed but dart isn't).

I'm definitely using brew in a way that isn't intended. (Writeup of my workflow.) I've worked around this issue by installing sass through npm -g, but would like to help get brew bundle working more properly, since I use it often.

Edit: Is there a way to list build-dependencies that are currently installed? Build dependencies are handled differently from normal dependencies and I don't really understand how they interact with everything else.

MikeMcQuaid commented 11 months ago

In this case, is it correct that dart should be installed at all after the initial build? My first instinct is that since it's not listed in the Brewfile, it should be removed when passed --cleanup.

It's a dependency so it should not be removed. --cleanup doesn't remove dependencies.

Writeup of my workflow. The reason I ended up with this workflow is that Brew doesn’t remember what packages I’ve installed, vs. have been installed as a dependency of another package.

This is not actually correct, FYI.

Is there a way to list build-dependencies that are currently installed?

brew deps with various flags can do this.

Build dependencies are handled differently from normal dependencies and I don't really understand how they interact with everything else.

They are handled less differently when building from source, like you are here.

MatthiasPortzel commented 11 months ago

Thanks for answering my questions.