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.txtsubset 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/*.pyintobuild/<function_name>/. - In
deploymode, writes deploy zip artifacts atbuild/<function_name>.zip. - In
deploymode, writes package digest helper file(s) (build/<function_name>.package.sha256by default). - In
testmode, copies relevant tests and runs them in the build target (no zip output). - Uses pinned project
requirements.txt(name==versionlines 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.txtcontaining pinnedname==versionlines. - 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 installedmonopackversion 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.--sha-output: comma-separated package digest outputs for deploy mode (hex,b64; defaulthex).
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==versionlines (comments and blanks allowed). - First-party graph traversal is limited to roots
functions,app, andlibunless inline config adds modules. - Auto-fix only handles
ModuleNotFoundErrorflows and retries up to 3 times when enabled.
Recommended feedback loop for monolith split confidence
- Build the target in test mode with verification enabled:
PYTHONPATH=src python -m monopack <function> --mode test --verify. - Inspect build output (
build/<function>/) and generatedrequirements.txtfor expected scope. - Build deploy artifact once confidence is good:
PYTHONPATH=src python -m monopack <function> --mode deploy. - Optionally gate deploy build with tests:
PYTHONPATH=src python -m monopack <function> --mode deploy --with-tests. - Run repository tests to catch broader regressions:
python -m unittest discover -s tests -v. - 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file monopack-0.1.0.tar.gz.
File metadata
- Download URL: monopack-0.1.0.tar.gz
- Upload date:
- Size: 33.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9830010e0dd4930f038727a5ae6f6bfcb4aa355b435d24848ea81f73968bd3e9
|
|
| MD5 |
e463cb3e6fa19c4352f37a839620171f
|
|
| BLAKE2b-256 |
771d75bd31f0ac2509788ffa6899af5aea821a62fb89506763ffdc37588cc5db
|
File details
Details for the file monopack-0.1.0-py3-none-any.whl.
File metadata
- Download URL: monopack-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aebdf3a27ba7894af58e30c6fb04984e9a47a3cbb1ef27d641d4d62da550fc99
|
|
| MD5 |
3b28276278c0a62ff885643ab1b17e01
|
|
| BLAKE2b-256 |
8aa297ca8386eb50b4363d041ea9f112167827fc683d3ffbfc93fc88933dcbc4
|