web-dev-qa-db-fra.com

Python: plusieurs packages dans un référentiel ou un package par référentiel?

J'ai un gros projet Python 3.7+ et je suis actuellement en train de le diviser en plusieurs packages qui peuvent être installés séparément. Ma pensée initiale était d'avoir un seul référentiel Git avec plusieurs packages, chacun avec son propre setup.py. Cependant, en faisant des recherches sur Google, j'ai trouvé des gens suggérant un référentiel par package: (par exemple, Python - setuptools - travaillant sur deux packages dépendants (dans un seul référentiel?) ) Cependant, personne ne fournit une bonne explication pour expliquer pourquoi ils préfèrent une telle structure.

Donc, ma question est la suivante:

  • Quelles sont les implications d'avoir plusieurs packages (chacun avec son propre setup.py) sur le même dépôt GitHub?
  • Vais-je rencontrer des problèmes avec une telle configuration?
  • Les outils courants Python (générateurs de documentation, packaging pypi, etc.) sont-ils compatibles avec une telle configuration?
  • Y a-t-il une bonne raison de préférer une configuration à l'autre?
  • N'oubliez pas qu'il ne s'agit pas d'une question d'opinion. Je veux savoir s'il y a des problèmes techniques ou des problèmes avec l'une des deux approches.

De plus, je suis conscient (et corrigez-moi si je me trompe) que setuptools permet désormais d'installer des dépendances à partir des dépôts GitHub, même si l'URL GitHub de setup.py n'est pas à la racine du référentiel.

7
AstrOne

Je recherche moi-même le même problème. La documentation de PyPa recommande la mise en page décrite dans le sous-répertoire "natif" de: https://github.com/pypa/sample-namespace-packages

Je trouve la structure de package unique décrite ci-dessous, très utile, voir la discussion autour du test de la version "installée". https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure Je pense que cela peut être étendu à plusieurs packages. Publiera au fur et à mesure que j'apprends.

1
boriska

Un aspect est couvert ici https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support

En particulier, si setup.py ne se trouve pas dans le répertoire racine, vous devez spécifier le sous-répertoire où trouver setup.py dans la commande pip install.

Donc, si la disposition de votre référentiel est:

  • pkg_dir /
    • setup.py # setup.py pour le package pkg
    • some_module.py
  • other_dir /
    • un_fichier
    • some_other_file

Vous devrez utiliser pip install -e vcs + protocol: // repo_url/# Egg = pkg & subdirectory = pkg_dir.

1
Teitur