// the find
pydoit/doit
CLI task management & automation tool
doit is a Make-like task runner where tasks are defined as Python dicts and functions in a dodo.py file. It tracks file hashes (not just timestamps), skips up-to-date tasks, and handles dynamic dependency graphs. Aimed at Python developers who want a build system without leaving Python or learning a DSL.
Incremental execution is based on file content hashing by default, not mtime — avoids the classic Make gotcha where touching a file triggers unnecessary rebuilds. The calc_dep feature lets tasks compute their own dependencies at runtime, which handles generated-file scenarios cleanly without hacks. Plugin architecture is real: custom commands, reporters, backends, and task loaders all have defined extension points. Test coverage looks thorough — one test file per module, including a Dockerfile for isolation.
2064 stars after 16+ years is a small audience for a general-purpose build tool; it never broke out of the Python data-science niche, which limits community momentum and third-party integrations. Task definitions as raw dicts are error-prone — typo a key like 'file_deps' instead of 'file_dep' and doit silently ignores it with no validation error. Parallel execution uses multiprocessing/threading but there's no built-in distributed execution or worker pool concept, so large DAGs on a single machine hit real limits. The dependency backend is SQLite by default, which means concurrent doit invocations from multiple processes on the same project will corrupt state.