Slide 1

Slide 1 text

@n7cmdr - jreese.sh Taming the Wild West
 Of Python Packaging John Reese
 Production Engineer, Facebook

Slide 2

Slide 2 text

@n7cmdr - jreese.sh Not every user uses `pip install`

Slide 3

Slide 3 text

@n7cmdr - jreese.sh Not every user is a human

Slide 4

Slide 4 text

@n7cmdr - jreese.sh • Internal mirror of PyPI packages • Build wheels from source distributions • Use clean virtualenv and chroot • Support multiple versions of Python • Track packages for vulnerability management

Slide 5

Slide 5 text

@n7cmdr - jreese.sh Not every maintainer is a packager

Slide 6

Slide 6 text

@n7cmdr - jreese.sh • No dependencies • No Python version requirements • No source distribution (wheels only) • No setup.py

Slide 7

Slide 7 text

@n7cmdr - jreese.sh • setuptools is available • Dependencies are already installed • install_requires is good enough

Slide 8

Slide 8 text

@n7cmdr - jreese.sh Not every setup.py sets up everything

Slide 9

Slide 9 text

@n7cmdr - jreese.sh • Packaging guide ignores setup_requires, test_requires • Setuptools has no way to specify C/C++ dependencies • `pip wheel .` fails when `pip install .` doesn’t

Slide 10

Slide 10 text

@n7cmdr - jreese.sh Not every package is difficult

Slide 11

Slide 11 text

@n7cmdr - jreese.sh • Include setup.py • Include long description with markdown • Include tests, inside module namespace • Specify python/setup/test/install requirements

Slide 12

Slide 12 text

@n7cmdr - jreese.sh from setuptools import setup.py setup( name="package", versions="1.0", long_description="", long_description_content_type="text/markdown", author="Your Name", author_email="[email protected]", url="https://github.com/team/package", license="MIT", classifiers=[ "Development Status :: 1 - Planning", "License :: OSI Approved :: MIT License", ], python_requires=">=3.6", setup_requires=["setuptools>=38.6.0"], install_requires=[...], tests_require=[...], packages=["package", "package.tests"], test_suite="package.tests", )

Slide 13

Slide 13 text

@n7cmdr - jreese.sh from setuptools import setup.py setup( name="package", versions="1.0", long_description="", long_description_content_type="text/markdown", author="Your Name", author_email="[email protected]", url="https://github.com/team/package", license="MIT", classifiers=[ "Development Status :: 1 - Planning", "License :: OSI Approved :: MIT License", ], python_requires=">=3.6", setup_requires=["setuptools>=38.6.0"], install_requires=[...], tests_require=[...], packages=["package", "package.tests"], test_suite="package.tests", )

Slide 14

Slide 14 text

@n7cmdr - jreese.sh • Run `setup.py test sdist wheel` from fresh virtualenv • Always upload a source distribution to PyPI • Consider uploading wheels as well

Slide 15

Slide 15 text

@n7cmdr - jreese.sh Not every setup tool is standard

Slide 16

Slide 16 text

@n7cmdr - jreese.sh Not every package should execute arbitrary code to install

Slide 17

Slide 17 text

@n7cmdr - jreese.sh Thanks! John Reese
 Production Engineer, Facebook @n7cmdr github.com/jreese