容器

概覽

每個組建都隔離在自己的容器中(Linux 命名空間容器)。

基礎是 Ubuntu 系統,其中安裝了所有 Odoo 所需的相依套件以及常用的實用套件。

如果您的项目需要额外的 Python 依赖项,或者需要更多最新版本,您可以在分支根目录中定义一个 requirements.txt 文件,列出这些依赖项。平台会将这些依赖项安装到您的容器中。pip requirements specifiers <https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers>`_ 文档可以帮助你编写 requirements.txt 文件。如需具体示例,请查看 Odoo <https://github.com/odoo/odoo/blob/17.0/requirements.txt>`_ 的 requirements.txt 文件。

子模組的 requirements.txt 檔案也會被考慮。平台會在每個包含 Odoo 模組的資料夾中尋找 requirements.txt 檔案:不是在模組資料夾本身,而是在其上層資料夾。

目錄結構

由於容器是基於 Ubuntu,其目錄結構遵循 Linux 檔案系統層次標準。Ubuntu 的檔案系統樹狀概覽 說明了主要目錄。

以下是 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 執行。

資料庫命令介面

在透過命令介面存取容器時,您可以使用 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 語句(UPDATEDELETEALTER 等),請`使用交易 <https://www.postgresql.org/docs/current/static/sql-begin.html>`_(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 伺服器

您可以從容器命令介面啟動 Odoo 伺服器實例。您無法從外部使用瀏覽器存取它,但您可以例如:

  • 使用 Odoo 命令介面,

$  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”阻止加载所有模块的演示数据

  • --stop-after-init 會在完成您要求的操作後立即關閉伺服器實例。

更多選項可在 :doc:`CLI 使用說明 </developer/reference/cli>`中查看。

您可以在日誌 (~/logs/odoo.log) 中找到 Odoo.sh 用於運行伺服器的附加元件路徑。尋找「odoo: addons paths」:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 17.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/17.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 上對您的程式碼進行除錯。由於伺服器在 shell 之外運行,您無法直接從 Odoo 實例後端啟動除錯器,因為除錯器需要 shell 才能運作。

  • pdb 預設安裝在每個容器中。

  • 如果您想使用 pudbipdb,則必須先安裝。

    要執行此操作,您有兩個選項:

    • 暫時性(僅在目前建置中):

      $  pip install pudb --user
      

      $  pip install ipdb --user
      
    • 永久性:將 pudbipdb 加入您的專案 requirements.txt 檔案。

然後編輯您要觸發除錯器的程式碼並加入:

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

條件 sys.__stdin__.isatty() 是一個偵測您是否從 shell 運行 Odoo 的技巧。

儲存檔案,然後運行 Odoo Shell:

$ odoo-bin shell

最後,透過 Odoo Shell,您可以觸發您要除錯的程式碼片段/函式/方法。

控制台截圖顯示 ``pdb`` 在 Odoo.sh shell 中運行。