Environments, Packaging and Deployment ###################################### Main point * Standard Project Structure * Libraries VS Apps * Poetry for Dependency Management * Poetry for Building and Publishing to PyPi-compatible services * Continuous Testing Workflows * Deployment: Github, Custom PyPi Repos, Docker Images Poetry Setup ************ .. code-block:: bash # switch to super user if needed # sudo su # essential python packages apt update && apt install python3 python3-venv python-is-python3 # some libraries might need this apt update && apt install python3-dev mkdir -p /poetry export POETRY_HOME=/poetry export POETRY_VERSION=1.1.13 curl -sSL https://install.python-poetry.org | python3 - --version $POETRY_VERSION # allows multiple system user to share the same installation ln -sf /poetry/bin/poetry /usr/local/bin # bash completions mkdir -p /etc/bash_completion.d poetry completions bash | tee /etc/bash_completion.d/poetry # poetry config ################ # keep venv localized to allowed for root ownership and regular user to run poetry config virtualenvs.in-project true # Configure private repository "plataux" with username "mk" and given password poetry config http-basic.plataux mk '12d@#F34g' # setting the repo in pyproject.toml like so # [[tool.poetry.source]] # name = "plataux" # url = "https://pypi.tpad.plataux.com" Poetry Dependency Spec ********************** https://python-poetry.org/docs/dependency-specification/ .. code-block:: toml # pyproject.toml [tool.poetry.dependencies] # Get the latest revision on the branch named "next" requests = { git = "https://github.com/kennethreitz/requests.git", branch = "next" } # Get a revision by its commit hash flask = { git = "https://github.com/pallets/flask.git", rev = "38eb5d3b" } # Get a revision by its tag numpy = { git = "https://github.com/numpy/numpy.git", tag = "v0.13.2" } # for private repos, you can use the SSH URL instead cocktail = {git = "git@github.com:plataux/cocktail.git", branch = "main"} # For optional packages aiohttp = { version = "^3.8", extras = [ "speedups" ] } uvicorn = { version = "^0.17", extras = [ "standard" ] } # URL Dependency my-package = { url = "https://example.com/my-package-0.1.0.tar.gz" } # Other Examples gunicorn = "^20.1" uvloop = "*" Other Poetry Docs ***************** https://python-poetry.org/docs/pyproject/ a Makefile to authenticate, re-build and publish to private repo .. code-block:: Makefile # Makefile SHELL=/bin/bash clean: rm -f dist/* publish: clean # this is redundant, we don't need to provide basic-auth details each time @poetry config http-basic.plataux mk '12d@#F34g' poetry build @poetry publish -q -r plataux || echo "this version has already been published"