2010-03-12 13 views
6

¿Cómo puedo asegurarme de que setup.py compila los proyectos de los archivos PO e incluirlos cuando se crea un sdist? Esta es una aplicación Django y procesos manuales para generar archivos de MO es ejecutar comando siguiente en el directorio raíz de la aplicación:Cómo compilar las traducciones de gettext en setup.py de una aplicación de Django

django-admin compilemessages 

(Esto significa ir un nivel más profundo que setup.py)

me gustaría evite compilar manualmente los archivos MO cada vez. Y no quiero almacenarlos en el repositorio en absoluto.

Respuesta

3
from django.core.management.commands.compilemessages import compile_messages 

y utilizarlo en su script setup.py antes de ejecutar setup y después de incluir los archivos creados en setup método.

+1

La pregunta es sobre la automatización de esta tarea –

+0

La secuencia de comandos de instalación es una secuencia de comandos 'python' normal, por lo que puede usar código de' Django' dentro de ella. Considere 'setup.py' como un programa normal, cuyo objetivo es instalar su paquete y debe seguir varios pasos. Uno de ellos invoca 'compile_messages' from' Django'. Esto hará que la tarea de instalar el paquete se automatice; no es necesario que llame a 'django-admin compilemessages' antes de ejecutar' setup.py'. – gruszczy

5

Mi solución simple (tiene alguna idea de Trac):

#!/usr/bin/env python 
from setuptools import setup, find_packages 
from setuptools.command.install_lib import install_lib as _install_lib 
from distutils.command.build import build as _build 
from distutils.cmd import Command 


class compile_translations(Command): 
    description = 'compile message catalogs to MO files via django compilemessages' 
    user_options = [] 

    def initialize_options(self): 
     pass 

    def finalize_options(self): 
     pass 

    def run(self): 
     import os 
     import sys 
     from django.core.management.commands.compilemessages import \ 
      compile_messages 
     curdir = os.getcwd() 
     os.chdir(os.path.realpath('app_name')) 
     compile_messages(stderr=sys.stderr) 
     os.chdir(curdir) 


class build(_build): 
    sub_commands = [('compile_translations', None)] + _build.sub_commands 


class install_lib(_install_lib): 
    def run(self): 
     self.run_command('compile_translations') 
     _install_lib.run(self) 

setup(name='app', 
    packages=find_packages(), 
    include_package_data=True, 
    setup_requires=['django'], 
    ... 
    cmdclass={'build': build, 'install_lib': install_lib, 
     'compile_translations': compile_translations} 
) 

Esto le ayudará a compilar archivos po cuando la construcción de huevo o instalar el paquete.

+0

Parece genial. Voy a probar esto más tarde. Gracias. – muhuk

+0

Esto es bueno, pero falla al llamar a 'python setup.py install' mientras django no está instalado (El instalador intenta ejecutar el comando de instalación antes de instalar django) –

+0

agregué setup_requires = ['django'] para solucionarlo, usa este truco en https://bitbucket.org/slav0nic/djangobb/src/de8e836662e8c5e3a294717c24238b20f3cced47/setup.py?at=default – slav0nic

Cuestiones relacionadas