mirror of
https://github.com/gogrlx/snack.git
synced 2026-04-01 20:58:42 -07:00
- Common Manager interface, Package type, functional options - Sentinel errors for common package manager failures - Sub-package stubs for: pacman, aur, apk, apt, dpkg, dnf, rpm, flatpak, snap, pkg (FreeBSD), ports (OpenBSD) - detect/ package for auto-detection of system package manager - 0BSD license
2.8 KiB
2.8 KiB
snack 🍿
Idiomatic Go wrappers for system package managers.
snack provides thin, context-aware Go bindings for system package managers. Think taigrr/systemctl but for package management.
Part of the grlx ecosystem.
Supported Package Managers
| Package | Manager | Platform | Status |
|---|---|---|---|
pacman |
pacman | Arch Linux | 🚧 |
aur |
AUR (makepkg) | Arch Linux | 🚧 |
apk |
apk-tools | Alpine Linux | 🚧 |
apt |
APT (apt-get/apt-cache) | Debian/Ubuntu | 🚧 |
dpkg |
dpkg | Debian/Ubuntu | 🚧 |
dnf |
DNF | Fedora/RHEL | 🚧 |
rpm |
RPM | Fedora/RHEL | 🚧 |
flatpak |
Flatpak | Cross-distro | 🚧 |
snap |
snapd | Cross-distro | 🚧 |
pkg |
pkg(8) | FreeBSD | 🚧 |
ports |
ports/packages | OpenBSD | 🚧 |
detect |
Auto-detection | All | 🚧 |
Install
go get github.com/gogrlx/snack
Usage
package main
import (
"context"
"fmt"
"log"
"github.com/gogrlx/snack"
"github.com/gogrlx/snack/apt"
)
func main() {
ctx := context.Background()
mgr := apt.New()
// Install a package
err := mgr.Install(ctx, []string{"nginx"}, snack.WithSudo(), snack.WithAssumeYes())
if err != nil {
log.Fatal(err)
}
// Check if installed
installed, err := mgr.IsInstalled(ctx, "nginx")
if err != nil {
log.Fatal(err)
}
fmt.Println("nginx installed:", installed)
}
Auto-detection
import "github.com/gogrlx/snack/detect"
mgr, err := detect.Default()
if err != nil {
log.Fatal(err)
}
fmt.Println("Detected:", mgr.Name())
Design
- Thin CLI wrappers — each sub-package wraps a package manager's CLI tools. No FFI, no library bindings.
- Common interface — all managers implement
snack.Manager, making them interchangeable. - Context-aware — all operations accept
context.Contextfor cancellation and timeouts. - Platform-safe — build tags ensure packages compile everywhere but only run where appropriate.
- No root assumption — use
snack.WithSudo()when elevated privileges are needed.
Implementation Priority
- pacman + AUR (Arch Linux)
- apk (Alpine Linux)
- apt + dpkg (Debian/Ubuntu)
- dnf + rpm (Fedora/RHEL)
- flatpak + snap (cross-distro)
- pkg + ports (BSD)
CLI
A companion CLI tool is planned for direct terminal usage:
snack install nginx
snack remove nginx
snack search redis
snack list
snack upgrade
License
0BSD — see LICENSE.