本章主要介紹肖odoo實例添加用戶自定義的模塊。你可以從多個路徑載入模塊。但是建議你將自己的模塊兒放在特定的目錄當中,避免與odoo的核心模塊混淆。
在這一章節,中我們主要涉及以下內容:
- 配置插件路徑。
- 標准化實例目錄結構。
- 安裝和更新本地模塊。
- 從github安裝模塊。
- 生效模塊的改變。
- 應用和嘗試拉起最新請求。
術語
我們使用的add-on(插件)或者module(模塊)或者app(應用)或者add-on module(插件模塊)指的是安裝在odoo中,由odoo調用並完成特定業務的單元。類似於python中的包。
配置add-ons路徑
在odoo.conf中,我們很方便的配置模塊路徑,當數據庫初始化的時候,odoo將查找這些路徑下的模塊。
准備
- odoo.conf
- odoo實例
步驟
- 編輯配置文件,odoo.conf
- 定位配置文件中的路徑參數
addons_path=默認路徑
- 修改路徑
addons_path=路徑1, 路徑2
- 重啟應用實例
$ ./odoo-bin -c odoo.conf
原理
重啟Odoo時,讀取配置文件。addons_path變量的值應該是用逗號分隔的目錄列表。可以接受相對路徑,但它們是相對於當前工作目錄的,因此應該避免在配置文件中使用。
小貼士
若odoo的實例啟動后,添加了新的模塊,那么需要點擊UI上的 更新 。參見“更新模塊列表”那一章節的內容
更多
當您第一次調用odoo-bin腳本來初始化一個新的數據庫時,您可以傳遞——addons-path命令行參數,並用逗號分隔目錄列表。這將初始化可用的附加組件模塊列表以及在提供的附加組件路徑中找到的所有附加組件。當你這樣做的時候,你必須顯式包含基本的附加組件目錄(odoo/odoo/addons),以及核心的附加組件目錄(odoo/addons)。與前面的配方稍有不同的是,本地add-ons不能為空;它們必須包含至少一個子目錄,該目錄具有附加模塊的最小結構。
規范化實例目錄布局
在開發中,最好保持生產及開發環境相同。絕對可以讓你少踩坑。
步驟
- 創建新目錄
$ mkdir ~/odoo-dev/projectname
$ cd ~/odoo-dev/projectname
- 創建python的虛擬環境
$ python3 -m venv env
- 創建一些子目錄
$ mkdir src local bin filestore logs
- src/: 這個目錄包含odoo以及其他第三方的代碼。
- local/:這里包含我們開發的模塊。
- bin/: 這里包含一些執行腳本。
- fielstore/: 這是用於文件存儲的。
- logs:/這是用於存儲服務日志的。
- clone odoo及安裝必要的包
$ 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文件:
#!/bin/sh ROOT=$(dirname $0)/..
PYTHON=$ROOT/env/bin/python3 ODOO=$ROOT/src/odoo/odoo-bin
$PYTHON $ODOO -c $ROOT/projectname.cfg "$@" exit $?
- 授予可執行權限:
$ chmod +x bin/odoo
- 創建空的本地模塊:
$ mkdir -p local/dummy
$ touch local/dummy/ init .py
$ echo '{"name": "dummy", "installable": False}' >\ local/dummy/ manifest .py
- 生成配置文件:
$ bin/odoo --stop-after-init --save \
--addons-path src/odoo/odoo/addons,src/odoo/addons,local \
--data-dir filestore
- 添加.gitignore文件
# dotfiles, with exceptions:
.*
!.gitignore
# python compiled files
*.py[co]
# emacs backup files
*~
# not tracked subdirectories
/env/
/src/
/filestore/
/logs/
- 初始化git庫
$ git init
$ git add .
$ git commit -m "initial version of projectname"
原理
我們組織了一個干凈的目錄,並為其分配給不同的角色。
- 其他人的代碼(src/)
- 本地模塊代碼(local/)
- 實例的存儲的文件(filestore/)
為每一個項目創建虛擬環境可避免項目依賴間的干擾。
我們為每一個項目創建單獨的odoo的副本及第三方的模塊,可有效避免很多坑。
bin/odoo腳本可以方便我們,省的記住各種路徑及激活虛擬環境。腳本可以根據自己的實際情況自行調整。以上可以生成odoo的配置文件。
安裝和更新本地模塊
odoo的核心就是各式各樣的模塊,有odoo官方的,有第三方的。
在這一章節中,我們將學習如何通過web頁面或者命令行安裝和升級模塊。
通過命令行操作的優勢在於可以一次性操作多個模塊,且在操作的過程中,可實時看到日志信息。
准備
可用的odoo實例
步驟
通過頁面
-
使用Administrator賬戶登錄並進入Apps菜單
-
搜索目標模塊
-
點擊 install 按鈕即可。
注意,有時odoo包需要額外的python包。但是相關依賴還沒有安裝,那么將會有如下報錯。
通過pip安裝即可。
更新模塊方法類似,不詳細列了。
通過命令行 -
確定模塊的名稱,就是寫在__manifest__.py文件中的key為name的名稱。
-
停用實例。
-
如下命令
$ odoo/odoo-bin -c instance.cfg -d dbname -i addon1,addon2 \
--stop-after-init
- 重啟實例。
更新模塊方法類似,通過如下命令
$ odoo/odoo-bin -c instance.cfg -d dbname -u addon1 \
--stop-after-init
原理
安裝和更新是非常相近的過程,但是卻有一些比較重要的區別。
模塊安裝
當我們在安裝模塊時,odoo會檢查尚未安裝的模塊列表。odoo還會檢查模塊所依賴的模塊,如果有的話,odoo會遞歸的安裝這些模塊。
安裝步驟如下:
- 如果有的話,運行preinit hook函數。
- 載入模塊信息並更新表結構。
- 載入數據文件並更新數據庫中的內容。
- 安裝模塊的演示數據(如果配置了演示數據)
- 如果有的話,運行postinit hook函數。
- 運行視圖的檢查。
- 如有激活了演示數據,並且test=enable,那么將運行模塊的tests。
- 更新模塊的狀態。
- 更新模塊的翻譯信息。
小貼士
preinit和postinit鈎子函數定義在__manifest__.py文件中,使用pre_init_hook和post_init_hook的key。value為函數名。詳情見第三章,創建odoo模塊章節。
模塊更新
當我們更新模塊時,odoo將檢查已安裝的列表。odoo將檢查這些模塊的反向依賴。如有的話,也將更新這些模塊。
更新步驟如下:
- 運行模塊的pre-migration(詳見第六章,管理模型數據)
- 載入模塊信息並更新表結構。
- 載入數據文件並更新數據庫中的內容。
- 安裝模塊的演示數據(如果配置了演示數據)
- 如果配置了遷移函數,那么將運行模塊的post-migration。
- 運行視圖的檢查。
- 如有激活了演示數據,並且test=enable,那么將運行模塊的tests(第十八章,自動測試)
- 更新模塊的狀態。
- 更新模塊的翻譯信息。
小貼士
更新未安裝的模塊將會忽略。但是安裝已安裝過的模塊,將可能導致潛在的坑。比如,有些數據在使用中進行了調整,但是在再次安裝的時候,可能就會被還原。但是通過web頁面就沒有這個風險了。
更多
小心處理依賴關系的模塊。A依賴於B,若B更新,則A也會更新。但是若A更新,B是不會更新的。
從github安裝模塊
- git clone 下來
- 配置odoo.cnf中的addons-path
- 執行安裝即可
更新模塊的修改
准備
假設我們已經安裝了github的partner_contact_gender,我們收到該模塊在odoo14.0版本下的問題修復。
步驟
為了應用來自github的更新,操作如下
- 使用使用該模塊的實例
- 備份實例(詳見第一章中的管理數據庫章節)
- 進入partner-contact模塊所在目錄
- 添加本地tag,以方便進行回退
$ git checkout 14.0
$ git tag 14.0-before-update-$(date --iso)
- 拉取最新的代碼
$ git pull --ff-only
- 更新模塊
- 重啟實例
原理
通常模塊開發者發布最新版的模塊,包含bug修復及新功能。在這,我們獲取到一個新版本並更新。
如果git pull --ff-only失敗,則可以回退到上一個版本。
$ git reset --hard 14.0-before-update-$(date --iso)
然后,你可以通過git pull(去掉--ff-only),如果有合並沖突,說明你本地修改了部門內容。