Poetry's dependencies divide into 2 groups and both of them can be optional or required:
- Development
- Production
Production dependencies are installed when your library is installed by a user (usually package is installed from PyPI)
Development dependencies are installed when your library is installed by a contributor with purpose of adding new feature to your library (always package is installed from source, i.e from GitHub)
All dependencies' information is stored in pyproject.toml
file. The dependencies' source code is in the .venv
folder
How does optional dependencies work?
All optional dependencies divide into groups by a developer
For example, some dependencies are required to build documentation. You can view dev-docs
group of dependencies in pyproject.toml
. If you need to install only them as optional you can execute this
pip install library[dev-docs]
Separate by a comma optional dependencies in brackets ([]
)
Anyway, you do not need to install any development dependencies when you install a package
from PyPI
as a user. It's for an example
Any group from dev dependencies could be also installed with make
out of library source
make install-dev-docs
Why the template does not use dev-dependencies
section?
Because now Poetry does not support dev-dependencies
with extras.
The template have many development dependencies and full installation of them
takes quite long time so division is required
Check out this:
Install the project from source in development mode
make install-dev-all
will install all development dependencies. If you need only a part of them, check out the Makefile
and find a command for your purpose
Install the project from source in production mode
make install-production
will install only required dependencies and the library should be ready for usage
Feature
You can add the library code as dependency as Git Submodule
Add a non-optional dependency
For example, you want to add a requests
as dependency for project, so it should be installed when your library is installed
poetry add requests
requests
will be installed too
Add an optional dependency
For example, you want to optimize JSON parsing in your project with orjson
library (as it is written on Rust and requires rustc
). You can do not force user install orjson
and keep orjson
as optional
poetry add orjson --optional
Your pyproject.toml
looks like this
...
[tool.poetry.dependencies]
orjson = {optional = true, version="^3.6.5"}
...
And now add the dependency to a new group. Let's call it fast-json
[tool.poetry.extras]
# Ordinary extra dependencies
all = []
# Fast and optimized JSON parsers
fast-json = ["orjson"]
...
It's a good practice to unite all your optional dependencies into a all
group so add it there too
[tool.poetry.extras]
# Ordinary extra dependencies
all = ["orjson"]
# Fast and optimized JSON parsers
fast-json = ["orjson"]
...
Add a non-optional dev dependency
poetry add pytest --dev
pytest
will be installed every time your library is installed in development mode
Add an optional dev dependency
poetry add pytest-asyncio --optional
extra
section in another way.
All optional development dependencies groups marked with prefix dev-
. So our pytest-asyncio
should be addd in such groups.
Check out pyproject.toml
. There is an existed group of optional dependencies used for testing (as pytest-asyncio
too)
[tool.poetry.extra]
...
dev-test = ["pytest", "pytest-cov", "coveralls", "coverage"]
Now put it here
[tool.poetry.extra]
...
dev-test = ["pytest-asyncio", "pytest", "pytest-cov", "coveralls", "coverage"]
And there is also a dev-all
group that need to be modified
[tool.poetry.extra]
...
dev-test = ["pytest-asyncio", "pytest", "pytest-cov", "coveralls", "coverage"]
...
dev-all = [
"black", "isort", "pre-commit",
"pytest", "pytest-cov", "pytest-asyncio"
"coveralls", "coverage",
"mypy",
"bumpversion",
"autoflake",
"mkdocs", "mkdocs-material", "mike"
]