Pregunta

He intentado para empaquetar una aplicación Django hoy. Es un bebé grande, y con el archivo de configuración, tengo que escribir manualmente todos los paquetes y paquetes de sub en el parámetro 'paquete'. Entonces tengo que encontrar una manera de copiar los accesorios, htmls / Css / archivos de imágenes, documentación, etc.

Es una forma terrible de trabajo. Somos expertos en computación, que automatizar, hacer esto no tiene sentido.

Y que cuando cambie la estructura de mi aplicación? Tengo que volver a escribir la setup.py.

¿Hay una mejor manera? Algunos herramienta para automatizar eso? No puedo creer que un idioma que no sea el tiempo el valor de desarrolladores como Python hace que el envasado de tal tarea.

Quiero ser capaz de instalar finalmente la aplicación a través de un pip sencilla instalación. Yo sé de construir, pero no es mucho más simple, y no se PIP usar.

¿Fue útil?

Solución

Por lo menos si se utilizan setuptools (una alternativa a distutils del stdlib) se conseguir una función increíble llamado find_packages() que cuando se corrió de la raíz del paquete devuelve una lista de nombres de paquetes en dot-notación adecuados para el parámetro packages.

Este es un ejemplo:

# setup.py

from setuptools import find_packages, setup

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

p.s. Embalaje chupa en cada lengua y cada sistema. Es un asco, no importa cómo se mire.

Otros consejos

He pasado por este dolor a mí mismo hoy. He utilizado el siguiente, yoinked directamente desde setup.py de Django, que camina sistema de archivos de la aplicación en busca de paquetes y archivos de datos (suponiendo que nunca se mezclan los dos):

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]])

Creo que la herramienta que está buscando es Buildout . Hay un montón de lugares donde se puede aprender más sobre él, de a href="http://pycon.blip.tv/file/2061520/" rel="nofollow"> Pycon vídeos .

Otras herramientas similares o relacionados que es posible que desee comprobar hacia fuera incluyen virtualenv, Tela, y PIP .

He estado haciendo un poco de investigación a mí mismo en los métodos de implementación de Django recientemente.

He encontrado estos dos recursos muy útiles:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top