我正在使用Babel开发Flask应用程序.感谢Distutils/Setuptools Integration,compile / extract / …函数的所有参数都存储在setup.cfg中,并且编译i18n文件就像
./setup.py compile_catalog
大.现在我希望在运行时自动完成
./setup.py install
用make来说,那就是让安装目标依赖于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在安装时编译它们?
我在互联网上找不到很多帖子来解决这个问题.我发现的那些涉及从setup.py中的函数运行pybabel命令行界面,这听起来很遗憾,因为它错过了setuptools集成的重点.
解决方法:
我认为你的要求是完全有效的,我很惊讶似乎没有关于如何实现这一点的官方指导.
我现在工作的项目也是多语言的,这就是我所做的:
>在setup.cfg中,进行适当的输入,以便可以在没有选项的情况下运行compile_catalog.
>在setup.py中,从setuptools继承install命令:
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',
],
请注意,由于setuptools中的issue,使用python setup.py install将无法正确安装setup_requires和install_requires中出现的包(此处为babel),但它与pip install配合工作正常.