Skip to main content

Build focused Python Lambda function bundles from source imports.

Project description

monopack

monopack builds per-function Python Lambda bundles from a monolith-style repo.

Background

Go works well for multi-Lambda projects because one codebase can expose multiple cmd entrypoints and build each function with only what it needs.

Python workflows are usually less ergonomic at that scale:

  • AWS SAM and Serverless framework commonly package one Python artifact per project.
  • Per-function folder layouts can make shared code awkward.
  • Workarounds such as local packages, symlinks, or copied shared folders often add maintenance overhead.

monopack is intended to make Python feel closer to that Go workflow without changing your project into N separate services. It takes a larger codebase and produces per-function zip artifacts by:

  • tracing imports from each function entrypoint,
  • copying reachable first-party files,
  • deriving a minimal pinned requirements.txt subset for third-party imports,
  • installing only that dependency subset into the build target,
  • and running optional verification/tests to increase confidence that each split artifact works in isolation.

It is intentionally conservative: this is import-based trimming with guardrails, not full tree-shaking or whole-program optimization. It aims to cover common Python import patterns used in real projects, while keeping behavior explicit and testable.

What monopack does

  • Builds one or many functions from functions/*.py into build/<function_name>/.
  • In deploy mode, writes deploy zip artifacts at build/<function_name>.zip.
  • In deploy mode, writes package digest helper file(s) (build/<function_name>.package.sha256 by default).
  • In test mode, copies relevant tests and runs them in the build target (no zip output).
  • Uses pinned project requirements.txt (name==version lines only).
  • Supports optional auto-fix for missing-module verification failures (--auto-fix, opt-in).

Quickstart

Project expectations:

  • functions/ directory with function entrypoint files (<name>.py).
  • Project-level requirements.txt containing pinned name==version lines.
  • Optional tests/ directory when using --mode test.

Build one function in deploy mode:

PYTHONPATH=src python -m monopack users_get \
  --functions-dir functions \
  --build-dir build

Run confidence build in test mode:

PYTHONPATH=src python -m monopack users_get \
  --functions-dir functions \
  --build-dir /tmp/monopack-build \
  --mode test

Build all functions discovered in functions/*.py (no target argument):

PYTHONPATH=src python -m monopack \
  --functions-dir functions \
  --build-dir build

CLI usage

Basic form:

PYTHONPATH=src python -m monopack [function_name] [options]

Key flags for real-project usage:

  • --version: prints the installed monopack version and exits.
  • --mode deploy|test: deploy builds runtime payload + zip; test builds payload + tests (no zip).
  • --with-tests: deploy mode only; runs relevant tests before finalizing deploy payload.
  • --verify / --no-verify: verifier is on by default.
  • --auto-fix: opt-in auto-repair loop for missing imports during verify.
  • --debug: emit aggregated import/dependency resolution report to stderr.
  • --jobs: parallel workers for multi-function builds (auto default).
  • --sha-output: comma-separated package digest outputs for deploy mode (hex, b64; default hex).

Package digest output guidance:

  • hex (.package.sha256): general CI/script diffing and human-readable checks.
  • b64 (.package.sha256.b64): Terraform-style workflows that prefer base64 digest values.
  • Use both when needed: --sha-output hex,b64.

For full argument behavior and validation details, see docs/cli.md.

Constraints and limits

  • Function discovery is shallow: only functions/*.py (excluding names starting with _).
  • Function names must use letters, numbers, and underscores; target names cannot include /, \\, or ..
  • Build directory must differ from functions directory and cannot be nested inside it.
  • Requirements parser accepts only pinned name==version lines (comments and blanks allowed).
  • First-party graph traversal follows imports that resolve to local modules under the same project root as functions/ (excluding tests/).
  • Auto-fix only handles ModuleNotFoundError flows and retries up to 3 times when enabled.

Recommended feedback loop for monolith split confidence

  1. Build the target in test mode with verification enabled: PYTHONPATH=src python -m monopack <function> --mode test --verify.
  2. Inspect build output (build/<function>/) and generated requirements.txt for expected scope.
  3. Build deploy artifact once confidence is good: PYTHONPATH=src python -m monopack <function> --mode deploy.
  4. Optionally gate deploy build with tests: PYTHONPATH=src python -m monopack <function> --mode deploy --with-tests.
  5. Run repository tests to catch broader regressions: python -m unittest discover -s tests -v.
  6. Tighten imports/tests/inline config and repeat until scoped build behavior is stable.

Deeper docs

  • CLI reference: docs/cli.md
  • PyPI publishing: docs/publishing.md
  • Fixture-driven confidence loop and matrix: docs/testing-fixtures.md

For Terraform source_code_hash usage with generated package digests, see docs/cli.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

monopack-0.2.2.tar.gz (38.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

monopack-0.2.2-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file monopack-0.2.2.tar.gz.

File metadata

  • Download URL: monopack-0.2.2.tar.gz
  • Upload date:
  • Size: 38.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for monopack-0.2.2.tar.gz
Algorithm Hash digest
SHA256 d48be79f95c5bfbdad549fce24246d37ee1ed7ff3ecf11e93ce4cc691665feb9
MD5 53b34ffe5b3c5bd2f4490ff1933ebaa0
BLAKE2b-256 dc265a047dddde6700d429aa6e67e4bda90875f005e46f38da9cc65a0d0f4365

See more details on using hashes here.

File details

Details for the file monopack-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: monopack-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for monopack-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5d39508b88d077197efc23a983296f6d45180beb8d120de9463dd1eb8374ce46
MD5 9ca5f9657b56eeeae423a08b093413bb
BLAKE2b-256 398f9d46cc88e65b0b31f1e4eff8c80ae809188e281eda454922d4d0e6ce64e8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page