设置指南

根据预期的使用场景,安装 Odoo 有多种方式。对于 Odoo 社区的开发者和 Odoo 员工来说,首选方式都是源码安装(从源代码运行 Odoo)。

重要

请按照贡献指南中的 环境设置 一节,为将本地更改推送到 Odoo 仓库准备好环境。

为教程调整环境

到目前为止,你应该已将源代码下载到两个本地仓库中,一个用于 odoo/odoo,一个用于 odoo/enterprise。这些仓库已设置为将更改推送到 GitHub 上预定义的 fork(分叉)。当你开始为代码库做贡献时,这会很方便,但在跟随教程的过程中,我们希望避免用培训材料污染它们。那么,让我们将你的更改推送到第三个仓库:odoo/tutorials。与前两个仓库一样,它将成为 addons-path 的一部分,该路径引用了所有包含 Odoo 模块的目录。

注解

根据你所跟随的教程,你可能不需要安装该仓库中包含的所有模块。

  1. 按照与 odoo/odoo 和 odoo/enterprise 仓库相同的过程,使用以下命令将 odoo/tutorials 仓库克隆到你的机器上:

    $ git clone git@github.com:odoo/tutorials.git
    
  2. 配置你的 fork 和 Git,将更改推送到你的 fork 而不是主代码库。如果你在 Odoo 工作,请配置 Git 将更改推送到在 odoo-dev 账户上创建的共享 fork。

    1. 访问 github.com/odoo/tutorials 并点击 Fork 按钮,在你的账户上创建该仓库的 fork。

    2. 在下面的命令中,将 <your_github_account> 替换为你创建 fork 时所用的 GitHub 账户名。

      $ cd /TutorialsPath
      $ git remote add dev git@github.com:<your_github_account>/tutorials.git
      

就这样!你的环境现在已经准备好从源代码运行 Odoo,并且你已成功创建了一个用作插件目录的仓库。这将允许你将工作成果推送到 GitHub。

重要

仅限 Odoo 员工:

  1. 务必非常仔细地阅读 做出您的第一个贡献。特别是,你的分支名称必须遵循我们的约定。

  2. 当你将首次更改推送到 odoo-dev 上的共享 fork 后,请创建一个 PR。请将你的 quadrigram 放入 PR 标题中(例如 “abcd - Technical Training”)。

    这将使你能够分享即将开展的工作,并从导师那里获得反馈。为确保反馈循环持续进行,我们建议你在完成教程的每一章后立即推送新的提交。请注意,PR 会自动更新你推送到 odoo-dev 的提交,你无需开启多个 PR。

  3. 在 Odoo,我们广泛使用 Runbot 进行 CI 测试。当你将更改推送到 odoo-dev 时,Runbot 会创建一个新的构建并测试你的代码。登录后,你将能看到你所在分支的 教程项目。

注解

仓库在你的文件系统中的具体位置并不重要。但为了简单起见,我们假设你将所有仓库克隆到同一目录下。如果不是这样,请相应地调整以下命令,提供从 odoo/odoo 仓库到 odoo/tutorials 仓库的合适相对路径。

运行服务器

使用 odoo-bin 启动

所有依赖设置好后,就可以通过运行 odoo-bin 来启动 Odoo,它是服务器的命令行界面。

$ cd $HOME/src/odoo/
$ ./odoo-bin --addons-path="addons/,../enterprise/,../tutorials" -d rd-demo

你可以使用多个 命令行参数 来运行服务器。在本培训中,你只需要其中的一部分。

-d <database>

将要使用的数据库。

--addons-path <directories>

以逗号分隔的目录列表,模块就存放在这些目录中。系统会在这些目录中扫描模块。

--limit-time-cpu <limit>

防止工作进程在处理每个请求时使用超过 <limit> 个 CPU 秒。

--limit-time-real <limit>

防止工作进程处理请求的时间超过 <limit> 秒。

