![](https://secure.gravatar.com/avatar/8d14e043d3c1f08e23d0a6fbbed1be3e.jpg?s=120&d=mm&r=g)
I would emphasize that setup.py is the way to go. Requirements.txt was only ever intended to be a way for a developer to provide a dependency chain so that other developers could duplicate the environment if necessary. Today's common usage was never originally intended. The `extras_require` that you have discovered is an excellent way of segregating non-installation-required dependencies. On some of my projects, I have built up the following "standard" extras: * all - this is programmatically defined as every dependency including the package itself * dev - this is programmatically defined as every dependency excluding the packge itself * test - all testing dependencies (i.e pytest, coverage, etc.) * docs - all documentation dependences (i.e. sphinx) For onboarding, I typically just then tell someone to use `-e .[all]` for setting up a development environment.