Odoo 如何用 deploy 命令把本地模块打包成 zip 上传并安装到远程实例
【免费下载链接】odooOdoo. Open Source Apps To Grow Your Business.项目地址: https://gitcode.com/GitHub_Trending/od/odoo
当你有一个只包含数据、视图和静态资源的小型 Odoo 模块,想装到一台不在本地的 Odoo 实例上时,不需要把代码目录复制到服务器、改addons_path再重启。Odoo 自带的deploy命令行命令会做三件事:把本地模块目录打包成 zip、带登录凭据把 zip 上传到目标实例、由实例端自动解包并安装该模块。整个流程在 部署命令实现 中,服务端对应逻辑在 上传接口 里。本文按实际执行顺序说明前置条件、命令用法、服务端约束和结果判断。
deploy 命令内部做了什么
理解流程有助于判断报错出在哪一环,deploy.py 的执行链是:
- 打包:
zip_module()把模块目录里的所有文件写入一个临时 zip,每个文件在包内的路径是相对于模块的上级目录的,因此 zip 顶层会是一个以模块名命名的目录(如my_module/__manifest__.py)。路径不是目录时会抛出Could not find module directory '%s'。上传完成后这个临时 zip 会被删除。 - 登录定位数据库:先向
{url}/web/login?db={db}发起 GET 请求,把目标数据库写入会话。 - 上传:向
{url}/base_import_module/login_uploadPOST,把 zip 作为mod_file文件字段,并附带login、password、db、force字段。服务端鉴权通过后调用_import_zipfile()完成安装(见 ir_module.py)。
前置条件
- 目标实例已安装
base_import_module。该模块auto_install: True且依赖web(见manifest.py),常规 web 实例会自动带上。如果实例上没有它或版本过旧,命令会收到 404 并报错:The server '<url>' does not have the 'base_import_module' installed or is not up-to-date. - 使用管理员账号,且该账号未启用 MFA。服务端接口用密码登录,代码中明确
request.env.uid is None in case of MFA,此时会抛出Only administrators can upload a module;非管理员同样得到此错误。 - 本地运行
odoo-bin的环境已具备依赖。deploy模块直接import requests,requests在 requirements.txt 中是固定版本的依赖(Python < 3.11 为 2.25.1,>= 3.11 为 2.31.0),随 Odoo 的依赖一起安装即可。
命令格式与参数
命令行帮助信息(command.py 中命令的标准形式为odoo-bin [--addons-path=PATH,...] deploy)对应的参数如下:
./odoo-bin deploy <path> [url] [--db DB] [--login LOGIN] [--password PASSWORD] [--verify-ssl] [--force]| 参数 | 说明 |
|---|---|
path | 必填,模块目录路径("Path of the module to deploy"),必须是指向模块根目录本身,不是 addons 父目录 |
url | 可选,目标实例地址,默认http://localhost:8069;若不以http://或https://开头,命令会自动补上https://前缀 |
--db | "Database to use if server does not use db-filter.",服务器未配置 db-filter 时必须用它指定数据库 |
--login | 登录名,默认admin |
--password | 密码,默认admin |
--verify-ssl | 校验 SSL 证书;不加此参数时命令会把会话的verify设为False,即默认不校验证书 |
--force | "Force init even if module is already installed. (will updatenoupdate=\"1\"records)",对已安装模块强制重新初始化 |
执行示例
下面示例中./my_module是本机的模块根目录,http://odoo.example.com是远程实例地址,mydb是目标数据库,密码按实际账号替换:
./odoo-bin deploy ./my_module http://odoo.example.com \ --db mydb --login admin --password <你的admin密码>若实例启用了 HTTPS 且证书自签、不需要校验,可以加--verify-ssl与否按实际需要选择;向已装过该模块的实例重新初始化时加--force。命令执行时先打印Zipping module directory...和Uploading module file...,随后输出服务端返回的响应文本。
服务端对 zip 的约束
上传后,服务端 _import_zipfile 会按以下规则处理,不符合时直接报错:
- 只接受 zip 文件,且只有管理员可触发安装(
Only administrators can install data modules.)。 - zip 内任何单个文件超过 100 MB(
MAX_FILE_SIZE = 100 * 1024 * 1024)会报File '%s' exceed maximum allowed file size。 - manifest 文件必须位于 zip 的第二层,即
<模块名>/目录下(代码判断file.filename.count('/') == 1且文件名属于MANIFEST_NAMES)。deploy打包时天然生成这种结构,不要手动改包内路径。 - 实际导入的是 manifest 中
data、init_xml、update_xml声明的.xml、.csv、.sql文件,以及static/目录和i18n/下的.po文件。不会导入 demo 数据——deploy走的上传接口调用_import_zipfile时未启用with_demo。 - zip 里含多个模块时,会按 manifest 的
depends做拓扑排序逐个安装;某个目录找不到 manifest 时报No manifest found in '<modules>'. Can't import the zip file.。 - 单个模块导入失败时报
Error while importing module '<module>'.,并附带完整的 Python traceback,可按其中的数据错误定位修复。
结果验证
成功时命令不抛异常:打包与上传的两条进度提示后,服务端响应体为空(接口返回_import_zipfile()结果元组的第一个元素,即空字符串),不会打印额外内容。真正的确认要去实例端:该模块会以已安装状态出现在实例的应用列表(设置 → 应用)中,数据、视图和静态资源随之生效。
失败时表现为以下几类输出,均可在 deploy.py 和 controller 中对应到来源:
| 现象 | 含义 |
|---|---|
ERROR: The server '<url>' does not have the 'base_import_module' installed or is not up-to-date. | 实例未安装该模块或版本过旧,升级实例后重试 |
Could not find module directory '<path>' | 传入的path不是目录,检查是否误传了 addons 父目录 |
500 响应,Only administrators can upload a module | 账号不是管理员,或账号启用了 MFA(密码登录拿不到有效 uid),换用未启用 MFA 的管理员账号 |
500 响应,Could not select database ... | 会话里没有定位到数据库,服务器未用 db-filter 时补上--db |
500 响应,No manifest found in '...'/Error while importing module '...' | zip 结构或模块数据本身的问题,按报错中给出的 traceback 修改模块 |
限制与边界
- 该命令只负责打包、上传和安装,不会在目标服务器上保留模块源码目录;导入的模块以
ir.module.module记录形式存在于数据库里。 - demo 数据不会随
deploy上传导入(接口未启用with_demo);如需 demo,只能在实例端另行处理。 - 默认不校验 SSL 证书,对安全要求高的环境应显式加
--verify-ssl。 - 临时 zip 由命令在本地系统临时目录创建并在上传结束后删除,不需要手工清理。
相关源码入口:deploy 命令、上传接口、zip 安装实现、命令注册机制。
【免费下载链接】odooOdoo. Open Source Apps To Grow Your Business.项目地址: https://gitcode.com/GitHub_Trending/od/odoo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考