我正在使用Babel开发Flask应用程序。感谢Distutils/Setuptools Integration,编译/提取/ ...函数的所有参数都存储在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
来在安装时编译它们?
我在互联网上找不到很多帖子来解决这个问题。我发现的那些涉及从pybabel
中的函数运行setup.py
命令行界面,这听起来很遗憾,因为它错过了setuptools集成的重点。
答案 0 :(得分:5)
我认为你的要求是完全有效的,我很惊讶似乎没有关于如何实现这一目标的官方指导。
我现在正在进行的项目也是多语言的,这就是我所做的:
在setup.cfg
中,输入相应的条目,以便{?1}}无需选项即可运行。
在compile_catalog
中,从setup.py
继承安装命令:
setup.py:
setuptools
然后,在调用setup()时,使用名称" install"注册我们的InstallWithCompile命令。并确保* .mo文件将包含在包中:
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()
由于在设置过程中使用了babel,因此您应该将其添加为设置依赖项:
setup(
...
cmdclass={
'install': InstallWithCompile,
},
...
package_data={'': ['locale/*/*/*.mo', 'locale/*/*/*.po']},
)
请注意,setup_requires=[
'babel',
],
和setup_requires
中出现的一个包(此处为babel)由于issue install_requires
而无法使用python setup.py install
正确安装{1}},但它适用于setuptools
。