小技巧

  • 在调试源代码时,可以使用 --limit-time-cpu 和 --limit-time-real 参数来防止工作进程被终止。

  • 你可能会遇到类似 AttributeError: module '<MODULE_NAME>' has no attribute '<$ATTRIBUTE'> 的错误。此时,你可能需要用 $ pip install --upgrade --force-reinstall <MODULE_NAME> 重新安装该模块。
    如果多个模块都出现此错误,你可能需要用 $ pip install --upgrade --force-reinstall -r requirements.txt 重新安装所有依赖项。
    你也可以清除 Python 缓存来解决该问题:
    $ cd $HOME/.local/lib/python3.8/site-packages/
    $ find -name '*.pyc' -type f -delete
    
  • 其他常用参数包括:

    • -i:在运行服务器之前安装一些模块(逗号分隔的列表)。这等同于在用户界面中进入 应用,并从那里安装该模块。

    • -u:在运行服务器之前更新一些模块(逗号分隔的列表)。这等同于在用户界面中进入 应用,选择一个模块并从那里升级它。

登录 Odoo

在浏览器中打开 http://localhost:8069/。我们推荐使用 Chrome、Firefox 或任何其他带开发者工具的浏览器。

要以管理员用户身份登录,请使用以下凭据:

  • 邮箱:admin

  • 密码:admin

启用开发者模式

开发者模式或调试模式对培训很有用,因为它可以访问额外的(高级)工具。现在请 启用开发者模式。选择你偏好的方法;这些方法都是等效的。

额外工具

常用的 Git 命令

以下是一些日常工作中常用的 Git 命令。

  • 切换分支:
    切换分支时,两个仓库(odoo 和 enterprise)必须同步,即两者需要处于同一分支。
    $ cd $HOME/src/odoo
    $ git switch 20.0
    
    $ cd $HOME/src/enterprise
    $ git switch 20.0
    
  • 拉取并变基:

    $ cd $HOME/src/odoo
    $ git fetch --all --prune
    $ git rebase --autostash odoo/20.0
    
    $ cd $HOME/src/enterprise
    $ git fetch --all --prune
    $ git rebase --autostash enterprise/20.0
    

代码编辑器

如果你在 Odoo 工作,你的许多同事都在使用 VSCode、VSCodium (开源替代品)、PyCharm 或 Sublime Text。不过,你可以自由选择自己喜欢的编辑器。

正确配置 linter 很重要。使用 linter 可以帮助你显示语法和语义方面的警告或错误。Odoo 源代码尽量遵循 Python 和 JavaScript 的标准,但其中有些标准可以忽略。

对于 Python,我们使用 PEP8,并忽略以下选项:

  • E501:行过长

  • E301:应为 1 个空行,实际为 0

  • E302:应为 2 个空行,实际为 1

对于 JavaScript,我们使用 ESLint,你可以在 此处找到配置文件示例。

PostgreSQL 管理工具

你可以像前面演示的那样使用命令行来管理 PostgreSQL 数据库,也可以使用 pgAdmin 或 DBeaver 等 GUI 应用程序。

要将 GUI 应用程序连接到你的数据库,我们建议使用 Unix socket 连接。

  • 主机名/地址:/var/run/postgresql

  • 端口:5432

  • 用户名:$USER

Python 调试

在遇到 bug 或试图理解代码如何工作时,简单地打印输出可能很有帮助,但一个合适的调试器可以节省大量时间。

你可以使用经典的 Python 库调试器(pdb、pudb 或 ipdb),也可以使用编辑器自带的调试器。

在下面的示例中我们使用 ipdb,但其他库的流程类似。

  1. 安装该库:

    pip install ipdb
    
  2. 放置触发器(断点):

    import ipdb; ipdb.set_trace()
    

    示例

    def copy(self, default=None):
        import ipdb; ipdb.set_trace()
        self.ensure_one()
        chosen_name = default.get('name') if default else ''
        new_name = chosen_name or _('%s (copy)') % self.name
        default = dict(default or {}, name=new_name)
        return super(Partner, self).copy(default)
    

以下是命令列表:

h(elp) [command]

如果未提供参数,则打印可用命令的列表。如果提供了命令作为参数,则打印该命令的帮助信息。

pp expression

expression 的值会使用 pprint 模块美化打印。

w(here)

打印堆栈跟踪,最近的帧位于底部。

d(own)

在堆栈跟踪中将当前帧向下移动一层(移动到较新的帧)。

u(p)

在堆栈跟踪中将当前帧向上移动一层(移动到较旧的帧)。

n(ext)

继续执行,直到到达当前函数中的下一行或该函数返回。

c(ontinue)

继续执行,仅在遇到断点时停止。

s(tep)

执行当前行。在第一个可能的时机停止(无论是在被调用的函数中,还是在当前函数的下一行)。

q(uit)

退出调试器。正在执行的程序会被中止。