web-dev-qa-db-fra.com

Exigences de "développement" de Setuptools

TL; DR: Existe-t-il un moyen d'accrocher le "développement" de setuptool pour installer un ensemble d'exigences de développement lors de l'exécution de python setup.py develop?

Je construis mon premier python package en utilisant setuptools. Je spécifie les exigences comme:

requirements = [
    'click',
    'ansible',
    'fabric',
    'gitpython',
    'pyyaml',
    'jinja2',
    'yapsy'
]

test_requirements = [
    'pytest',
    'pytest-pep8',
    'pytest-cov',
]

setup(
...
    install_requires=requirements,
    tests_require=test_requirements,
...
)

Pendant le développement, j'ai installé le package (dans un environnement virtuel) avec:

python setup.py develop

et désinstallation avec:

python setup.py develop -u

Le package utilise les points d'entrée pour installer certains scripts de ligne de commande, donc cela configure les commandes pour moi et me permet de modifier le package tout en testant la commande en même temps.

J'ai également quelques dépendances que j'utilise pour le développement ... des extensions sphinx + et quelques autres choses (choses qui ne sont pas nécessaires pour utiliser le paquet). Je les installe simplement manuellement dans l'environnement virtuel pour le moment. Je n'ai vu aucune documentation (et je n'ai trouvé aucun exemple sur les googles) sur la façon de les connecter avec setuptools.

Peut-être existe-t-il un moyen d'accrocher 'setup.py develop' pour installer un ensemble supplémentaire d'exigences? Une autre méthode que je n'ai pas lue?

37
nfarrar

Pour plus d'informations sur l'utilisation de setup.py contre requirements.txt, J'ai trouvé cet article utile.

Mise à jour: septembre 2016

Je n'utilise plus requirements.txt (voir la réponse d'origine ci-dessous) pour l'installation de packages de développement uniquement. La sagesse dominante semble être que requirements.txt doit être utilisé pour épingler les déploiements à des numéros de version spécifiques, généralement à l'aide de pip freeze > requirements.txt. Cela garantit que les mêmes versions exactes des dépendances de votre projet ainsi que les dépendances des dépendances de votre projet sont installées sur tous vos serveurs.

J'utilise plutôt le extras_require option pour setup.

requirements = [
    'click',
    'ansible',
    'fabric',
    'gitpython',
    'pyyaml',
    'jinja2',
    'yapsy'
]

setup({
    install_requires=requirements,
    extras_require={
        'dev': [
            'pytest',
            'pytest-pep8',
            'pytest-cov'
        ]
    }
})

Maintenant, pour installer votre package pour le développement, vous exécutez pip install -e .[dev]. Cela installe tous les packages réguliers requis et ceux répertoriés dans la section dev de extras_require.

Les installations de production peuvent toujours être effectuées avec python setup.py install ou pip install . (ou avec un requirements.txt fichier).

Réponse originale

Voici a moyen de le faire qui semble être en accord avec les recommandations que j'ai rencontrées concernant setup.py contre requirements.txt. Spécifiez toutes vos dépendances de production dans le install_requires paramètre de setup.py.

requirements = [
    'click',
    'ansible',
    'fabric',
    'gitpython',
    'pyyaml',
    'jinja2',
    'yapsy'
]

setup({
    # ...
    install_requires=requirements
    # ...
})

Créez ensuite un requirements.txt fichier qui demande à pip d'installer vos dépendances de production à partir de setup.py ainsi que vos dépendances de test.

-e .

pytest
pytest-pep8
pytest-cov

Vous pouvez maintenant installer votre package pour le développement avec pip install -r requirements.txt. Le -e . line installera votre package et ses dépendances à partir de setup.py en mode développement. Pour installer en production, vous pouvez utiliser python setup.py install ou pip install .. Cela n'installera que les dépendances répertoriées dans setup.py.

69
Sean