容器

概览

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

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

If your project requires additional Python dependencies, or more recent releases, you can define a requirements.txt file in the root of your branches listing them. The platform will take care to install these dependencies in your containers. The pip requirements specifiers documentation can help you write a requirements.txt file. To have a concrete example, check out the requirements.txt file of Odoo.

子模块的 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=>

Be careful ! Use transactions (BEGIN…COMMIT/ROLLBACK) for every sql statements leading to changes (UPDATE, DELETE, ALTER, …), especially for your production database.

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

例如,可能会出现您忘记设置 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 18.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/18.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`` 的控制台截图。