web-dev-qa-db-fra.com

Comment puis-je installer à partir d'un sous-répertoire git avec pip?

J'ai un dépôt git avec de nombreux dossiers, l'un d'eux étant un module python installable avec pip, comme ceci:

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

En ce moment, je dois faire ce qui suit pour installer:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

Est-il possible d'installer le module directement avec pip sans clonage explicite?

J'ai essayé:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

Mais je reçois:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'
63

Il y a un pull request concernant cette fonctionnalité, et elle semble avoir été fusionnée pour développer une branche il y a un mois. La syntaxe est la suivante :

pip install -e git+https://git.repo/some_repo.git#Egg=version_subpkg&subdirectory=repo # install a python package from a repo subdirectory

Nous devons probablement attendre un certain temps jusqu'à ce qu'il soit fusionné avec master et distribué.

[~ # ~] mise à jour [~ # ~] : Ceci est maintenant disponible et documenté sur https://pip.readthedocs.io/en/stable/reference/pip_install/# vcs-support comme suit:

Pour les projets où setup.py n'est pas à la racine du projet, le composant "sous-répertoire" est utilisé. La valeur du composant "sous-répertoire" doit être un chemin partant de la racine du projet jusqu'à l'emplacement de setup.py.

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

- pkg_dir/
  - setup.py  # setup.py for package ``pkg``
  - some_module.py
- other_dir/
  - some_file
- some_other_file

Vous devrez utiliser

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

Remarque: Sous Windows, vous devez placer l'URL entre guillemets doubles, sinon vous obtiendrez une erreur "le sous-répertoire n'est pas reconnu comme une commande interne ou externe". Par exemple, utilisez:

pip install -e "vcs+protocol://repo_url#Egg=pkg&subdirectory=pkg_dir"
86
Dennis Golomazov

Il a déjà été indiqué dans l'un des commentaires sous la bonne réponse, mais juste pour souligner ce problème: lors de l'exécution de cela à partir de la ligne de commande Linux, vous devez échapper au &- car l'esperluette indique à la ligne de commande d'exécuter une commande en arrière-plan:

git+https://git.repo/some_repo.git#Egg=version_subpkg\&subdirectory=repo

Remarquez la barre oblique inverse avant l'esperluette. Le comportement d'échappement peut dépendre de la distribution Linux; Je ne suis pas un expert.
Si vous l'ignorez, vous pourriez rencontrer une erreur cryptique comme celle-ci:

bash: (...) command not found
14
rinderwahn