Je suis un universitaire plutôt qu'un programmeur, et j'ai de nombreuses années d'expérience dans l'écriture de programmes Python pour mon propre usage, pour soutenir mes recherches. Mon dernier projet est susceptible d'être utile à beaucoup d'autres ainsi que moi, et je pense à le publier en tant que bibliothèque open-source Python bibliothèque.
Cependant, il semble qu'il y ait pas mal d'obstacles à franchir pour passer d'un projet personnel fonctionnel à une bibliothèque qui peut être installée et utilisée sans douleur par d'autres. Cette question concerne les premières étapes à suivre pour commencer à travailler vers une version publique.
Actuellement, j'ai un seul dépôt git qui contient mon code qui utilise la bibliothèque ainsi que la bibliothèque elle-même, et j'utilise git comme bouton d'annulation d'urgence en cas de rupture. Tout cela fonctionne bien pour un seul utilisateur mais n'est évidemment pas approprié si je veux le libérer. Là où je veux finir, c'est que ma bibliothèque est dans un référentiel séparé et peut être installée par d'autres en utilisant pip
, et possède une API stable.
Apprendre à utiliser setuptools, etc. n'est probablement pas si difficile une fois que je suis sur le point de vouloir le publier - mon problème est de savoir comment je dois travailler pour arriver à ce point.
Donc, ma question est, quelles sont les premières étapes à suivre pour commencer à préparer un projet de bibliothèque Python pour la consommation publique? Comment dois-je réorganiser ma structure de répertoires, git repository etc. afin de commencer à travailler pour une version publique de la bibliothèque?
Plus généralement, il serait très utile de disposer de ressources connues pour être utiles lors de la première tentative. Des conseils sur les meilleures pratiques et les erreurs à éviter, etc., seraient également très utiles.
Quelques précisions: les réponses actuelles répondent à une question du type "comment puis-je faire de ma bibliothèque Python une bibliothèque bon pour les autres? "C'est utile, mais c'est différent de la question que je voulais poser.
Je suis actuellement au début d'un long voyage vers la sortie de mon projet. Le cœur de mon implémentation fonctionne (et fonctionne très bien), mais je me sens dépassé par la quantité de travail qui m'attend et je cherche des conseils sur la manière de naviguer dans le processus. Par exemple:
Mon code de bibliothèque est actuellement couplé à mon propre code propre au domaine qui l'utilise. Il vit dans un sous-dossier et partage le même référentiel git. Finalement, il devra être transformé en une bibliothèque autonome et placé dans son propre référentiel, mais je continue de tergiverser parce que je ne sais pas comment le faire. (Ni comment installer une bibliothèque en "mode développement" pour que je puisse encore la modifier, ni comment garder les deux git repos synchronisés.)
Mes docstrings sont laconiques, car je sais que je devrai éventuellement utiliser Sphinx ou un autre outil. Mais ces outils ne semblent pas simples à apprendre, donc cela devient un sous-projet majeur et je continue de le repousser.
À un moment donné, j'ai besoin d'apprendre à utiliser setuptools ou un autre outil pour l'empaqueter et suivre les dépendances, qui sont assez complexes. Je ne sais pas si je dois le faire maintenant ou non, et la documentation est un labyrinthe absolu pour un nouvel utilisateur, donc je continue de décider de le faire plus tard.
Je n'ai jamais eu à faire de tests systématiques, mais je le ferai certainement pour ce projet, donc je dois (i) en apprendre suffisamment sur les tests pour savoir quelle méthodologie est la bonne pour mon projet; (ii) apprendre quels outils sont disponibles pour ma méthodologie choisie; (iii) apprendre à utiliser l'outil que j'ai choisi; (iv) implémenter des suites de tests, etc. pour mon projet. Ceci est un projet en soi.
Il y a peut-être aussi d'autres choses que je dois faire. Par exemple, jonrsharpe a publié un lien utile qui mentionne git-flow, tox, TravisCI, virtualenv et CookieCutter, dont je n'avais jamais entendu parler auparavant. (Le poste date de 2013, donc je dois aussi faire un peu de travail pour savoir combien est encore en cours.)
Lorsque vous mettez tout cela ensemble, c'est un énorme travail, mais je suis sûr que je peux tout faire si je continue de le brancher, et je ne suis pas pressé. Mon problème est de savoir comment le décomposer en étapes gérables qui peuvent être effectuées une à la fois.
En d'autres termes, je demande quelles sont les étapes concrètes les plus importantes que je peux prendre maintenant, afin d'atteindre un produit libérable à terme. Si j'ai un week-end gratuit, sur quoi dois-je me concentrer? Laquelle (le cas échéant) peut être effectuée indépendamment des autres, afin que je puisse au moins faire une étape sans avoir à tout faire? Quelle est la façon la plus efficace d'apprendre ces choses pour que j'aie encore le temps de me concentrer sur le projet lui-même? (Gardant à l'esprit que tout cela est essentiellement un projet de loisir, pas mon travail.) Y a-t-il quelque chose que je n'ai pas vraiment besoin de faire, me permettant ainsi d'économiser une énorme quantité de temps et efforts?
Toutes les réponses sont grandement appréciées, mais je serais particulièrement heureux de recevoir des réponses qui se concentrent sur ces aspects de la gestion de projet, avec une référence spécifique au développement moderne Python.
L'ajout d'un fichier setup.py, bien que nécessaire, n'est pas l'étape la plus importante si vous souhaitez que votre bibliothèque soit utilisée. Le plus important est d'ajouter de la documentation et de publier votre bibliothèque. Puisque le deuxième point dépend fortement de la bibliothèque, permettez-moi plutôt de concentrer l'aspect documentation.
Vous savez tout sur votre bibliothèque. Et c'est problématique. Vous savez déjà comment installer et comment l'utiliser, tant de choses peuvent vous sembler intuitives ou tout à fait évidentes. Malheureusement, les mêmes choses ne sont ni évidentes, ni intuitives pour les utilisateurs. Essayez de regarder votre bibliothèque comme si vous n'en saviez rien, et surtout, demandez à d'autres personnes de l'utiliser et essayez de repérer toutes les difficultés qu'elles ont rencontrées.
Expliquez, en langage simple, à quoi sert votre bibliothèque. Trop de bibliothèques supposent que tout le monde les connaît. Lorsque ce n'est pas le cas, il peut être difficile de comprendre quel est le but de la bibliothèque.
Écrivez une documentation technique détaillée, mais n'oubliez pas non plus de courts morceaux de code qui montrent comment effectuer certaines tâches avec votre bibliothèque. La plupart des développeurs sont pressés et s'ils ont besoin de passer des heures à essayer de comprendre comment faire une chose de base, ils peuvent avoir tendance à passer à d'autres bibliothèques.
Incluez vos coordonnées. Si votre bibliothèque est un succès (et ma propre expérience a montré que c'est le cas même pour les plus inconnus), les gens rencontreraient des difficultés avec: des bugs ou simplement des difficultés à comprendre ou à utiliser certaines parties de celle-ci. Il est souvent utile de recevoir leurs commentaires pour améliorer votre bibliothèque: pour chaque personne qui a signalé un problème, il y en a peut-être des centaines qui, lorsqu'ils le rencontrent, préfèrent simplement passer à une autre bibliothèque.
En plus de cela:
Indiquez clairement si votre bibliothèque fonctionne avec Python 2 ou 3 ou les deux).
Si la bibliothèque ne fonctionne pas sous Windows, dites-le.
Assurez-vous d'utiliser les conventions officielles (utilisez pep8 pour vérifier). Sinon, expliquez-le clairement ou corrigez-le.
Prenez soin de manipuler les étuis Edge. Lorsque votre bibliothèque est appelée avec un mauvais type ou avec une valeur qui n'est pas prise en charge, elle devrait dire, en anglais simple, ce qui ne va pas exactement. Ce qu'il ne devrait pas faire, c'est lever une exception cryptique de dix niveaux dans la pile et laisser l'utilisateur comprendre ce qui ne va pas.
Ce sont de grandes questions.
À propos des étapes incrémentielles concrètes importantes vers une bibliothèque libérable:
../library
jusqu'à ce que vous passiez aux étapes de conditionnement de pip et de mode de développement.pytest
. Bien avant de publier une version, les tests unitaires porteront leurs fruits dans votre propre développement en trouvant des bogues dans les cas d'angle et en vous assurant que les changements de code n'ont pas cassé les choses. Encore une fois, vous pouvez construire cela au fil du temps. C'est assez facile à démarrer.README.md
fichiers de documentation au niveau supérieur et dans n'importe quel répertoire, et avec un fichier de licence.Peut-être pourriez-vous trouver un projet OSS mature dans votre domaine et apporter votre code à ce projet? Il pourrait y avoir quelques avantages, tels que:
S'il y a un projet OSS pertinent que vous aimez et que vous utilisez peut-être, pourquoi ne pas ouvrir un problème ou une demande d'extraction ou contacter autrement les responsables? (Une bonne façon de commencer pourrait être de résoudre un problème existant.)
Nous sommes en 2019, je suggère fortement de commencer par les outils les plus modernes. Vous n'avez pas besoin d'un setup.py
, c'est quelque chose que les gens de la communauté Python veulent se débarrasser, et je pense qu'ils finiront par le faire.
Essayez Poésie , vous ne le regretterez pas.
C'est une question compliquée que vous posez, et je suis entièrement d'accord réponse d'Arseni . Une bonne documentation est un aspect très important. Si je ne réussis pas à faire fonctionner votre bibliothèque en quelques étapes simples, je la laisse tomber juste là (à moins que je ne veuille vraiment l'essayer).
Certaines choses que vous considérez certainement
Je n'ai aucune expérience pertinente avec Python, donc je ne peux pas vous donner d'indices dans cette direction. Cependant, il est possible d'automatiser tous les tests déclenchés par chaque validation sur votre référentiel distant (c'est-à-dire en utilisant Jenkins ). Je suggère cependant de reporter cela, car il y a beaucoup de travail à mettre en place sans expérience préalable.
Après avoir utilisé un bon nombre de bibliothèques moins que matures au fil des ans, un conseil clé est une fois que vous avez choisi votre outil de déploiement, procédez comme suit: votre bibliothèque fait-elle quelque chose de vraiment utile que vous pouvez construire une communauté autour?
Identifiez les dépendances de votre bibliothèque.
Tentez un déploiement dans un environnement propre, soit un conteneur de dossier ou une machine virtuelle. Je considère que cette étape est cruciale car, souvent, il y a quelque chose d'unique dans un environnement personnel qui cause des problèmes.
Pensez à qui va gérer la bibliothèque à l'avenir, il n'y a rien de plus frustrant que de tomber sur une bibliothèque qui a été le projet de prédilection de quelqu'un pendant trois ou quatre ans et qui ne reçoit pas les mises à jour nécessaires pour la maintenir à jour.
Demandez-vous si vous ou votre équipe souhaitez vous engager à maintenir la bibliothèque testée et documentée (les tests unitaires et les pipelines CI commencent à faire partie de l'équation ici).