Comment partager vos paquets Python

Vue d'ensemble

Les packages Python sont les blocs de construction des applications Python. Ils encapsulent des fonctionnalités cohérentes pouvant être importées et utilisées par de nombreuses applications et systèmes. Mais d’abord, les développeurs doivent trouver votre paquet et pouvoir l’installer. Python fournit un référentiel public gratuit pour les packages, qui est le standard de facto pour le partage de packages Python. Vous pouvez également utiliser des référentiels de packages privés pour les packages propriétaires..

Dans ce tutoriel, vous apprendrez à partager vos propres packages avec la communauté. Si vous avez des packages propriétaires que vous devez partager uniquement au sein de votre entreprise, vous apprendrez également à le faire..

Pour plus d'informations, consultez Comment utiliser les packages Python et Comment écrire vos propres packages Python. 

Qu'est-ce que PyPI??

PyPI correspond à l'index de package Python. C'est un référentiel public pour le téléchargement de vos paquets. Pip connaît l'existence de PyPI et peut installer et / ou mettre à niveau des packages à partir de PyPI. PyPI s'appelait autrefois "la fromagerie" d'après le célèbre croquis de Monty Python. Si vous entendez des gens se référer à la "Fromagerie" dans un contexte d’emballage Python, ne vous inquiétez pas. C'est juste PyPI.

Préparer un paquet pour le téléchargement

Avant de télécharger un paquet, vous devez en avoir un. J'utiliserai le paquet conman que j'ai introduit dans l'article Comment écrire vos propres paquets Python. Puisque PyPI contient des milliers de paquets, il est très important de pouvoir décrire votre paquet correctement si vous voulez que les gens le trouvent. PyPI prend en charge un ensemble impressionnant de balises de métadonnées pour permettre aux utilisateurs de trouver le package adapté à leur travail..

Le fichier setup.py contient de nombreuses informations importantes utilisées pour installer votre paquet. Mais il peut également inclure les métadonnées utilisées pour classifier votre paquet sur PyPI. Les packages sont classés à l'aide de plusieurs balises de métadonnées. Certains d'entre eux sont textuels et certains d'entre eux ont une liste de valeurs possibles. La liste complète est disponible sur la page PyPI List Classifiers.

Ajoutons quelques classificateurs à setup.py. Il n'est pas nécessaire d'incrémenter le numéro de version car il ne s'agit que de métadonnées et le code reste le même:

depuis la configuration d'importation de setuptools, la configuration de find_packages (name = 'conman', version = "0.3", url = "https://github.com/the-gigi/conman", license = "MIT", author = "Gigi Sayfan" , author_email = "[email protected]", description = "Gérer les fichiers de configuration", classifiers = ['Status de développement :: 3 - Alpha', 'Auditoire cible :: Développeurs', 'Rubrique :: Développement de logiciels :: Bibliothèques ',' Licence :: Approuvée par OSI :: Licence MIT ',' Langage de programmation :: Python :: 2 ',' Langage de programmation :: Python :: 2.6 ',' Langage de programmation :: 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" )

Créer un compte

Vous devez créer un compte sur PyPI pour pouvoir télécharger des packages. Remplissez ce formulaire et vérifiez votre identité en cliquant sur l'URL dans le courrier électronique de vérification. Maintenant, vous devez créer un .Pypyrc fichier dans votre répertoire personnel qui contiendra les informations nécessaires pour télécharger des paquets.

[distutils] index-servers = pypi [pypi] référentiel = https://pypi.python.org/pypi nom_utilisateur = the_gigi 

Vous pouvez également ajouter votre mot de passe, mais il est préférable de ne pas utiliser d’élément défectueux sur votre ordinateur portable. Ceci est particulièrement important si vous téléchargez des packages populaires, car si quelqu'un peut télécharger ou mettre à niveau vos packages, toutes les personnes qui utilisent ces packages seront vulnérables..

Essai

Si vous souhaitez tester l'enregistrement du package et le processus de téléchargement sans vous soucier de la publication d'un document incomplet, vous pouvez utiliser le site de test alternatif PyPI. Étendez votre fichier ~ / .pypirc pour inclure une section 'pypitest'.

[distutils] index-servers = pypi pypitest [pypitest] référentiel = https://testpypi.python.org/pypi nom_utilisateur = the_gigi [pypi] référentiel = https://pypi.python.org/pypi nom_utilisateur = le_gigi 

N'oubliez pas que le site de test est nettoyé régulièrement, alors ne vous y fiez pas. Il est destiné à des fins de test uniquement.

Enregistrez votre paquet

S'il s'agit de la première version de votre paquet, vous devez l'enregistrer auprès de PyPI. Twine a une commande register, mais je ne comprends pas comment l'utiliser. Suivre la documentation produit une erreur, et en vérifiant les tests unitaires pour la ficelle, il n’ya pas de test pour la commande register. Tant pis. Vous pouvez aussi le faire manuellement en utilisant ce formulaire pour télécharger le fichier PKG-INFO. Si vous utilisez Python 2.7.9+ ou Python 3.2+, vous pouvez également vous inscrire en toute sécurité en utilisant python. registre setup.py.

Enregistrons conman sur le site de test PyPI. Noter la -r pypitest, qui repose sur la section dans ~ / .pypirc va s'inscrire sur le site de test.

