Problème de packaging : conflit entre dépendance git et dependence locale

Salut,

J’ai une question un peu tordue pour les férus de packaging.

Je développe actuellement un projet que je découpe en plusieurs paquets Python (qui seront publiés sur PyPI) dont certains peuvent être hébergés sur un même dépôt git.
Pas de soucis jusque là mais pour visualiser disons que j’ai un dépôt git avec deux répertoires pouet-engine et pouet-more contenant le code des deux paquets respectifs.

En plus de ça, je fournis des tests pour ces projets, hébergés sur le même dépôt (logique) mais non inclus dans les paquets Python publiés.
Comme les tests de pouet-engine et pouet-more peuvent avoir besoin de fonctions communes mais que je ne veux pas encombrer les paquets principaux des détails des tests, j’ajoute dans l’histoire un paquet pouet-test-fixtures hébergé dans le même dépôt pour contenir tout ça, mais pas publié sur PyPI (il n’a pas de raison d’être installé en dehors de l’env de test).

J’ai ainsi pouet-engine qui n’a pas de dépendance particulière, pouet-engine[dev] qui dépend de pouet-test-fixutres @ git+ssh://..., pouet-test-fixtures qui dépend de pouet-engine, pouet-more qui dépend de pouet-engine et pouet-more[dev] qui dépend de pouet-engine[dev].
Là encore, ça fonctionne plutôt bien.

On en arrive maintenant à mon soucis : je suis dans mon env de dev et j’ai envie de tout installer en mode éditable à partir des fichiers locaux (sans aller chercher de dépendances internes sur PyPI ou sur git). Parce que je veux que mes modifications locales dans le répertoire pouet-test-fixtures soient considérées quand j’exécute les tests de pouet-engine.
Et c’est le cas de la dépendance git qui fait que ça coince.

Lorsque j’essaie un pip install -e './pouet-engine[dev]' ./pouet-test-fixtures j’obtiens une erreur de résolution parce que j’essaie à la fois d’installer pouet-test-fixtures @ git+ssh://... et pouet-test-fixtures depuis le dossier local.

ERROR: Cannot install pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet-test-fixtures) and pouet[dev]==0.1.0 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet/test-fixtures)
    pouet[dev] 0.1.0 depends on pouet-test-fixtures 0.0.0 (from git+ssh://****@github.com/entwanne/pouet.git#subdirectory=pouet-test-fixtures)

Là j’ai bien une solution alternative qui est de séparer et dupliquer la commande : d’abord installer ./pouet-engine[dev] qui ira tirer la dépendance depuis git puis de réinstaller ./pouet-test-fixtures pour l’écraser avec la version locale, mais ça passe mal à l’échelle quand il y a plusieurs paquets, parce que si j’installe ./pouet-more[dev] ensuite je suis obligé de recommencer toute la manip.

Des idées pour trouver une solution acceptable à ce soucis ?

Au besoin je peux mettre à disposition un tel projet-jouet pouet qui reproduit le problème.

Je viens de lire dans la PEP 440 que

Public index servers SHOULD NOT allow the use of direct references in uploaded distributions.

Donc j’imagine que mon paquet sera refusé automatiquement à l’upload sur PyPI parce qu’il comprend une dépendance extra en référence direct et que la solution que j’avais imaginée (paquet de fixtures non publié sur PyPI) n’est pas viable.

Il est donc préférable de tout publier sur PyPI même si ce ne sont que des outils internes utile pour développer sur le projet uniquement ?

Salut !

À partir du moment où tu vas mettre tes paquets sur PyPI et que ces paquets ont des dépendances (certes optionnelles), ça semble plutôt logique de mettre ces dépendances sur PyPI aussi. Si ça ne te pose pas de problème particulier, tu aurais tort de t’en priver :grinning:.

1 « J'aime »