Cookbook Examples¶
Practical examples demonstrating how to use FlavorPack for various packaging scenarios.
๐ค AI-Generated Content
This documentation was generated with AI assistance and is still being audited. Some, or potentially a lot, of this information may be inaccurate. Learn more.
Examples Need Verification
These cookbook examples demonstrate FlavorPack's intended usage patterns. However, some advanced configuration options shown here (such as [tool.flavor.slots] arrays, [tool.flavor.targets], and [tool.flavor.environment] tables) may not yet be fully implemented.
Verified to work:
- Basic pyproject.toml with [tool.flavor] and entry_point
- [project.scripts] definitions
- Simple packaging with flavor pack
Needs verification (may not be implemented):
- [tool.flavor.slots.*] configuration
- [tool.flavor.environment] table
- [tool.flavor.targets] multi-platform builds
- --compress, --jobs CLI flags
Before relying on any example, test it with your FlavorPack installation. If a configuration option doesn't work, check the current manifest documentation for supported options.
Quick Examples¶
Minimal Package¶
The simplest possible PSPF package.
# pyproject.toml
[project]
name = "hello-world"
version = "1.0.0"
description = "Minimal FlavorPack example"
requires-python = ">=3.11"
[tool.flavor]
entry_point = "hello:main"
CLI Application¶
Package a Click-based CLI application.
# pyproject.toml
[project]
name = "myapp"
version = "2.0.0"
description = "CLI application example"
requires-python = ">=3.11"
dependencies = [
"click>=8.0",
"rich>=13.0"
]
[tool.flavor]
entry_point = "myapp.cli:main"
strip_binaries = true
# myapp/cli.py
import click
from rich.console import Console
console = Console()
@click.command()
@click.option("--name", default="World", help="Name to greet")
@click.option("--color", default="green", help="Text color")
def main(name: str, color: str):
"""A friendly CLI application."""
console.print(f"Hello, {name}!", style=f"bold {color}")
if __name__ == "__main__":
main()
# Build with progress
flavor pack --progress --strip
# Run with options
./dist/myapp.psp --name "FlavorPack" --color blue
Web Application¶
Package a FastAPI web application.
# pyproject.toml
[project]
name = "webapi"
version = "1.0.0"
description = "FastAPI web application"
requires-python = ">=3.11"
dependencies = [
"fastapi>=0.100",
"uvicorn[standard]>=0.23"
]
[tool.flavor]
entry_point = "webapi.app:run"
strip_binaries = true
[tool.flavor.environment]
PORT = "8000"
HOST = "0.0.0.0"
# webapi/app.py
import os
from fastapi import FastAPI
import uvicorn
app = FastAPI(title="FlavorPack API")
@app.get("/")
def read_root():
return {"message": "Hello from FlavorPack!", "version": "1.0.0"}
@app.get("/health")
def health_check():
return {"status": "healthy"}
def run():
"""Entry point for packaged application."""
port = int(os.getenv("PORT", 8000))
host = os.getenv("HOST", "0.0.0.0")
uvicorn.run(app, host=host, port=port)
if __name__ == "__main__":
run()
# Build and run
flavor pack --key-seed "api-key-123"
./dist/webapi.psp
# API is now available at http://localhost:8000
Data Science Package¶
Package a data science application with NumPy and Pandas.
# pyproject.toml
[project]
name = "datasci"
version = "1.0.0"
description = "Data science application"
requires-python = ">=3.11"
dependencies = [
"pandas>=2.0",
"numpy>=1.24",
"matplotlib>=3.7",
"scikit-learn>=1.3"
]
[tool.flavor]
entry_point = "datasci.analyze:main"
strip_binaries = true
[tool.flavor.slots.data]
path = "data/"
lifecycle = "persistent"
purpose = "input-data"
# datasci/analyze.py
import sys
import pandas as pd
import numpy as np
from pathlib import Path
def main():
"""Analyze data from package."""
# Data is extracted alongside the package
data_path = Path(sys.argv[0]).parent / "data" / "dataset.csv"
if data_path.exists():
df = pd.read_csv(data_path)
print(f"Dataset shape: {df.shape}")
print(f"Columns: {list(df.columns)}")
print(f"\nSummary statistics:")
print(df.describe())
else:
print("Creating sample data...")
df = pd.DataFrame({
'x': np.random.randn(100),
'y': np.random.randn(100)
})
print(f"Generated {len(df)} samples")
print(df.head())
if __name__ == "__main__":
main()
Advanced Examples¶
Multi-Platform Package¶
Build packages for multiple platforms.
# pyproject.toml
[project]
name = "crossplatform"
version = "1.0.0"
requires-python = ">=3.11"
[tool.flavor]
entry_point = "app:main"
[tool.flavor.targets]
linux-x64 = { platform = "linux", arch = "amd64" }
macos-arm64 = { platform = "darwin", arch = "arm64" }
windows-x64 = { platform = "windows", arch = "amd64" }
# Build for all targets
flavor pack --output dist/app-linux.psp --target linux-x64
flavor pack --output dist/app-macos.psp --target macos-arm64
flavor pack --output dist/app-windows.psp --target windows-x64
Signed Package with Verification¶
Create cryptographically signed packages.
# 1. Generate key pair
flavor keygen --out-dir keys/
# 2. Build signed package
flavor pack \
--private-key keys/private.pem \
--public-key keys/public.pem \
--output signed-app.psp
# 3. Distribute public key separately
cp keys/public.pem public-key.pem
# 4. Users verify before running
flavor verify signed-app.psp --public-key public-key.pem
./signed-app.psp
Package with Custom Slots¶
Include additional resources as slots.
# pyproject.toml
[project]
name = "slotted"
version = "1.0.0"
[tool.flavor]
entry_point = "app:main"
[tool.flavor.slots.config]
path = "config/settings.json"
lifecycle = "volatile"
purpose = "configuration"
[tool.flavor.slots.assets]
path = "assets/"
lifecycle = "persistent"
purpose = "static-resources"
operations = "gzip"
[tool.flavor.slots.templates]
path = "templates/"
lifecycle = "lazy"
purpose = "templates"
Development vs Production Builds¶
Different configurations for development and production.
# Development build (fast, no verification)
flavor pack \
--no-verify \
--output dev.psp \
--key-seed "dev-seed"
# Production build (optimized, signed)
flavor pack \
--strip \
--private-key prod-keys/private.pem \
--public-key prod-keys/public.pem \
--output prod.psp \
--progress
Integration Examples¶
CI/CD with GitHub Actions¶
# .github/workflows/package.yml
name: Build Package
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install FlavorPack
run: pip install flavor
- name: Build package
run: |
flavor pack \
--strip \
--key-seed "${{ secrets.PACKAGE_KEY }}" \
--output dist/app-${{ github.ref_name }}.psp
- name: Verify package
run: flavor verify dist/app-*.psp
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: package
path: dist/*.psp
Docker Integration¶
# Dockerfile
FROM python:3.11-slim as builder
WORKDIR /app
COPY . .
RUN pip install flavor
RUN flavor pack --strip --output app.psp
FROM scratch
COPY --from=builder /app/app.psp /app.psp
ENTRYPOINT ["/app.psp"]
Makefile Automation¶
# Makefile
.PHONY: build clean test package
VERSION := $(shell grep version pyproject.toml | cut -d'"' -f2)
PACKAGE := myapp-$(VERSION).psp
build:
flavor pack --output dist/$(PACKAGE)
clean:
flavor clean --all --yes
rm -rf dist/
test:
pytest tests/
flavor pack --no-verify --output test.psp
./test.psp --help
release: clean test
flavor pack \
--strip \
--key-seed "$(RELEASE_KEY)" \
--output dist/$(PACKAGE)
flavor verify dist/$(PACKAGE)
Troubleshooting Examples¶
Debug Package Contents¶
# Inspect package structure
flavor inspect problematic.psp
# Extract all slots for examination
flavor extract-all problematic.psp --output-dir debug/
# Check specific slot
flavor extract problematic.psp metadata.json --output debug-meta.json
cat debug-meta.json | jq '.'
Verbose Logging¶
# Maximum verbosity for debugging
flavor --log-level trace pack
# Debug verification issues
flavor --log-level debug verify package.psp
Environment Debugging¶
# Check FlavorPack environment
env | grep FLAVOR
# Test with clean environment
env -i HOME=$HOME PATH=$PATH flavor pack
# Override cache location
FLAVOR_CACHE_DIR=/tmp/flavor-cache flavor pack
Performance Examples¶
Optimized Builds¶
# Strip binaries and compress
flavor pack --strip --compress 9
# Parallel building (when available)
flavor pack --jobs 4
# Skip verification for speed
flavor pack --no-verify
Caching Strategies¶
# Pre-cache dependencies
pip download -r requirements.txt -d pip-cache/
# Use local package index
PIP_INDEX_URL=file:///path/to/pip-cache flavor pack
Next Steps¶
- Review the API Reference for detailed function documentation
- Check the CLI Reference for all command options
- Read the Package Format Specification for technical details
- See Troubleshooting Guide for common issues