Een uitgebreide gids voor het distribueren van Python-packages via PyPI, inclusief best practices voor versiebeheer, tools en workflows voor wereldwijde ontwikkelaars.
Distributie van Python-packages: Publiceren op PyPI en Versiebeheer
Het uitgebreide ecosysteem van Python wordt aangedreven door een enorme verzameling packages die direct beschikbaar zijn via de Python Package Index (PyPI). Deze gids biedt een compleet overzicht van hoe u uw eigen Python-packages kunt distribueren via PyPI, zodat ze toegankelijk zijn voor ontwikkelaars wereldwijd. We verkennen de essentiële tools, best practices voor versiebeheer en de workflows voor het creëren en publiceren van hoogwaardige Python-packages.
Waarom uw Python-package distribueren?
Het distribueren van uw Python-package biedt tal van voordelen:
- Deel uw werk: Stelt andere ontwikkelaars in staat om uw code gemakkelijk te hergebruiken, wat samenwerking en innovatie bevordert. Stelt u zich een wereldwijd team voor dat uw gespecialiseerde data-analysetools, gebouwd in Python, gebruikt.
- Beheer van afhankelijkheden: Vereenvoudigt het proces van het beheren van afhankelijkheden in andere projecten. Uw package kan met één commando worden geïnstalleerd, samen met al zijn afhankelijkheden.
- Bijdrage aan open source: Stelt u in staat bij te dragen aan de open-sourcegemeenschap en erkenning te krijgen voor uw werk. Veel kritieke softwarecomponenten zijn open-source packages die door ontwikkelaars wereldwijd worden onderhouden.
- Versiebeheer en updates: Biedt een gestructureerde manier om versies te beheren, updates uit te brengen en bugfixes aan te pakken. Dit zorgt ervoor dat gebruikers altijd toegang hebben tot de nieuwste en meest betrouwbare versie van uw package.
- Eenvoudige installatie: Vereenvoudigt de installatie voor gebruikers via `pip install uw-package-naam`.
Essentiële tools voor de distributie van Python-packages
Verschillende tools zijn essentieel voor het creëren en distribueren van Python-packages:
- setuptools: Een veelgebruikte bibliotheek voor het definiëren van metadata van packages, waaronder naam, versie, afhankelijkheden en entry points. Het is de de facto standaard voor het packagen van Python-projecten.
- wheel: Een distributieformaat dat een efficiënter en betrouwbaarder installatieproces biedt in vergelijking met brondistributies. Wheels zijn vooraf gebouwde distributies die kunnen worden geïnstalleerd zonder compilatie.
- twine: Een tool voor het veilig uploaden van uw package naar PyPI. Twine versleutelt uw inloggegevens en package-data tijdens de overdracht, wat beschermt tegen afluisteren en man-in-the-middle-aanvallen.
- venv/virtualenv: Dit zijn tools voor het creëren van geïsoleerde Python-omgevingen. Het gebruik van virtuele omgevingen is cruciaal voor het beheren van afhankelijkheden en het vermijden van conflicten tussen verschillende projecten.
Uw project opzetten
Voordat u uw package kunt distribueren, moet u uw project correct structureren.
Voorbeeld van projectstructuur
my_package/ ├── my_package/ │ ├── __init__.py │ ├── module1.py │ └── module2.py ├── tests/ │ ├── __init__.py │ ├── test_module1.py │ └── test_module2.py ├── README.md ├── LICENSE ├── setup.py └── .gitignore
Uitleg:
- my_package/: De hoofdmap met de broncode van uw package.
- my_package/__init__.py: Maakt de map `my_package` een Python-package. Het kan leeg zijn of initialisatiecode bevatten.
- my_package/module1.py, my_package/module2.py: Uw Python-modules die de daadwerkelijke code bevatten.
- tests/: Een map met uw unit tests. Het is cruciaal om tests te schrijven om de kwaliteit en betrouwbaarheid van uw package te waarborgen.
- README.md: Een Markdown-bestand met een beschrijving van uw package, gebruiksinstructies en andere relevante informatie. Dit is vaak het eerste wat gebruikers zien op PyPI.
- LICENSE: Een bestand met de licentie waaronder uw package wordt gedistribueerd (bijv. MIT, Apache 2.0, GPL). Het kiezen van een geschikte licentie is essentieel om te specificeren hoe anderen uw code kunnen gebruiken.
- setup.py: Het hoofdconfiguratiebestand dat de metadata en bouwinstructies van uw package definieert.
- .gitignore: Specificeert bestanden en mappen die door Git genegeerd moeten worden (bijv. tijdelijke bestanden, build-artefacten).
Het `setup.py`-bestand aanmaken
Het `setup.py`-bestand is het hart van uw package-distributie. Het bevat metadata over uw package en instructies voor het bouwen en installeren ervan. Hier is een voorbeeld:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="my_package", # Vervang door de naam van je package
version="0.1.0",
author="Your Name", # Vervang door je naam
author_email="your.email@example.com", # Vervang door je e-mailadres
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/yourusername/my_package", # Vervang door de URL van je repository
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Voorbeeld van een afhankelijkheid
],
)
Uitleg:
- name: De naam van uw package, die op PyPI zal worden gebruikt. Kies een unieke en beschrijvende naam.
- version: Het versienummer van uw package. Volg semantisch versioneren (zie hieronder).
- author, author_email: Uw naam en e-mailadres.
- description: Een korte beschrijving van uw package.
- long_description: Een langere, meer gedetailleerde beschrijving, meestal gelezen uit uw `README.md`-bestand.
- long_description_content_type: Specificeert het formaat van uw lange beschrijving (bijv. "text/markdown").
- url: De URL van de homepage van uw package (bijv. GitHub-repository).
- packages: Een lijst met packages die in uw distributie moeten worden opgenomen. `setuptools.find_packages()` ontdekt automatisch alle packages in uw project.
- classifiers: Metadata die gebruikers helpt uw package te vinden op PyPI. Kies geschikte classifiers uit de lijst van Trove Classifiers. Overweeg classifiers op te nemen voor ondersteunde Python-versies, besturingssystemen en licenties.
- python_requires: Specificeert de minimaal vereiste Python-versie om uw package te gebruiken.
- install_requires: Een lijst van afhankelijkheden die uw package vereist. Deze afhankelijkheden worden automatisch geĂŻnstalleerd wanneer uw package wordt geĂŻnstalleerd.
Versiebeheer: Semantisch Versioneren
Semantisch Versioneren (SemVer) is een wijdverbreid versioneringsschema dat een duidelijke en consistente manier biedt om de aard van wijzigingen in uw package te communiceren.
Een SemVer-versienummer bestaat uit drie delen: MAJOR.MINOR.PATCH.
- MAJOR: Wordt verhoogd wanneer u incompatibele API-wijzigingen aanbrengt. Dit duidt op een significante verandering die kan vereisen dat gebruikers hun code bijwerken.
- MINOR: Wordt verhoogd wanneer u functionaliteit toevoegt op een backwards-compatibele manier. Dit betekent nieuwe functies of verbeteringen die bestaande code niet breken.
- PATCH: Wordt verhoogd wanneer u backwards-compatibele bugfixes doorvoert. Dit is voor kleine reparaties die geen nieuwe functies toevoegen of bestaande functionaliteit breken.
Voorbeelden:
- 1.0.0: Eerste release.
- 1.1.0: Een nieuwe functie toegevoegd zonder bestaande code te breken.
- 1.0.1: Een bug opgelost in de 1.0.0-release.
- 2.0.0: Incompatibele API-wijzigingen aangebracht.
Het gebruik van SemVer helpt gebruikers de impact van een upgrade naar een nieuwe versie van uw package te begrijpen.
Uw package bouwen
Zodra uw `setup.py`-bestand is geconfigureerd, kunt u uw package bouwen.
- Creëer een virtuele omgeving: Het wordt sterk aanbevolen om een virtuele omgeving te creëren om de afhankelijkheden van uw package te isoleren. Gebruik `python3 -m venv .venv` (of `virtualenv .venv`) en activeer deze vervolgens (`source .venv/bin/activate` op Linux/macOS, `.venv\Scripts\activate` op Windows).
- Installeer bouw-afhankelijkheden: Voer `pip install --upgrade setuptools wheel` uit.
- Bouw het package: Voer `python setup.py sdist bdist_wheel` uit. Dit commando maakt twee distributiebestanden aan in de `dist`-map: een brondistributie (sdist) en een wheel-distributie (bdist_wheel).
De `sdist` bevat uw broncode en `setup.py`-bestand. De `bdist_wheel` is een vooraf gebouwde distributie die sneller kan worden geĂŻnstalleerd.
Uw package publiceren op PyPI
Voordat u uw package kunt publiceren, moet u een account aanmaken op PyPI (https://pypi.org/) en een API-token aanmaken. Dit token wordt gebruikt om uw uploads te authenticeren.
- Registreer op PyPI: Ga naar https://pypi.org/account/register/ en maak een account aan.
- Maak een API-token aan: Ga naar https://pypi.org/manage/account/, scroll naar beneden naar de sectie "API tokens", en maak een nieuw token aan. Bewaar dit token veilig, want u heeft het nodig om uw package te uploaden.
- Installeer Twine: Voer `pip install twine` uit.
- Upload uw package: Voer `twine upload dist/*` uit. U wordt gevraagd om uw gebruikersnaam (
__token__) en wachtwoord (het API-token dat u heeft aangemaakt).
Belangrijke veiligheidsopmerking: Commit nooit uw API-token naar uw repository. Bewaar het veilig en gebruik omgevingsvariabelen of andere veilige methoden om er tijdens het uploadproces toegang toe te krijgen.
De installatie van uw package testen
Nadat u uw package heeft gepubliceerd, is het essentieel om te testen of het correct kan worden geĂŻnstalleerd.
- Creëer een nieuwe virtuele omgeving: Dit zorgt ervoor dat u de installatie in een schone omgeving test.
- Installeer uw package: Voer `pip install uw-package-naam` uit.
- Importeer en gebruik uw package: Importeer in een Python-interpreter uw package en verifieer dat het werkt zoals verwacht.
Continue Integratie en Continue Implementatie (CI/CD)
Om het proces van bouwen, testen en publiceren van uw package te automatiseren, kunt u CI/CD-tools gebruiken zoals GitHub Actions, GitLab CI of Travis CI.
Hier is een voorbeeld van een GitHub Actions-workflow die uw package bouwt en publiceert op PyPI:
name: Publiceren naar PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
Uitleg:
- Deze workflow wordt geactiveerd wanneer een nieuwe release op GitHub wordt gepubliceerd.
- Het checkt de code uit, stelt Python in, installeert afhankelijkheden, bouwt het package en uploadt het naar PyPI.
- De
secrets.PYPI_API_TOKENis een GitHub-geheim waarin uw PyPI API-token is opgeslagen. U moet dit geheim configureren in de instellingen van uw GitHub-repository.
Best practices voor de distributie van Python-packages
- Schrijf uitgebreide documentatie: Voeg een gedetailleerd `README.md`-bestand toe, evenals API-documentatie met tools zoals Sphinx. Duidelijke en volledige documentatie is cruciaal om uw package gebruiksvriendelijk te maken.
- Schrijf unit tests: Test uw code grondig om de kwaliteit en betrouwbaarheid ervan te waarborgen. Gebruik een testframework zoals pytest of unittest.
- Volg de PEP 8-stijlrichtlijnen: Houd u aan de Python Enhancement Proposal 8 (PEP 8) stijlgids om consistente en leesbare code te garanderen.
- Gebruik een licentie: Kies een geschikte open-sourcelicentie om te specificeren hoe anderen uw code kunnen gebruiken.
- Houd uw afhankelijkheden up-to-date: Werk de afhankelijkheden van uw package regelmatig bij om te profiteren van bugfixes, beveiligingspatches en nieuwe functies.
- Gebruik een virtuele omgeving: Ontwikkel en test uw package altijd binnen een virtuele omgeving om afhankelijkheden te isoleren.
- Overweeg internationalisatie (i18n) en lokalisatie (l10n): Als uw package tekst of data voor gebruikers verwerkt, overweeg dan om het aanpasbaar te maken voor verschillende talen en regio's. Dit vergroot uw potentiële gebruikersgroep wereldwijd. Tools zoals Babel kunnen hierbij helpen.
- Behandel verschillende tijdzones en valuta's: Als uw package te maken heeft met datums, tijden of financiële transacties, wees dan bedacht op verschillende tijdzones en valuta's over de hele wereld. Gebruik geschikte bibliotheken en API's om deze complexiteiten correct af te handelen.
- Geef duidelijke foutmeldingen: Schrijf informatieve foutmeldingen die gebruikers helpen te begrijpen wat er misging en hoe ze het kunnen oplossen. Vertaal deze foutmeldingen indien mogelijk in verschillende talen.
- Denk aan toegankelijkheid: Houd rekening met gebruikers met een beperking bij het ontwerpen van de interface en documentatie van uw package. Volg toegankelijkheidsrichtlijnen om ervoor te zorgen dat uw package voor iedereen bruikbaar is.
Geavanceerde onderwerpen
- Namespace-packages: Hiermee kunt u een enkel Python-package splitsen over meerdere mappen of zelfs meerdere distributies.
- Entry points: Hiermee kunt u functies of klassen definiëren die vanuit andere packages of vanaf de commandoregel kunnen worden aangeroepen.
- Databeestanden: Hiermee kunt u niet-Python-bestanden (bijv. databestanden, configuratiebestanden) in uw distributie opnemen.
- Conditionele afhankelijkheden: Hiermee kunt u afhankelijkheden specificeren die alleen onder bepaalde omstandigheden vereist zijn (bijv. op een specifiek besturingssysteem).
Conclusie
Het distribueren van uw Python-package op PyPI is een geweldige manier om uw werk met de wereld te delen en bij te dragen aan het Python-ecosysteem. Door de stappen en best practices in deze gids te volgen, kunt u hoogwaardige Python-packages creëren en publiceren die eenvoudig te installeren, te gebruiken en te onderhouden zijn. Onthoud dat duidelijke documentatie, grondig testen en consistent versiebeheer prioriteit moeten hebben om het succes van uw package te garanderen.