Hoe u uw Python-pakketten deelt

Overzicht

Python-pakketten zijn de bouwstenen van Python-applicaties. Ze bevatten een enkele coherente functionaliteit die door veel applicaties en systemen kan worden geïmporteerd en gebruikt. Maar eerst moeten ontwikkelaars uw pakket vinden en kunnen installeren. Python biedt een gratis openbare opslagplaats voor pakketten, wat de de facto standaard is voor het delen van Python-pakketten. U kunt ook privé-pakketrepository's gebruiken voor eigen pakketten.

In deze tutorial leer je hoe je je eigen pakketten met de community kunt delen. Als u eigen pakketten hebt die u alleen binnen uw bedrijf kunt delen, leert u ook hoe u dat moet doen.

Zie Pythonpakketten gebruiken en hoe u uw eigen Python-pakketten schrijft voor achtergrondinformatie. 

Wat is PyPI?

PyPI staat voor de Python Package Index. Het is een openbare opslagplaats voor het uploaden van uw pakketten. Pip is op de hoogte van PyPI en kan pakketten van PyPI installeren en / of upgraden. PyPI werd de "Cheese Shop" genoemd naar de beroemde schets van Monty Python. Als je mensen naar de "Cheese Shop" in een Python-verpakking hoort verwijzen, wees dan niet gealarmeerd. Het is gewoon PyPI.

Maak een pakket klaar voor uploaden

Voordat je een pakket uploadt, moet je een pakket hebben. Ik gebruik het conman-pakket dat ik heb geïntroduceerd in het artikel Hoe je eigen Python-pakketten schrijft. Omdat PyPI duizenden pakketten bevat, is het erg belangrijk om je pakket goed te kunnen beschrijven als je wilt dat mensen het vinden. PyPI ondersteunt een indrukwekkende reeks metadatatags om mensen het juiste pakket voor de taak te laten vinden.

Het bestand setup.py bevat veel belangrijke informatie die wordt gebruikt om uw pakket te installeren. Maar het kan ook de metadata bevatten die worden gebruikt om uw pakket op PyPI te classificeren. Pakketten worden geclassificeerd met behulp van meerdere metadata-tags. Sommigen van hen zijn tekstueel en sommige hebben een lijst met mogelijke waarden. De volledige lijst is beschikbaar op de pagina Lijst classificaties van PyPI.

Laten we een paar classifiers toevoegen setup.py. Het versienummer hoeft niet te worden verhoogd omdat het alleen metadata is en de code hetzelfde blijft:

van setuptools import setup, find_packages setup (naam = 'conman', version = "0.3", url = "https://github.com/the-gigi/conman", license = "MIT", author = "Gigi Sayfan" , author_email = "[email protected]", description = "Beheer configuratiebestanden", classifiers = ['Ontwikkelingsstatus :: 3 - Alfa', 'Beoogd publiek :: Ontwikkelaars', 'Onderwerp :: Softwareontwikkeling :: Bibliotheken ',' Licentie :: OSI Approved :: MIT License ',' Programming Language :: Python :: 2 ',' Programming Language :: Python :: 2.6 ',' Programming Language :: Python :: 2.7 ',], packages = find_packages (exclude = ['tests']), long_description = open ('README.md'). read (), zip_safe = False, setup_requires = ['nose> = 1.0'], test_suite = "nose.collector" )

Account aanmaken

U moet een account maken op PyPI om pakketten te kunnen uploaden. Vul dit formulier in en verifieer uw identiteit door op de URL in de verificatie-e-mail te klikken. Nu moet je een maken .pypyrc bestand in uw thuismap die de informatie bevat die nodig is om pakketten te uploaden.

[distutils] index-servers = pypi [pypi] repository = https://pypi.python.org/pypi gebruikersnaam = the_gigi 

Je kunt ook je wachtwoord toevoegen, maar het is veiliger als je het niet doet in het geval een slecht element je laptop raakt. Dit is vooral belangrijk als u populaire pakketten uploadt, want als iemand uw pakketten kan uploaden of upgraden, zullen alle mensen die deze pakketten gebruiken kwetsbaar zijn.

testen

Als u de pakketregistratie en het uploadproces wilt testen en u zich geen zorgen hoeft te maken over iets onvolledigs te publiceren, kunt u werken met de alternatieve PyPI-testsite. Breid je ~ / .pypirc-bestand uit met een 'pypitest'-sectie.

[distutils] index-servers = pypi pypitest [pypitest] repository = https://testpypi.python.org/pypi gebruikersnaam = the_gigi [pypi] repository = https://pypi.python.org/pypi gebruikersnaam = the_gigi 

Vergeet niet dat de testsite regelmatig wordt opgeschoond, dus vertrouw er niet op. Het is alleen bedoeld voor testdoeleinden.

Registreer uw pakket

Als dit de eerste versie van uw pakket is, moet u het met PyPI registreren. Twine heeft een registeropdracht, maar ik kan er niet achter komen hoe ik het moet gebruiken. Het volgen van de documentatie levert een fout op en het controleren van de eenheidstests voor touw is geen test voor de registeropdracht. Oh nou ja. U kunt dit ook handmatig doen met dit formulier om het PKG-INFO-bestand te uploaden. Als je Python 2.7.9+ of Python 3.2+ gebruikt, kun je je ook veilig aanmelden met python setup.py registreren.

Laten we conman registreren op de PyPI-testsite. Merk op -r pypitest, welke op basis van de sectie in ~ / .Pypirc zal zich registreren bij de testsite.

