容器

概览

每个构建都在自己的容器中进行隔离(Linux 命名空间容器)。

基础系统是Ubuntu,安装了Odoo所需的所有依赖项以及常用的有用软件包。

如果您的项目需要额外的Python依赖项或更近的版本,您可以在根目录下定义一个 requirements.txt 文件,列出它们。平台将负责在容器中安装这些依赖项。 pip要求说明符 <https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers> _ 文档可以帮助您编写 requirements.txt 文件。要有一个具体的示例,请查看 Odoo requirements.txt 文件 <https://github.com/odoo/odoo/blob/16.0/requirements.txt> _。

子模块的 requirements.txt 文件也会被考虑在内。平台会在包含 Odoo 模块的每个文件夹中查找 requirements.txt 文件:不是在模块文件夹本身中,而是在它们的父文件夹中。

目录结构

由于容器是基于Ubuntu的,它们的目录结构遵循Linux文件系统层次结构标准。 Ubuntu的文件系统树概述<https://help.ubuntu.com/community/LinuxFilesystemTreeOverview#Main_directories> _解释了主要目录。

以下是Odoo.sh相关目录:

.
├── home
│    └── odoo
│         ├── src
│         │    ├── odoo                Odoo Community source code
│         │    │    └── odoo-bin       Odoo server executable
│         │    ├── enterprise          Odoo Enterprise source code
│         │    ├── themes              Odoo Themes source code
│         │    └── user                Your repository branch source code
│         ├── data
│         │    ├── filestore           database attachments, as well as the files of binary fields
│         │    └── sessions            visitors and users sessions
│         └── logs
│              ├── install.log         Database installation logs
│              ├── odoo.log            Running server logs
│              ├── update.log          Database updates logs
│              └── pip.log             Python packages installation logs
└── usr
     ├── lib
     │    ├── python2.7
     │         └── dist-packages       Python 2.7 standard libraries
     │    ├── python3
     │         └── dist-packages       Python 3 standard libraries
     │    └── python3.5
     │         └── dist-packages       Python 3.5 standard libraries
     ├── local
     │    └── lib
     │         ├── python2.7
     │         │    └── dist-packages  Python 2.7 third-party libraries
     │         └── python3.5
     │              └── dist-packages  Python 3.5 third-party libraries
     └── usr
          └── bin
               ├── python2.7           Python 2.7 executable
               └── python3.5           Python 3.5 executable

容器中安装了Python 2.7和3.5。但是:

  • 如果您的项目配置为使用Odoo 10.0,则Odoo服务器将使用Python 2.7运行。

  • 如果您的项目配置为使用Odoo 11.0或更高版本,则Odoo服务器将使用Python 3.5运行。

数据库 shell

在使用 shell 访问容器时,您可以使用 psql 访问数据库。

odoo@odoo-addons-master-1.odoo.sh:~$ psql
psql (9.5.2, server 9.5.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

odoo-addons-master-1=>

小心! 对于每个导致更改的 *sql* 语句(*UPDATE*、*DELETE*、*ALTER* 等),尤其是对于您的生产数据库,请使用事务BEGIN…COMMIT/ROLLBACK)。

事务机制是您在出现错误时的安全保障。您只需回滚更改即可将数据库恢复到先前状态。

例如,可能会出现您忘记设置 WHERE 条件的情况。

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK

在这种情况下,您可以回滚以撤销您刚刚错误地进行的不必要更改,并重写语句:

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-addons-master-1=> COMMIT;
COMMIT

然而,在完成操作后,请不要忘记提交或回滚您的事务。未提交的事务可能会锁定您表中的记录,导致您的数据库运行时等待这些记录被释放。这可能会导致服务器无限期地挂起。

此外,如果可能的话,请使用您的暂存数据库先测试您的语句。这将为您提供额外的安全保障。

运行Odoo服务器

您可以从容器 shell 中启动 Odoo 服务器实例。您无法通过浏览器从外部访问它,但您可以例如:

  • 使用Odoo shell,

$  odoo-bin shell
>>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1)
>>> partner.name
'ASUSTeK'
>>> partner.name = 'Odoo'
>>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name
'Odoo'
  • 安装一个模块,

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • 更新模块,

$  odoo-bin -u sale --stop-after-init
  • 运行模块的测试,

$  odoo-bin -i sale --test-enable --log-level=test --stop-after-init

在上述命令中,参数:

  • --without-demo=all prevents demo data to be loaded for all modules

  • --stop-after-init will immediately shutdown the server instance after it completed the operations you asked.

更多选项可在 CLI 文档 中找到并详细了解。

您可以在日志中(~/logs/odoo.log)找到Odoo.sh用于运行服务器的插件路径。请查找”odoo: addons paths”:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 16.0
2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/16.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

小心,特别是对于您的生产数据库。在运行此Odoo服务器实例时执行的操作不是隔离的:更改将在数据库中生效。始终在您的暂存数据库中进行测试。

在Odoo.sh中进行调试

调试Odoo.sh构建与调试其他Python应用程序并没有太大的区别。本文仅解释了Odoo.sh平台的特殊性和限制,并假定您已经知道如何使用调试器。

注解

如果您还不知道如何调试Python应用程序,可以在互联网上轻松找到多个入门课程。

您可以使用 pdbpudbipdb 在 Odoo.sh 上调试您的代码。由于服务器在 外部运行,您无法直接从您的 Odoo 实例后端启动调试器,因为调试器需要一个 shell 来操作。

  • pdb is installed by default in every container.

  • 如果你想使用 pudb 或者 ipdb,你需要在之前安装它。

    要这样做,您有两个选项:

    • 临时的(仅在当前构建中):

      $  pip install pudb --user
      

      或者

      $  pip install ipdb --user
      
    • permanent: 在您的项目 requirements.txt 文件中添加 pudbipdb

然后编辑您想要触发调试器的代码,并添加以下内容:

import sys
if sys.__stdin__.isatty():
    import pdb; pdb.set_trace()

条件 sys.__stdin__.isatty() 是一个检测你是否从 shell 中运行 Odoo 的 hack。

保存文件,然后运行Odoo Shell:

$ odoo-bin shell

最后, 通过 Odoo Shell,您可以触发您想要调试的代码/函数/方法。

在Odoo.sh shell中运行 ``pdb`` 的控制台截图。