Skip to content

Package Management

fscm provides cross-platform package management that automatically uses the right package manager for your system.

Basic Usage

import fscm

# Install a single package
fscm.s.pkgs_install("nginx")

# Install multiple packages
fscm.s.pkgs_install("nginx", "certbot", "python3")

# Space-separated packages also work
fscm.s.pkgs_install("nginx certbot python3")

System Detection

fscm automatically detects your operating system:

import fscm

# Check what system was detected
print(type(fscm.s))  # Debian, Arch, or MacOS

# Manual detection
system = fscm.detect_system()
print(system)  # <Debian>, <Arch>, or <MacOS>
System Package Manager Notes
Debian/Ubuntu apt-get Runs apt-get update first
Arch Linux pacman Uses pacman -Sy
macOS Homebrew Uses brew install

Package Operations

Install Packages

import fscm

# Install with sudo (default for apt/pacman)
fscm.s.pkgs_install("nginx", sudo=True)

# Check what would be installed
fscm.settings.dry_run = True
fscm.s.pkgs_install("nginx")  # Shows but doesn't install

Check If Installed

import fscm

if fscm.s.pkg_is_installed("nginx"):
    print("nginx is already installed")
else:
    fscm.s.pkgs_install("nginx")

Get Installed Version

import fscm

version = fscm.s.pkg_get_installed_version("nginx")
if version:
    print(f"nginx version: {version}")
else:
    print("nginx is not installed")

Platform-Specific Packages

Sometimes package names differ between platforms:

import fscm

# Map package names per platform
PACKAGES = {
    "debian": ["nginx", "python3-dev", "libssl-dev"],
    "arch": ["nginx", "python", "openssl"],
    "macos": ["nginx", "python@3.11", "openssl"],
}

# Install for current platform
if isinstance(fscm.s, fscm.Debian):
    fscm.s.pkgs_install(*PACKAGES["debian"])
elif isinstance(fscm.s, fscm.Arch):
    fscm.s.pkgs_install(*PACKAGES["arch"])
elif isinstance(fscm.s, fscm.MacOS):
    fscm.s.pkgs_install(*PACKAGES["macos"])

Arch Linux: AUR Packages

For Arch User Repository packages:

import fscm

# Assuming system is Arch
if isinstance(fscm.s, fscm.Arch):
    fscm.s.install_from_aur(
        command="yay",  # Command to check for
        git_url="https://aur.archlinux.org/yay.git"
    )

Python Packages (pip)

fscm includes pip management:

import fscm

# Install pip packages
pip = fscm.Pip()
pip.install("requests", "flask")

# Install specific version
pip.install("django==4.2")

# Install from requirements file
fscm.run("pip install -r requirements.txt")

Virtual Environments

import fscm

# Create and use a virtualenv
fscm.run("python3 -m venv /opt/myapp/venv")

# Install in virtualenv
fscm.run("/opt/myapp/venv/bin/pip install -r requirements.txt")

Idempotency

Package installation is idempotent:

import fscm

# First call: installs nginx
fscm.s.pkgs_install("nginx")  # PkgAdd recorded

# Second call: no-op
fscm.s.pkgs_install("nginx")  # No change (already installed)

Change Tracking

import fscm

fscm.s.pkgs_install("nginx", "certbot")

# Check what was installed
for change in fscm.CHANGELIST:
    if isinstance(change, fscm.PkgAdd):
        print(f"Installed: {change.name} ({change.version})")

Example: Web Server Setup

import fscm

def setup_webserver():
    """Install and configure a web server."""
    # Install packages
    packages = ["nginx", "certbot", "python3-certbot-nginx"]
    fscm.s.pkgs_install(*packages, sudo=True)

    # Verify installation
    for pkg in packages:
        if fscm.s.pkg_is_installed(pkg):
            version = fscm.s.pkg_get_installed_version(pkg)
            print(f"  {pkg}: {version}")

    # Enable and start nginx
    fscm.run("systemctl enable nginx", sudo=True)
    fscm.run("systemctl start nginx", sudo=True)

Example: Development Environment

import fscm

def setup_dev_environment():
    """Set up a Python development environment."""
    # System packages
    if isinstance(fscm.s, fscm.Debian):
        fscm.s.pkgs_install(
            "python3", "python3-pip", "python3-venv",
            "build-essential", "libffi-dev", "libssl-dev"
        )
    elif isinstance(fscm.s, fscm.Arch):
        fscm.s.pkgs_install(
            "python", "python-pip",
            "base-devel", "libffi", "openssl"
        )

    # Create project virtualenv
    project_dir = "/opt/myproject"
    fscm.mkdir(project_dir)
    fscm.run(f"python3 -m venv {project_dir}/venv")

    # Install Python packages
    fscm.run(f"{project_dir}/venv/bin/pip install --upgrade pip")
    fscm.run(f"{project_dir}/venv/bin/pip install wheel setuptools")

Building Python from Source

For specific Python versions, use the contrib module:

from fscm.contrib.python import install_python3

# Install Python 3.11.5 from source
install_python3("3.11.5")

This: 1. Downloads Python source 2. Installs build dependencies 3. Compiles and installs 4. Creates symlinks

Next Steps