Question

J'ai essayé d'emballer une application django aujourd'hui. Il est un gros bébé, et avec le fichier de configuration, je dois écrire manuellement tous les paquets et les paquets de sous dans le paramètre « paquet ». Ensuite, je dois trouver un moyen de copier accessoires, htmls / Css / fichiers d'images, documentations, etc.

Il est une façon terrible de travail. Nous sommes des informaticiens, nous Automatiser, faisant cela n'a pas de sens.

Et quand je change ma structure d'application? Je dois réécrire le setup.py.

Est-il possible de mieux? Certains outils pour automatiser cela? Je ne peux pas croire une langue que la valeur temps de développement comme Python fait l'emballage d'une telle corvée.

Je veux pouvoir éventuellement installer l'application à l'aide d'un simple pépin installer. Je sais construire, mais ce n'est pas beaucoup plus simple, et est pip pas facile.

Était-ce utile?

La solution

À tout le moins si vous utilisez setuptools (une alternative à la distutils du stdlib) vous obtenir une fonction impressionnante appelée find_packages() qui lorsqu'il est lancé depuis le retour de la racine du paquet une liste de les paquets de dot-notation appropriés pour le paramètre packages.

Voici un exemple:

# setup.py

from setuptools import find_packages, setup

setup(
    #...
    packages=find_packages(exclude='tests'),
    #...
)

p.s. Emballage suce dans toutes les langues et tous les systèmes. Il suce peu importe comment vous le trancher.

Autres conseils

Je suis passé par cette douleur me aujourd'hui. Je suit, yoinked directement à partir de setup.py de Django, qui marche le système de fichiers de l'application à la recherche des paquets et des fichiers de données (en supposant que vous ne mélangez jamais les deux):

import os
from distutils.command.install import INSTALL_SCHEMES

def fullsplit(path, result=None):
    """
    Split a pathname into components (the opposite of os.path.join) in a
    platform-neutral way.
    """
    if result is None:
        result = []
    head, tail = os.path.split(path)
    if head == '':
        return [tail] + result
    if head == path:
        return result
    return fullsplit(head, [tail] + result)

# Tell distutils to put the data_files in platform-specific installation
# locations. See here for an explanation:
# http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
for scheme in INSTALL_SCHEMES.values():
    scheme['data'] = scheme['purelib']

# Compile the list of packages available, because distutils doesn't have
# an easy way to do this.
packages, data_files = [], []
root_dir = os.path.dirname(__file__)
if root_dir != '':
    os.chdir(root_dir)
myapp_dir = 'myapp'

for dirpath, dirnames, filenames in os.walk(myapp_dir):
    # Ignore dirnames that start with '.'
    for i, dirname in enumerate(dirnames):
        if dirname.startswith('.'): del dirnames[i]
    if '__init__.py' in filenames:
        packages.append('.'.join(fullsplit(dirpath)))
    elif filenames:
        data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])

Je pense que l'outil que vous recherchez est Buildout . Il a beaucoup d'endroits où vous pouvez en apprendre davantage à ce sujet, PyCon vidéos .

D'autres outils similaires ou connexes que vous pourriez vouloir vérifier include virtualenv, tissu et PIP .

Je fais un peu de moi-même la recherche sur les méthodes de déploiement de Django récemment.

J'ai trouvé ces deux ressources très utiles:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top