使用UV打包项目时如何正确包含Jinja2模板文件
使用UV打包项目时如何正确包含Jinja2模板文件
嗨,我来帮你搞定这个UV打包时包含Jinja2模板的问题~你现在把模板嵌在py文件字符串里的 workaround 虽然能用,但模板复杂后维护起来肯定头疼,下面是更规范、省心的解决方案:
问题根源
你的j2模板目录虽然在包结构里,但UV(底层兼容setuptools打包逻辑)默认不会自动把非.py的资源文件包含进发布包,导致打包后代码找不到模板文件,才需要用字符串硬编码的方式绕路。
第一步:修改pyproject.toml,配置打包时包含模板文件
在你的pyproject.toml里新增package-data配置,告诉打包工具把mypackage下j2目录的所有文件都纳入打包范围。修改后的完整配置如下:
[project] name = "dojipipeline" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [ "groq>=0.16.0", "jinja2>=3.1.5", "pydantic>=2.10.6", "python-dotenv>=1.0.1", "pyyaml>=6.0.2", ] # 新增:指定要包含的包内资源文件 [tool.setuptools.package-data] "mypackage" = ["j2/**/*"]
这个配置的意思是:给mypackage包递归包含j2目录下的所有层级文件。
第二步:在代码里正确加载Jinja2模板
不用再把模板写在字符串里了,直接用Jinja2的PackageLoader加载包内的模板文件,示例代码如下:
from jinja2 import Environment, PackageLoader # 初始化Jinja2环境,指定包名和模板所在的子目录 env = Environment(loader=PackageLoader("mypackage", "j2")) # 加载具体的模板文件(比如你的模板叫generate_data_model.j2,放在j2目录下) template = env.get_template("generate_data_model.j2") # 渲染模板,传入需要的变量 rendered_content = template.render( tasks=tasks_list, contexts=contexts_list, data_shema=data_shema_obj )
第三步:验证打包结果
运行uv build生成包后,你可以解压生成的.whl文件,检查mypackage/j2/目录下的模板文件是否被正确包含进去,确认没问题后就可以正常使用了。
这种方式下,模板文件可以单独维护,编辑器的语法高亮、格式检查功能都能正常用,代码也会整洁很多~
备注:内容来源于stack exchange,提问作者Rembau Times
相关产品推荐
相关产品推荐

