Since reinstalling certain software packages on my Linux desktop, Linux laptop and Macbook a few times in the past months, I'm positively in love with the Homebrew project. Today I'll share my understanding of its basic deployment modules: casks vs formulae.
What Homebrew does
Homebrew project is the magic behind brew command – it's a software manager that assists with source-code and binary distributions of various software projects.
Specifically, brew is popular on macOS platform where most of software is traditionally installed using graphical user interface (GUI) or via AppleScript automation. Recent versions of macOS exposed a number of relevant interfaces via command line, but average user (and most of advanced users/developers) still had to resort to some enterprise level proprietary delivery and installation mechanism.
With the arrival of Homebrew, things got much easier. A typical software installation is now simpler and quite comparable to the number of steps required in other Unix and Unix-like operating systems:
- You enable relevant software repo
- You install software package
With brew, first install is similar:
- You install Homebrew
- You install software package
But later things get even simpler:
- You simply use brew to install software package
This is mostly due to the fact that Homebrew supports both standard and third-party software using its own centralised approach to software packaging. Application owners define a formula for installing their software, get in touch with Homebrew team to add it to the project, and going forward things happen pretty much automatically.
In Linux world, many software packages are still distributed independently or have to make their way into a specific application/software store – so many small projects are hard to find.
brew formula
Each Open Source package integrated with Homebrew is configured using a brew formula. It's a Ruby language based configuration file that explains how the software can be downloaded from GitHub or similar repository and then compiled.
Here's a formula for htop command:
class Htop < Formula desc "Improved top (interactive process viewer)" homepage "https://hisham.hm/htop/" url "https://hisham.hm/htop/releases/2.2.0/htop-2.2.0.tar.gz" sha256 "d9d6826f10ce3887950d709b53ee1d8c1849a70fa38e91d5896ad8cbc6ba3c57" revision 1 bottle do cellar :any sha256 "c06ff60960f64f5c8395f53d7419cbcce2a22ee87f0cb0138352c8a88111d21c" => :catalina sha256 "77aa302765353b4085dcad52356d3264183e06310dda8d5bac64642299ea2902" => :mojave sha256 "0ebfb655b91566ba31f8effc94d642a43305ff95bdc9b30b46fadc132e2ced0c" => :high_sierra sha256 "ed93b86f011de155c5d261b8c9cc9cb81fd0017667bf3ebe26ee090716bcd650" => :sierra end head do url "https://github.com/hishamhm/htop.git" depends_on "autoconf" => :build depends_on "automake" => :build depends_on "libtool" => :build end depends_on "pkg-config" => :build depends_on "ncurses" # enables mouse scroll def install system "./autogen.sh" if build.head? system "./configure", "--prefix=#{prefix}" system "make", "install" end def caveats; <<~EOS htop requires root privileges to correctly display all running processes, so you will need to run `sudo htop`. You should be certain that you trust any software you grant root privileges. EOS end test do pipe_output("#{bin}/htop", "q", 0) end end
brew install
Installing software from brew formulae is easy:
$ brew install htop
brew cask
brew cask is an extension to standard brew based software management, it's a type of formula that documents the process of installing a graphical application (and not entirely coincidentally closed-source software).
Similar to brew formula, cask defines where software can be downloaded and what dependenices it has, but specification is so flexible that you can even download binary packages from developer websites. If it's a paid project, you'll probably get a chance to download a trial copy (that you later can enable using a valid serial number for that software).
Here's brew cask for my password manager of choice, 1Password:
cask '1password' do version '7.4' sha256 'e6b26726d2e67fa33f0a3dadd84fab8d7a2b0a7b281b3d55a62cd7b226080f91' url "https://c.1password.com/dist/1P/mac#{version.major}/1Password-#{version}.zip" appcast "https://app-updates.agilebits.com/product_history/OPM#{version.major}" name '1Password' homepage 'https://1password.com/' auto_updates true depends_on macos: '>= :sierra' app "1Password #{version.major}.app" zap trash: [ "~/Library/Application Scripts/2BUA8C4S2C.com.agilebits.onepassword#{version.major}-helper", "~/Library/Application Scripts/com.agilebits.onepassword#{version.major}", "~/Library/Application Scripts/com.agilebits.onepassword#{version.major}-launcher", '~/Library/Application Scripts/com.agilebits.onepasswordnativemessaginghost', "~/Library/Containers/2BUA8C4S2C.com.agilebits.onepassword#{version.major}-helper", "~/Library/Containers/com.agilebits.onepassword#{version.major}", "~/Library/Containers/com.agilebits.onepassword#{version.major}-launcher", '~/Library/Containers/com.agilebits.onepasswordnativemessaginghost', '~/Library/Group Containers/2BUA8C4S2C.com.agilebits', '~/Library/Logs/1Password', "~/Library/Preferences/com.agilebits.onepassword#{version.major}.plist", ] end
brew cask install
Installing brew casks is easy:
$ brew cask install 1password
That's all I wanted to explain today. Let me know if you have any questions!
Leave a Reply