调用 setup.py install 时编译翻译文件

compile translation files when calling setup.py install

我正在使用 Babel 开发 Flask 应用程序。感谢 Distutils/Setuptools Integration,compile/extract/... 函数的所有参数都存储在 setup.cfg 中,编译 i18n 文件就像

一样简单
./setup.py compile_catalog

太棒了。现在我希望在 运行

时自动完成此操作
./setup.py install

make的话来说就是让install目标依赖于compile_catalog目标。

上下文

我们在代码存储库中仅存储翻译 (.po) 文件。 .gitignore 从跟踪中排除 .mo.pot 个文件。

当开发人员提取代码的新修订时,他运行

pip install -r requirements.txt

更新依赖项并在开发模式下安装项目。然后,使用上面的命令行,他编译了翻译二进制(.mo)文件。

是否有一种简单且推荐的方法来修改setup.py以一步完成这两个操作?还是我想滥用 setuptools?

使用类似这样的脚本可用于开发目的:

#!/bin/sh
./setup.py compile_catalog
pip install -r requirements.txt

但我想要一个解决方案,该解决方案在使用通常的 setup.py 安装说明安装软件包时也能正常工作,就像从 PyPi 安装一样。

我应该明白 setuptools 不应该像这样使用吗,分发软件的人在创建档案时手动或使用自定义脚本编译他们的翻译文件,而不是依赖 setup.py 在安装时编译它们?

我在 Internet 上没有找到很多解决此问题的帖子。我发现的那些涉及 运行 pybabel 来自 setup.py 中函数的命令行界面,这听起来很遗憾,因为它错过了 setuptools 集成的要点。

我认为你的要求是完全正确的,我很惊讶似乎没有关于如何实现这一点的官方指南。

我现在从事的项目也支持多种语言,这就是我所做的:

  • setup.cfg 中进行适当的输入,这样 compile_catalog 可以 运行 没有选项。

  • setup.py 中,从 setuptools 继承安装命令:

setup.py:

from setuptools import setup
from setuptools.command.install import install

class InstallWithCompile(install):
    def run(self):
        from babel.messages.frontend import compile_catalog
        compiler = compile_catalog(self.distribution)
        option_dict = self.distribution.get_option_dict('compile_catalog')
        compiler.domain = [option_dict['domain'][1]]
        compiler.directory = option_dict['directory'][1]
        compiler.run()
        super().run()

然后,在调用 setup() 时,使用名称 "install" 注册我们的 InstallWithCompile 命令,并确保 *.mo 文件将包含在包中:

setup(
    ...
    cmdclass={
        'install': InstallWithCompile,
    },
    ...
    package_data={'': ['locale/*/*/*.mo', 'locale/*/*/*.po']},
)

由于在设置过程中使用了 babel,您应该将其添加为设置依赖项:

setup_requires=[
    'babel',
],

请注意,由于 issue setuptools,但它适用于 pip install