python setup.py register -r pypitest exécutant register en exécutant egg_info en écrivant conman.egg-info / PKG-INFO en écrivant les noms de premier niveau dans conman.egg-info / top_level.txt en écrivant des liens de dépendance vers conman.egg-info / dependency_links.txt Le fichier manifeste 'conman.egg-info / SOURCES.txt' qui lit le modèle de manifeste 'MANIFEST.in' qui écrit le fichier manifeste 'conman.egg-info / SOURCES.txt' en cours de vérification. Mot de passe: enregistrement de conman dans https: //testpypi.python. org / pypi Réponse du serveur (200): OK

Ficelle

Vous pouvez télécharger un paquet en utilisant python setup.py upload, mais il n'est pas sécurisé car il permettait d'envoyer votre nom d'utilisateur et votre mot de passe via HTTP jusqu'à Python 2.7.9 et Python 3.2. Twine utilise toujours HTTPS et présente des avantages supplémentaires, tels que le téléchargement de distributions pré-créées, et prend en charge tous les formats d’emballage, y compris les disques. J'utiliserai de la ficelle pour l'envoi.

Twine ne fait pas partie de la bibliothèque standard, vous devez donc l’installer: pip installer ficelle.

Téléchargez votre paquet

Enfin, il est temps de télécharger le paquet. 

> twine upload -r pypitest -p ******* dist / * Téléchargement de distributions sur https://testpypi.python.org/pypi Téléchargement conman-0.3-py2-none-any.whl Téléchargement conman-0.3-py2 .py3-none-any.whl Téléchargement de conman-0.3.tar.gz

Twine a chargé tous les formats de distribution, à la fois la source et les roues. 

Testez votre colis

Une fois que votre paquet est sur PyPI, vous devez vous assurer que vous pouvez l’installer et tout fonctionne. Ici, je crée un environnement virtuel unique, pip install conman à partir du site de test PyPI, puis l’importe. Vous voudrez peut-être exécuter des tests plus approfondis pour votre paquet.

> mkvirtualenv test_conman_pypi Nouvel exécutable python dans test_conman_pypi / bin / python2.7 Création également de l’exécutable dans test_conman_pypi / bin / python Installation de setuptools, pip… done. Utilisation: source deactivate supprime le répertoire 'bin' de l'environnement activé avec 'source activate' de PATH. (test_conman_pypi)> pip install -i https://testpypi.python.org/pypi conman Téléchargement / Déballage de conman Téléchargement de conman-0.3-py-2-none-any.whl Stockage du téléchargement en cache dans /Users/gigi/.cache/pip /https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl Installation des packages collectés: conman Installation réussie de conman Nettoyage en cours… (test_conman_pypi)> python Python 2.7 .10 (défaut, le 10 juin 2015, 19:43:32) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] sur darwin Type "aide", "droit d'auteur", "crédits" ou "licence" pour plus d'informations. >>> importateur >>>

Notez que la distribution de roue a été installée par défaut.

Gestion des versions

Lorsque vous faites évoluer vos paquets et que vous téléchargez de nouvelles versions, il est important de suivre un schéma de gestion des versions judicieux. Les gens seront très mécontents si une mise à niveau involontaire casse leur code. Votre schéma de version doit être conforme à PEP-440 - Identification de version et spécification de dépendance. 

Cette spécification permet à plusieurs modèles de choisir. Je recommande d'utiliser le schéma de versioning sémantique populaire. C'est à peu près "..", ce qui correspond à PEP-440"..". Méfiez-vous simplement des versions prolongeant le trait d'union ou les signes plus, qui ne sont pas compatibles avec PEP-440.

Dépôts de paquets privés

PyPI est génial, mais parfois vous ne voulez pas partager vos paquets. De nombreuses entreprises et organisations ont des équipes d'ingénieurs qui utilisent Python et doivent partager des packages entre elles, mais ne sont pas autorisées à les partager publiquement sur PyPI. Ce n'est pas un problème. Vous pouvez partager des paquets sur des référentiels de paquets privés sous votre contrôle.. 

Notez que vous souhaiterez parfois avoir un référentiel de paquet privé sous votre contrôle uniquement pour gérer vos dépendances tierces. Par exemple, un auteur de paquet peut décider de supprimer un paquet de PyPI. Si votre système doit pouvoir installer ce paquet depuis PyPI, vous avez des problèmes..

Devpi

Devpi (qui signifie Development Package Index) est un remplacement immédiat du serveur PyPI public. Il est open source et sous licence MIT, vous pouvez donc l'exécuter à l'intérieur de votre pare-feu. Devpi est très puissant et possède de nombreuses fonctionnalités qui lui permettent de fonctionner comme votre serveur de packaging ultime:

  • Miroir rapide PyPI
  • Téléchargement, test et transfert avec des index privés
  • Index héritage
  • Interface Web et recherche
  • Réplication
  • Importer / Exporter
  • Intégration de Jenkins

Devpi possède une excellente documentation, un système de plug-in et est en développement actif avec une communauté dynamique.

Conclusion

Python fournit une solution complète pour l'hébergement de vos paquets et leur mise à la disposition de vos collègues Pythonistes. Il existe un processus simplifié assisté par des outils permettant de conditionner et de télécharger des packages et de faciliter leur recherche et leur installation.. 

Si vous avez besoin de garder les éléments confidentiels, Devpi est là pour vous en tant que référentiel de packages privés mature et robuste..