Odoo14开发者指南第二章-管理Odoo服务器实例【翻译】
在第一章,安装Odoo开发环境中,我们研究了如何仅使用源附带的标准核心插件来设置Odoo实例。本章着重于向Odoo添加非核心或自定义插件。在Odoo中,您可以从多个目录加载add-ons,此外,建议使用单独的文件夹加载第三方add-ons或自己的自定义add-ons,以免与Odoo核心模块发生冲突。
在本章中,我们将介绍以下Recipes:
配置add-ons路径;
标准化您的实例目录布局;
安装和升级本地的add-ons;
从GitHub安装add-ons;
将更改应用到add-ons;
应用并尝试建议的拉取请求。
有关术语
在本书中,我们将交替使用(插件)add-no或(模块)module或(应用)app或(插件模块)add-on module这些术语。这些属于都代表一个意思,就是可以从用户界面安装的Odoo应用程序或者Extension应用程序。
配置add-ons路径
借助addons_path参数,您可以将自己的附加模块加载到Odoo中。当Odoo初始化新数据库时,它将在addons_path配置参数提供的目录中搜索附加模块。
addons_path中列出的目录应该包含子目录,每个子目录都是一个附加模块。在数据库初始化之后,您将能够安装这些目录中提供的模块。
准备工作
此Recipes假定您已准备好一个实例,并且已生成一个配置文件,如第1章的安装Odoo开发环境中的在文件配方中存储实例配置中所述。请注意,Odoo的源码目录是~/odoo-dev/odoo
,Odoo配置文件目录是~/odoo-dev/myodoo.cfg
。
如何配置add-no路径
要将~/odoo-dev/loacl-addons
目录添加到实例的addons-path配置中,需要以下步骤:
编辑你的实例的配置文件
~/odoo-dev/myodoo.cfg
;找到以 addons_path= 开头的行,默认情况下,它应如下所示:
1
addons_path = ~/odoo-dev/odoo/addons
用逗号分隔,后跟要添加到addons_path的目录的名称,如以下代码所示:
1
addons_path = ~/odoo-dev/odoo/addons,~/odoo-dev/local-addons
重启你的实例:
1
$ ~/odoo-dev/odoo/odoo-bin -c my-instance.cfg
运行原理
当Odoo实例重启后,它会读取配置文件的addons_path变量并根据逗号分隔各个值。addons_path可以使用相对路径,但它们是相对于当前工作目录的,因此应避免在配置文件中使用。
至此,我们只添加了add-on目录 ~/odoo-dev/local-addons
但是该目录中还没有模块。甚至在该目录下添加了新的模块,也不会显示在Odoo的用户界面中。为此,您需要执行额外的操作,我们将在下一部分更新插件模块列表中会进行讲解。
这背后的原因是,当初始化新数据库时,Odoo会自动在可用模块中列出您的自定义模块,但是如果在数据库初始化后添加新模块,则需要手动更新可用模块列表。
更多内容
当你使用odoo-bin
脚本来初始化新的数据库时,你可以在命令行输入--addons-path
参数和以逗号分隔的插件目录。这样做Odoo会根据参数的内容来初始化插件目录。执行此操作时,必须显式包括基本加载项目录(odoo/odoo/addons)和核心加载项目录(odoo/addons)。与前面的方法的一个小区别是本地附加组件不能为空;它们必须至少包含一个子目录,该子目录具有附加模块的最小结构。
在第三章,创建Odoo附加模块,我们会介绍如何创建自己的模块,这里顺便介绍一些如何创建一个满足Odoo需求的模块的快捷方法:
1 | $ mkdir -p ~/odoo-dev/local-addons/dummy |
您可以使用--save
选项将路径保存到配置文件:
1 | $ odoo/odoo-bin -d mydatabase \ |
这里我们使用的是相对路径,保存时Odoo会自动转换为绝对路径存放到配置文件中。
标准化您的实例目录布局
这个方法创建了一个结构化的目录,该目录将将相似生命周期或相似用途的文件分组放在特点的子目录中。
这个方法仅在你想使用类似的文件夹结构来管理开发环境和生产环境时使用,如果你不想可以跳过。
当然这个文件结构不是强制要求的,你可以根据你的需求更改此结构。
如何标准化你的实例目录布局
要创建标准的实例布局,你需要执行以下步骤:
为每个实例创建一个目录:
1
2$ mkdir ~/odoo-dev/projectname
$ cd ~/odoo-dev/projectname创建Python虚拟环境:
1
$ python3 -m venv env
创建子目录:
1
$ mkdir src local bin filestore logs
子目录功能如下:
- src/: 它包含Odoo本身的克隆,以及各种第三方附加项目。
- local/: 这用于保存您的实例特定的插件。
- bin/: 这包括各种帮助程序可执行的Shell脚本。
- filestore/: 这用作文件存储。
- logs/ (可选): 这用作服务日期存储。
克隆Odoo源码和安装需求(详情可参考第一章,安装Odoo开发环境):
1
2
3$ git clone -b 14.0 --single-branch --depth 1
https://github.com/odoo/odoo.git src/odoo
$ env/bin/pip3 install -r src/odoo/requirements.txt保存以下代码到bin/odoo:
1
2
3
PYTHON=$ROOT/env/bin/python3 ODOO=$ROOT/src/odoo/odoo-bin
$PYTHON $ODOO -c $ROOT/projectname.cfg "$@" exit $?为bin/odoo添加可执行权限:
1
$ chmod +x bin/odoo
创建一个空的名为dummy的本地模块:
1
2
3
4$ mkdir -p local/dummy
$ touch local/dummy/ init .py
$ echo '{"name": "dummy", "installable": False}' >\
local/dummy/ manifest .py为你的实例创建配置文件:
1
2
3$ bin/odoo --stop-after-init --save \
--addons-path src/odoo/odoo/addons,src/odoo/addons,local \
--data-dir filestore添加.gitignore文件,用于告诉GitHub排除给定目录,以便在提交代码时Git会忽略这些目录,例如: filestore/, env/, logs/ 和 src/ 。
1
2
3
4
5
6
7
8
9
10
11
12# dotfiles, with exceptions:
.*
!.gitignore
# python compiled files
*.py[co]
# emacs backup files
*~
# not tracked subdirectories
/env/
/src/
/filestore/
/logs/为你的实例创建一个Git仓库并添加文件到Git仓库:
1
2
3$ git init
$ git add .
$ git commit -m "initial version of projectname"
运行原理
我们会生成一个干净的目录结构,其中包含明确标记的目录和专门的角色。我们使用不同的目录来存储以下内容:
- 由其他人管理的代码(放在 src/ 目录下);
- 本地相关的代码;
- 实例的文件存储。
为每个项目都创建一个Python虚拟环境,我们可以确保项目的依赖关系不会干扰到其他不同版本的Odoo实例,这个Python虚拟环境只会占有少量的硬盘空间。
以类似的方式,通过为我们的不同项目使用Odoo和第三方加载项模块的单独克隆,我们能够使它们各自独立发展,并且仅在需要它们的实例上安装更新,从而降低了发生更新回退的风险。
bin/odoo脚本不仅使我们无需记住各种路径或激活Python虚拟环境即可运行服务器,也为我们设置了配置文件。您可以在其中添加其他脚本来帮助您进行日常工作。例如,您可以添加脚本来检查运行实例所需的其他第三方项目。
关于配置文件,我们仅展示了在此处设置的最小化的选项,您也可以设置更多的选项,例如数据库名称,数据库过滤器或项目侦听的端口。详情可参考第一章,安装Odoo开发环境,以获取有关此主题的更多信息。
最后,通过在Git仓库中管理所有这些内容,将设置复制到另一台计算机上并在团队之间共享开发变得非常容易。
为了方便项目创建,您可以创建一个包含空结构的模板存储库,并为每个新项目fork该存储库。这将使您不必重新键入bin/odoo脚本,.gitignore文件以及所需的任何其他模板文件(连续集成配置,README.md,ChangeLog等)。
更多内容
复杂模块的开发需要各种配置选项,每当您尝试使用任何配置选项时,都会导致更新配置文件。 频繁更新配置文件可能会让人头疼,为避免这种情况,另一种方法是从命令行传递所有配置选项,如下所示:
手动激活Python虚拟环境:
1
$ source env/bin/activate
进入Odoo源码目录:
1
$ cd src/odoo
运行Odoo服务:
1
2./odoo-bin --addons-path=addons,../../local -d test-14 -i
account,sale,purchase --log-level=debug
在第3步中,我们直接在命令行中输入了一些选项,第一个是--add-ons-path
,它会加载Odoo的核心插件目录addons以及你的本地的插件目录,您将在其中放置自己的加载项模块。-d
选项将使用test-14数据库或创建一个新数据库(如果数据库不存在)-i
选项将安装account,sale 和 purchase模块。接下来,我们传递了日志级别的选项,并设置了日志级别为debug,以便在日志中显示更多信息。
通过使用命令行,您可以快速更改配置选项。您还可以在终端中查看实时日志。 有关所有可用选项,请参阅可参考第一章,安装Odoo开发环境,或使用--help
命令查看所有选项的列表以及每个选项的描述。
安装和升级本地附加模块
Odoo的核心功能来自其附加模块,您可以从Odoo本身中获得大量附加模块,以及可以从App Store下载或自己编写的附加模块。
在这个Recipe中,我们会介分别绍如何通过web界面和命令行的方式去安装和更新这些附加模块。
使用命令行执行这些操作的主要好处包括:一次可以操作多个插件,并在安装或更新的过程中可以清晰的查看服务日子,这在开发模式下或编写实例安装脚本时非常有用。
准备工作
确保您有一个正在运行的Odoo实例,其数据库已初始化并且正确设置了附加组件路径。在本教程中,我们将安装/升级一些附加模块。
如何安装和升级
有两种可能的方法来安装或更新加载项-您可以使用Web界面或命令行。
使用Web界面安装和更新
使用Web界面安装新的附件模块,你需要进行以下操作:
使用管理员账号登陆你的Odoo实例,进入应用菜单:
搜索你要安装的附加模块,下面是一些提示帮助你完成这个步骤:
- 激活未安装过滤器。
- 如果您正在寻找特定的功能附加组件,而不是广泛的功能附加组件,请删除应用程序过滤器。
- 在搜索栏输入模块的名称作为模块的过滤器。
- 您可能会发现使用列表视图使内容更具可读性。
点击模块名下面的安装按钮。
请注意,某些Odoo附加模块具有外部Python依赖关系。如果您的系统中未安装Python依赖关系,则Odoo将中止安装并显示以下对话框:
通过安装相关的Python依赖来修复它。
要更新数据库中的预安装模块,请执行以下步骤:
使用管理员账号登陆你的Odoo实力,进入应用菜单;
点击应用:
搜索你要安装的附加模块,下面是一些提示帮助你完成这个步骤:
激活已安装过滤器。
如果您正在寻找特定的功能附加组件,而不是广泛的功能附加组件,请删除应用程序过滤器。
在搜索栏输入模块的名称作为模块的过滤器。例如,这里我们输入CRM。
您可能会发现使用列表视图使内容更具可读性。
点击应用卡片右上角的三点,在弹出的菜单中选择*更新。
激活开发者模式以查看模块的技术名称。如果您不知道如何激活开发人员模式,请参考第一章,安装Odoo开发环境:
激活开发者模式后,它将以红色显示该模块的技术名称。如果您使用的是Odoo Community Edition,则您会看到一些带有升级按钮的其他应用程序。这些应用程序是Odoo Enterprise Edition应用程序,如要安装/使用它们您需要购买许可证。
使用命令行安装和更新
使用命令行界面安装新的附件模块,你需要进行以下操作:
查找附件模块的名称。模块名称的定义是
__manifest__.py
文件所在的目录名称,不带前导路径。关闭Odoo实例,如果你是在生产环境中操作,请先进行数据库备份。
执行以下命令:
1
2$ odoo/odoo-bin -c instance.cfg -d dbname -i addon1,addon2 \
--stop-after-init如果你在配置文件中设置了数据库名称,你可以忽略
-d
选项。重启Odoo实例。
要更新数据库中的预安装模块,请执行以下步骤:
查找附件模块的名称。模块名称的定义是
__manifest__.py
文件所在的目录名称,不带前导路径。关闭Odoo实例,如果你是在生产环境中操作,请先进行数据库备份。
执行以下命令:
1
2$ odoo/odoo-bin -c instance.cfg -d dbname -u addon1 \
--stop-after-init如果你在配置文件中设置了数据库名称,你可以忽略
-d
选项。重启Odoo实例。
运行原理
附加模块的安装和更新是两个紧密相关的过程,但是有一些重要的区别,如以下两节所强调。
安装
当您安装插件时,Odoo会检查其可用附件列表中是否有带有提供名称的未安装的插件,还会检查该插件的依赖项,如果有依赖项,它将以递归方式安装它们。
单个模块的安装过程包括以下步骤:
- 如果有,运行插件的preinit挂钩。
- 从Python源代码加载模型定义,并在必要时更新数据库结构(有关详细信息,请参见第4章,应用程序模型)。
- 加载插件的数据文件,并在必要时更新数据库内容(有关详细信息,请参见第6章,管理模块数据)。
- 如果实例中已启用演示数据,安装附加演示数据。
- 如果有,运行插件的preinit挂钩。
- 对附加插件的视图定义进行验证。
- 如果启用了演示数据并启用了测试,运行附加组件的测试(有关详细信息,请参见第18章,自动测试用例)。
- 更新数据库中的模块状态。
- 从附加组件的翻译中更新数据库中的翻译(有关详细信息,请参见第11章,国际化)。
在
__manifest__.py
文件中分别使用pre_init_hook和post_init_hook key 定义了preinit和postinit hooks。 这些钩子用于在安装附加模块之前和之后调用Python函数。要了解有关init钩子的更多信息,请参阅第3章,创建Odoo附加模块。
更新
更新插件时,Odoo会在可用插件模块列表中检查给定名称的已安装附件,还检查该附件的反向依赖关系(这些插件是取决于要更新的插件)。如果有的话,它也会递归地更新它们。
单个模块的更新过程包括以下步骤:
- 运行附加模块的预迁移步骤(如果有)(有关详细信息,请参见第6章,管理模块数据)。
- 从Python源代码加载模型定义,并在必要时更新数据库结构(有关详细信息,请参见第4章,应用程序模型)。
- 加载插件的数据文件,并在必要时更新数据库的内容(有关详细信息,请参见第6章,管理模块数据)。
- 如果实例中启用了演示数据,则更新加载项的演示数据。
- 如果您的模块有任何迁移方法,请运行附加的迁移后步骤(有关详细信息,请参阅第6章,管理模块数据)。
- 对加载项的视图定义进行验证。
- 如果启用了演示数据并启用了测试,请运行附加组件的测试(有关详细信息,请参见第18章,自动测试用例)。
- 更新数据库中的模块状态。
- 从附加组件的翻译中更新数据库中的翻译(有关详细信息,请参见第11章,国际化)。
请注意,更新未安装的附加模块根本没有任何作用,但是,安装已安装的附加模块会重新安装该附加模块,这可能会对某些包含文件数据的数据文件产生意外影响应该由用户更新,而不是在常规模块更新过程中更新(请参阅第6章,管理模块数据中的使用noupdate和forcecreate标志配方)。这种情况一般发生在从命令行界面更新模块,Web界面更新不会发生这种错误的风险。
更多内容
请谨慎处理依赖项。考虑一个情况您要在实例中安装sale,sale_stock和sale_specific模块,sale_specific依赖于sale_stock,sale_stock依赖于sale。要安装这三个组件,您只需要安装sale_specific,因为它将递归地安装sale_stock和sale依赖项。要更新所有三个,您需要更新sale,因为这将递归更新反向依赖关系sale_stock和sale_specific。
管理依赖项的另一个棘手的部分是,当您向已经安装了版本的加载项中添加依赖项时。让我们继续前面的示例来理解这一点,假设您在sale_specific中添加了对stock_dropshipping的依赖关系。更新sale_specific加载项不会自动安装新的依赖关系,也不会请求安装sale_specific。在这种情况下,您会收到非常讨厌的错误消息,因为未能成功加载插件的Python代码,但是数据库中存在加载项的数据和模型表。要解决此问题,您需要停止实例并手动安装新的依赖项。
从GitHub安装插件模块
GitHub是第三方加载项的绝佳来源。许多Odoo合作伙伴使用GitHub在内部共享他们维护的插件,Odoo社区协会(OCA)在GitHub上集体维护了数百个插件。在开始编写自己的插件之前,请确保已检查是否存在可以直接使用的内容。
此教程将向您展示如何从GitHub克隆OCA的合作伙伴的项目,以及如何在您的实例中使用其中包含的附加模块。
准备工作
假设您要向客户(合作伙伴)表单添加新字段。通常情况下,Odoo客户模型没有性别字段,如果要添加性别字段,则需要创建一个新模块。幸运的是,邮件列表中的某人向您介绍了partner_contact_gender附加模块,该模块由OCA维护,作为 **partner-contact ** 联系项目的一部分。
此教程中使用的路径遵循了标准化实例目录布局教程中建议的布局。
如何实现
安装 partner_contact_gender 模块,你需要执行以下步骤:
进入你的项目目录:
1
$ cd ~/odoo-dev/my-odoo/src
克隆 partner-contact 项目的14.0分支代码到 src/ 目录:
1
2$ git clone --branch 14.0 \
https://github.com/OCA/partner-contact.git src/partner-contact更改附件路径以包括该目录并更新实例的附件列表(请参阅本章中的配置附件路径配方和更新附件模块列表教程)。 instance.cfg的内容应如下所示:
1
2
3
4addons_path = ~/odoo-dev/my-odoo/src/odoo/odoo/addons, \
~/odoo-dev/my-odoo/src/odoo/addons, \
~/odoo-dev/my-odoo/src/, \
~/odoo-dev/local-addons安装partner_contact_gender附加插件(如果您不知道如何安装该模块,请查看上一教程安装和升级本地附加模块)。
运行原理
所有Odoo社区协会代码存储库的插件模块都包含在单独的子目录中,这与Odoo对附件路径中的目录所期望的一致。因此,只需将存储库克隆到某个位置,然后将该位置添加到附加组件路径中就足够了。
更多内容
一些维护者采用不同的方法,每个存储库都有一个附加模块,位于存储库的根目录中。在这种情况下,您需要创建一个新目录,将其添加到加载项路径,并从该目录中所需的维护者中克隆所有加载项。请记住,每次添加新的存储库克隆时,都要更新插件模块列表。
将更改应用到模块
GitHub上可用的大多数附件都可能会发生更改,并且不遵循Odoo为其稳定版本强制执行的规则。他们可能会收到错误修复或增强功能,包括您提交的问题或功能请求,并且这些更改可能会在数据文件和视图中引入数据库架构更改或更新。本教程将介绍如何安装更新的版本。
准备工作
假设您报告了partner_contact_gender的一个问题,并且收到有关该问题已在partner-contact项目的14.0分支的最新版本中解决的通知。在这种情况下,你想更新你的实例到最新的版本。
如何操作
要将应用于来自GitHub的模块的源代码修改,您需要执行以下步骤:
停止你的Odoo实例。
如果这是生产数据库,请先进行数据库备份(请参阅第1章,安装Odoo开发环境中的管理Odoo服务器数据库教程)。
进入partner-contact模块目录:
1
$ cd ~/odoo-dev/my-odoo/src/partner-contact
为项目创建一个本地标签,以便万一发生问题可以恢复到该版本:
1
2$ git checkout 14.0
$ git tag 14.0-before-update-$(date --iso)获取最新版本的代码:
1
$ git pull --ff-only
更新数据库中的partner_address_street3模块(请参阅安装和升级本地加载项模块教程)。
运行原理
通常,模块的开发人员有时会发布该加载项的最新版本。此更新通常包含错误修复和新功能。在这里,我们将获得该插件的新版本并在我们的实例中对其进行更新。
如果git pull --ff-only
失败,则可以使用以下命令还原到以前的版本:
1 | $ git reset --hard 14.0-before-update-$(date --iso) |
然后,您可以尝试git pull
(不带--ff-only
),这将导致合并,但这意味着您的模块本地代码被修改过。
也可以看看
如果更新步骤中断,请参阅第1章,安装Odoo开发环境中的从源代码更新Odoo以获得恢复说明。请记住,始终先对生产环境的数据库副本进行更新测试。
应用并尝试建议的Pull Requests
在Github的世界里,一个Pull Request(PR)是由开发者提出的请求,以便项目的维护者可以加入一些新的开发。例如一个PR可以修复Bug或者添加新的特性。这些请求在被合并到主分支之前都会进行审查和测试。
本节我们会介绍怎么应用一个PR到你的Odoo项目,以测试一个改进或修复一个错误。
准备工作
就像之前的教程一样,假设你报告了一个 Partner_address_street3 的问题,并且受到一个通知,说这个问题已经在PR中解决了,但是还没被合并到14.0分支中。
开发者要求你严重PR #123中的修复。你需要用这个分支更新一个测试实例。
你不应该直接在生产数据库上尝试这种分支,所以首先要创建一个测试环境和生产数据库副本(详情可参考第一章,安装Odoo开发环境)。
如何实现
要实现应用Github PR到模块上你需要进行以下步骤:
停止实例。
进入模块所在目录:
1
$ cd ~/odoo-dev/my-odoo/src/partner-contact
为项目创建一个本地tag,以便你出现问题可以恢复到当前版本:
1
2$ git checkout 14.0
$ git tag 14.0-before-update-$(date --iso)拉取请求分支,最简单的方法就是使用PR的编号,这个编号应该是由开发者告知你的,在本例子中我们的PR号为123:
1
$ git pull origain pull/123/head
重启实例后更新 partner_contact_gender1 模块(如果你不知道怎么操作,可参考安装和升级本地附件模块小节)。
测试更新,尝试重现你的问题,或者尝试你想要的新功能。
如果不能正常运行,可以到Github的PR页面进行评论,向开发者说明你做了什么和什么不能正常运行以便开发者更新PR。
如果能正常运行,也要评论PR页面,这是PR验证过程中必不可少的一部分,它将加快主分支的合并速度。
运行原理
我们使用的是GitHub的一个特性,可以使用 pull/nnnn/head 分支名按编号拉取PR,其中nnnn是PR的编号。Git pull命令会将远程分支合并到我们的分支中,应用我们代码库中的改动。在这之后,我们更新附加模块,测试它,并向作者汇报任何失败或成功的变化。
更多内容
如果你想同时测试不同的PR你可以重复上述教程的第4步。如果你对测试结果很满意,你可以创建一个分支来保留对应用的更改:
1 | $ git checkout -b 14.0-custom |
使用不同的分支可以协助你记住你使用的不是Github的版本,而是你自定义的版本。
git branch
命令可以用于列出你的本地仓库的所有分支。从此,如果你需要应用Githun 14.0的最新版本代码,你需要使用以下命令(不带–ff-only):
1 $ git pull origin 14.0
Odoo14开发者指南第二章-管理Odoo服务器实例【翻译】