python setup.py register -r pypitest running register met egg_info schrijven conman.egg-info / PKG-INFO schrijven van topniveau namen naar conman.egg-info / top_level.txt schrijven van dependency_links naar conman.egg-info / dependency_links.txt lezen manifest bestand 'conman.egg-info / SOURCES.txt' leesmanifest template 'MANIFEST.in' schrijven manifest bestand 'conman.egg-info / SOURCES.txt' running check Wachtwoord: Registratie conman naar https: //testpypi.python. org / pypi Serverreactie (200): OK

vlechten

U kunt een pakket uploaden met behulp van python setup.py uploaden, maar het is niet beveiligd omdat het uw gebruikersnaam en wachtwoord gebruikte via HTTP tot Python 2.7.9 en Python 3.2. Twine gebruikt altijd HTTPS en heeft extra voordelen, zoals het uploaden van vooraf gemaakte distributies, en het ondersteunt elk verpakkingsformaat, inclusief wielen. Ik zal touw gebruiken voor de eigenlijke upload.

Twine maakt geen deel uit van de standaardbibliotheek, dus u moet het installeren: pip install twine.

Upload uw pakket

Eindelijk is het tijd om het pakket daadwerkelijk te uploaden. 

> twine upload -r pypitest -p ******* dist / * Uploaden van distributies naar https://testpypi.python.org/pypi Uploaden conman-0.3-py2-none-any.whl Uploaden conman-0.3-py2 .py3-none-any.whl Uploaden conman-0.3.tar.gz

Twine heeft alle distributieformaten geüpload, zowel de bron als de wielen. 

Test uw pakket

Zodra uw pakket op PyPI staat, moet u ervoor zorgen dat u het kunt installeren en alles werkt. Hier maak ik een eenmalige virtuele omgeving, pip install conman van de PyPI-testsite en importeer deze vervolgens. Wellicht wilt u meer grondige tests uitvoeren voor uw pakket.

> mkvirtualenv test_conman_pypi Nieuw python-bestand in test_conman_pypi / bin / python2.7 Ook uitvoerbaar in test_conman_pypi / bin / python maken Setuptools installeren, pip ... klaar. Gebruik: source deactivate verwijdert de 'bin'-map van de omgeving geactiveerd met' source activate 'vanuit PATH. (test_conman_pypi)> pip install -i https://testpypi.python.org/pypi conman Downloaden / uitpakken conman Downloaden conman-0.3-py2-none-any.whl Downloaden opslaan in cache op /Users/gigi/.cache/pip /https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl Geïnstalleerde pakketten installeren: conman Installatie voltooid conman Opschonen ... (test_conman_pypi)> python Python 2.7 .10 (standaard, 10 juni 2015, 19:43:32) [GCC 4.2.1 Compatibele Apple LLVM 6.0 (clang-600.0.57)] op Darwin Type "help", "copyright", "credits" of "licentie" voor meer informatie. >>> importeer conman >>>

Merk op dat de wielverdeling standaard was geïnstalleerd.

Versioning

Wanneer u uw pakketten evolueert en nieuwe versies uploadt, is het belangrijk om een ​​verstandig versiebeheerschema te volgen. Mensen zullen behoorlijk overstuur raken als een onbedoelde upgrade hun code verbreekt. Uw versiebeheerschema moet voldoen aan PEP-440 - Versie-identificatie en afhankelijkheidsspecificatie. 

Met deze specificatie kunnen meerdere schema's kiezen. Ik raad aan om het populaire Semantic Versioning-schema te gebruiken. Het is zo ongeveer "..", wat overeenkomt met PEP-440's"..Pas op voor versies die het koppelteken of de plustekens voortzetten, die niet compatibel zijn met PEP-440.

Privé-pakketrepositories

PyPI is geweldig, maar soms wil je je pakketten niet delen. Veel bedrijven en organisaties hebben engineeringteams die Python gebruiken en moeten pakketten tussen hen delen, maar mogen deze niet publiekelijk delen op PyPI. Dit is geen probleem. U kunt pakketten op privé-pakketrepository's onder uw beheer delen. 

Merk op dat u soms een privé-pakketrepository onder uw controle wilt hebben om uw afhankelijkheden van derden te beheren. Een auteur van een pakket kan bijvoorbeeld beslissen om een ​​pakket van PyPI te verwijderen. Als uw systeem ervan afhankelijk is dat u dit pakket van PyPI kunt installeren, zit u in de problemen.

Devpi

Devpi (wat staat voor Development Package Index) is een vervangende vervanging voor de openbare PyPI-server. Het is open source en MIT-licentie, dus u kunt het binnen uw firewall uitvoeren. Devpi is zeer krachtig en heeft vele functies die het mogelijk maken om te functioneren als uw ultieme verpakkingsserver:

  • Snelle PyPI-spiegel
  • Uploaden, testen en staging met privé-indexen
  • Indexovername
  • Webinterface en zoeken
  • kopiëren
  • Importeren / exporteren
  • Jenkins integratie

Devpi heeft uitstekende documentatie, een plug-insysteem en is in actieve ontwikkeling met een levendige gemeenschap.

Conclusie

Python biedt een complete oplossing voor het hosten van uw pakketten en deze ter beschikking te stellen van uw mede-Pythonistas. Er is een gestroomlijnd proces, ondersteund door tools om pakketten te verpakken en te uploaden en ze gemakkelijk te vinden en te installeren. 

Als u dingen privé wilt houden, is Devpi er voor u als een volwassen en robuuste privé-pakketrepository.