2010-03-12 58 views
6

如何确保setup.py编译项目PO文件并在创建sdist时包含它们。这是一个Django应用程序和手工工艺生成MO文件是在应用程序的根目录中运行以下命令:如何编译Django应用程序的setup.py中的gettext转换

django-admin compilemessages 

(这意味着我们要一个级别比setup.py深)

我想避免每次手动编译MO文件。我不想将它们存储在存储库中。

回答

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

,你在setup方法运行之前setup然后包括创建的文件用它在你的setup.py脚本。

+1

问题是关于自动执行这个任务 – 2014-04-06 13:09:11

+0

安装脚本是一个普通的'python'脚本,所以你可以使用里面的'Django'代码。考虑一下'setup.py'一个正常的程序,其目标是安装你的软件包,并且必须遵循各种步骤。其中一个是从'Django'调用'compile_messages'。这将使安装包自动化的任务 - 在运行'setup.py'之前,您不需要调用'django-admin compilemessages'。 – gruszczy 2014-04-06 15:38:35

5

我简单的解决方案(得到了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} 
) 

这将帮助你编译PO文件,当您建立卵子或安装包。

+0

看起来很酷。我稍后再试一试。谢谢。 – muhuk 2013-03-21 05:10:30

+0

这很好,但是当django没有安装时调用'python setup.py install'失败(安装程序试图在安装django之前运行安装命令) – 2014-04-06 13:28:17

+0

我添加了setup_requires = ['django']来解决这个问题,使用这个技巧在https://bitbucket.org/slav0nic/djangobb/src/de8e836662e8c5e3a294717c24238b20f3cced47/setup.py?at=default – slav0nic 2014-04-07 08:56:57