本文為最好用的免費ERP系統(tǒng)Odoo 12開發(fā)手冊系列文章第二篇。
英文原著為Odoo 12 Development Essentials - Fourth Edition By Daniel Reis
?第一章 使用開發(fā)者模式快速入門 Odoo 12
?第二章 Odoo 12開發(fā)之開發(fā)環(huán)境準備
?第三章 Odoo 12 開發(fā)之創(chuàng)建第一個 Odoo 應用
?第四章 Odoo 12 開發(fā)之模塊繼承
?第五章 Odoo 12開發(fā)之導入、導出以及模塊數據
?第六章 Odoo 12開發(fā)之模型 - 結構化應用數據
?第七章 Odoo 12開發(fā)之記錄集 - 使用模型數據
?第八章 Odoo 12開發(fā)之業(yè)務邏輯 - 業(yè)務流程的支持
?第九章 Odoo 12開發(fā)之外部 API - 集成第三方系統(tǒng)
?第十章 Odoo 12開發(fā)之后臺視圖 - 設計用戶界面
?第十一章 Odoo 12開發(fā)之看板視圖和用戶端 QWeb
?第十二章 Odoo 12開發(fā)之報表和服務端 QWeb
?第十三章 Odoo 12開發(fā)之創(chuàng)建網站前端功能
?第十四章 Odoo 12開發(fā)之部署和維護生產實例
在更深入了解 Odoo 開發(fā)之前,我們應配置好開發(fā)環(huán)境并學習相關的基礎管理任務。本文中,我們將學習創(chuàng)建 Odoo 應用所需用到的工具和環(huán)境配置。這里采用 Ubuntu 系統(tǒng)來作為開發(fā)服務器實例的主機,可以是云服務器、本地服務器或者PC 上的虛擬機。
本文主要內容有:
- 配置主機,可以是 Ubuntu系統(tǒng)或 PC 機上的 Linux 子系統(tǒng)
- 使用源碼安裝 Odoo,包括數據庫和系統(tǒng)依賴的安裝
- 管理 Odoo 數據庫(創(chuàng)建、刪除和拷貝)
- 配置 Odoo 服務器選項
- 查找并安裝社區(qū)插件
- 使用虛擬環(huán)境管理 Odoo 不同版本和項目
- 開啟服務端開發(fā)者模式簡化開發(fā)任務
開發(fā)準備
本文將介紹如何在開發(fā)電腦上使用源碼安裝 Odoo,建議使用系統(tǒng)是Ubuntu 18.04 ,也可以選擇 Windows 10,文中會介紹到如何在 Windows 下安裝 Linux 子系統(tǒng)。相關代碼可參見 GitHub 倉庫。
設置 Odoo 服務宿主機
推薦使用Debian/Ubuntu來運行 Odoo 服務。雖然 Odoo 是一個跨平臺的系統(tǒng),可以運行在不同的操作系統(tǒng)上,但事實上 Odoo 的研發(fā)(R&D)團隊把 Debian 系作為參照部署平臺。并且 Odoo 自己的 SaaS 平臺也運行在 Debian 之上。這也是社區(qū)中最主流的選擇,說明使用Debian 或 Ubuntu 會更容易尋求到幫助和建議。你也許僅有 Windows 相關背景,但對Debian 系有一定了解也非常重要。
當然你依然可以選擇自己喜歡的系統(tǒng),如 Windows, Mac 或其它Linux發(fā)行版本(如 CentOS)。
注意:本文中介紹的是在一個全新的系統(tǒng)中進行開發(fā),如果你在已有系統(tǒng)中開發(fā),請做好備份以在出錯時進行恢復
使用 Windows 子系統(tǒng)安裝 Linux
在 Windows 系統(tǒng)中,最簡單的方案是使用 Windows 10自帶的Linux子系統(tǒng)(WSL - Windows Subsystem for Linux)。通過子系統(tǒng),我們可以在 Windows 內運行 Ubuntu 系統(tǒng),足以應對 Odoo 開發(fā)所需的一切。更多 WSL 相關知識請參考官網。
WSL 是Windows 10最近發(fā)布中的一個可選功能,使用前需要先啟用。啟用后即可在商店中安裝 Ubuntu,詳見官方幫助文檔。
在寫本文時,需要如下步驟來完成安裝:
- 第一步是要確保 WSL 功能已開啟,以管理員身份打開 PowerShell 并運行:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
以上命令需要單行執(zhí)行,然后根據提示重啟電腦。然后我們就可以安裝Ubuntu Windows應用,最簡單地方式是在自帶微軟商店中搜索 Ubuntu,在寫本文時最新的長期支持版本(LTS)是18.04,按照提示進行安裝即可。運行 Ubuntu 應用會打開一個bash 命令行,這里可以輸入在 Ubuntu 系統(tǒng)中相同的命令。需要記住在安裝時配置的用戶名和密碼,因為在進行提權操作時會要求輸入該信息(如運行 sudo 時)。
安裝 Linux 服務器
我們還可以選擇在電腦上安裝 Linux,或在局域網乃至云端安裝 Linux 系統(tǒng)。我們需要一臺基于 Debian 的服務器用于 Odoo 服務端開發(fā),如果此前你沒有接觸過 Linux, 請注意 Ubuntu 是一個基于 Debian 的 Linux 發(fā)行版本,所以兩者極為相似。Odoo 保證可在當前穩(wěn)定的 Debian 或 Ubuntu 版本上運行,在寫本文時,分別為 Debian 9(Stretch)和Ubuntu 18.04 LTS(Bionic Beaver)。
更推薦選擇 Ubuntu,因安裝上較 Debian 容易??蓮?Ubuntu 官網上下載 ISO 鏡像,建議使用最新的 LTS 版本。如果你剛剛接觸 Linux,使用預配置的鏡像會更容易些。TurnKey Linux提供了含 ISO 的多種格式預安裝鏡像。ISO 格式可以在任意虛擬化軟件上使用,即便是裸機。較優(yōu)的選擇是 LAPP 鏡像,已安裝了 Odoo 所需的Python 和 PostgreSQL。
為能夠進行遠程操作,通常需安裝OpenSSH服務。在 Ubuntu 的設置助手中有這一服務,但也可以通過如下命令來進行安裝:
sudo apt-get install openssh-server
然后需要使用 SSH(Secure Shell)客戶端來連接 Odoo 的宿主機,Windows 中常用的有 PuTTY、XShell 和 SecureCRT。
可以通過如下命令來查看服務器的 IP 地址:
ip addr show
使用 SSH 客戶端可以遠程操作 Linux 主機,還可以獲得比在虛擬機終端操作更好的體驗,我們可以更容易的復制粘貼、修改窗口大小、字體等。
補充:關于虛擬機 Hyper-V, VMware, VirtualBox和 Vagrant 都是很好的方案,網上有很多資料,限于篇幅本文不再介紹。
源碼安裝 Odoo
在本系列文件第一篇使用開發(fā)者模式快速入門 Odoo 12中,我們介紹了快速運行 Odoo 的各種方式,本文中我們將更深入一步,直接通過源碼來安裝、運行 Odoo。
Odoo使用Python 編程語言,數據存儲使用 PostgreSQL數據庫,這是對 Odoo 主機的兩大要求。要使用源碼運行 Odoo,首先要安裝其所依賴的 Python 庫。然后從 GitHub 上下載源代碼,雖然可以下載 zip 和 tar 文件,但使用 Git版本管理工具獲取代碼會更優(yōu)。
具體依賴的安裝根據操作系統(tǒng)和安裝的 Odoo 版本可能會不同。如果在上述步驟中存在問題,請參考官方文檔,可切換版本查看其它版本的操作步驟。
安裝 PostgreSQL 數據庫
Odoo 要使用到 PostgreSQL服務,典型的開發(fā)設置是使用安裝 Odoo 的同一臺機器安裝PostgreSQL。下我們就來安裝數據庫服務:
sudo apt update
sudo apt install postgresql # 安裝PostgreSQL
sudo su -c "createuser -s $USER" postgres # 創(chuàng)建數據庫超級用戶
最后這條命令為當前系統(tǒng)用戶創(chuàng)建了一個PostgreSQL用戶,用于 Odoo 實例創(chuàng)建或刪除數據庫時使用。
如果在 WSL內運行 Ubuntu,注意系統(tǒng)服務不會自動啟動。也就是說運行任何需要數據庫連接的命令(如createuser或啟動 Odoo 服務)時都要手動開啟PostgreSQL服務,手動啟動PostgreSQL服務執(zhí)行:sudo service postgresql start。
安裝 Odoo 系統(tǒng)依賴
要運行 Odoo,我們還需要一些系統(tǒng)包和軟件。獲取版本控制的源碼應安裝 Git,安裝運行 Odoo要求 Python 3.5或之后的版本、Python 3的 pip 以及一些 Python 包的系統(tǒng)依賴:
sudo apt update
sudo apt upgrade
sudo apt install git # 安裝Git
sudo apt install python3-dev python3-pip # Python 3 for dev
sudo apt install build-essential libxslt-dev libzip-dev libldap2-dev libsasl2-dev libssl-dev
Odoo 9, 10, and 11版要用到less CSS 預處理器,所以對這些版本需要執(zhí)行如下安裝:
sudo apt install npm # 安裝Node.js和包管理器
sudo ln -s /usr/bin/nodejs /usr/bin/node # 通過node運行Node.js
sudo npm install -g less less-plugin-clean-css # 安裝less
Odoo 12中無需執(zhí)行如上命令,但通常我們也會用到前述版本,如果有此情況則仍需安裝。
Odoo 12中的修改
CSS 預處理器由 less 改成了 Sass,Sass 編譯器無需進行額外安裝,在 Odoo 12的 Python 依賴中已經安裝了libsass-python。做出這一更改的原因有:Bootstrap 4由 less 調整為 Sass,已有 Python綁定和避免對 Node.js(或 Ruby)的依賴。
源碼安裝 Odoo
為便于管理,我們將在家目錄下創(chuàng)建一個/odoo-dev目錄作為工作目錄。在本系列文章中我們均假設 Odoo 安裝在/odoo-dev目錄下。
Odoo 使用的是 Python 3(3.5或之后的版本),那么在命令行中我們將不再使用python和pip,而是用python3和 pip3。
Odoo 11的修改
從版本11開始,Odoo 運行在 Python 3.5及以后的版本上,Odoo 11依然支持 Python 2.7,但 Odoo 12僅能運行在Python 3.5+的環(huán)境中。Odoo 10及之前的版本僅可運行在Python 2.7上。
要從源碼安裝 Odoo,我們首先要從 GitHub 上克隆一套 Odoo 源代碼:
mkdir ~/odoo-dev # 創(chuàng)建工作目錄
cd ~/odoo-dev # 進入工作目錄
git clone https://github.com/odoo/odoo.git -b 12.0 --depth=1 # 獲取 Odoo 源碼
~是用戶家目錄的縮寫,比如/home/alan。
如果使用 WSL Windows 子系統(tǒng),家目錄存放在一個Windows 系統(tǒng)文件夾中一個不易于發(fā)現的地方。避免這一情況的一個方法是把工作文件放在常用的文件夾下,然后在子系統(tǒng)中使用軟鏈接(類似 Windows中的快捷方式)。比如mkdir /mnt/c/Users/Public/odoo-dev創(chuàng)建C:\Users\Public\odoo-dev工作目錄,然后ln -s /mnt/c/Users/Public/odoo-dev /odoo-dev創(chuàng)建/odoo-dev Linux目錄,實際上是 Windows 目錄的鏈接?,F在就可以使用~/odoo-dev運行所有的命令,比如前述的 git 克隆,文件將存放在C:\Users\Public\odoo-dev下。
Git命令中的-b 12.0明確表明要下載 Odoo 12.0分支,在寫本文時,這顯得有些多余,因為這正是當前默認的分支。--depth=1表示僅下載當前修訂版本,而不是所有歷史修改記錄,這會使下載更快、內容更少。
小貼士:如需在后續(xù)下載歷史提交內容,可以運行git fetch - -unshallow
在運行 Odoo 之前,應安裝requirements.txt中所聲明的 Python 依賴:
pip3 install -r ~/odoo-dev/odoo/requirements.txt
補充:安裝時如因requirements.txt指定了Babel==2.3.4而報錯,請修改Babel==2.3.4為Babel或 Babel>=2.3.4后再重新執(zhí)行以上命令;另內存過小也可能導致不易察覺報錯,測試時1G 內存報錯,調整為2G 后正常安裝
這其中的很多依賴都可以通過 Debian 包安裝,如python3-lxml,所以使用 apt 包管理器是一個有效的替代方案。這樣的優(yōu)勢是在必要時可以自動安裝系統(tǒng)依賴,使用的依賴列表可以在./odoo/debian/control中找到。
還有一些requirements.txt中未包含的 Python 包,亦可安裝來避免警告或開啟額外的功能:
pip3 install num2words phonenumbers psycopg2-binary watchdog xlwt
小貼士:pip3工具可以通過好幾種方式安裝:系統(tǒng)包的方式和原生 Python 的方式。如果pip3報了 import error,在系統(tǒng)中重新安裝或能解決問題。對應的命令為sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall
現在,通過如下命令可啟動 Odoo 實例:
~/odoo-dev/odoo/odoo-bin
如需停止服務并回到命令行,按下 Ctrl + C。
小貼士:Odoo 10中的修改
現在啟動 Odoo的腳本是./odoo-bin,而之前的 Odoo 版本中為./odoo.py
默認Odoo 實例監(jiān)聽8069端口,所以在瀏覽器中訪問http://<server-address>:8069 就可以訪問到 Odoo 實例。對于開發(fā)者來說,我們會需要使用到多個數據庫,所以在命令行中創(chuàng)建會更為方便,后面會介紹如何實現?,F在在命令行終端中按下Ctrl + C 停止 Odoo 服務并回到命令行。
初始化新的 Odoo 數據庫
要按照 Odoo 的數據模式創(chuàng)建和初始化 Odoo 數據庫,我們應使用-d 參數運行 Odoo 服務:
~/odoo-dev/odoo/odoo-bin -d testdb
初始化 testdb 數據庫可能要花上一分鐘,一般會以Modules loaded的 INFO 日志信息結束。它有可能不是最后一條日志信息,但在倒數三到四行中可以找到。此時,服務器就可以監(jiān)聽用戶請求了。
Odoo 9中的修改
從 Odoo 9開始,如果數據庫不存在會被自動創(chuàng)建。但在 Odoo 8中并非如此,需使用PostgreSQL命令行中的createdb命令手動創(chuàng)建
默認情況下,數據庫初始化時會帶有演示數據,作為開發(fā)數據庫這通常很有用。相當于在前端創(chuàng)建數據庫時勾選了Load demonstration data。如在初始化時無需帶有演示數據,在命令行中添加--without-demo=all。
小貼士:在寫本文時Ubuntu WSL中有一個針對 PostgreSQL 的問題,該環(huán)境下無法新建空數據庫。一個解決方案是手動通過createdb 12-library命令創(chuàng)建空數據庫。這樣會重復提示WARNING: could not flush dirty data: Function not implemented。雖然存在警告信息,但數據庫正常創(chuàng)建了。按下Ctrl + C停止警告,使用命令行即可啟動 Odoo 并初始化數據庫。
當前用戶需要是 PostgreSQL 的超級用戶才能創(chuàng)建新數據庫,前文中在安裝過程中已經進行相關操作。
小貼士:對于開發(fā)環(huán)境,使用數據庫超級用戶來運行 Odoo 實例毫無問題。但在生產環(huán)境中,Odoo最佳安全實踐推薦不要使用數據庫超級用戶權限的用戶來運行生產實例。
Odoo 實例已經運行起來了,現在我們可以通過http://<server-name>:8069在瀏覽器中進行訪問。這時會出現登錄界面,如果不知道主機可以通過 hostname 命令查看或通過 ifconfig 查看 IP 地址。默認管理員的用戶名和密碼均為 admin。登錄后即可看到 Apps菜單,及可安裝的應用。
在命令終端中按下Ctrl + C可以停止 Odoo 服務實例并回到命令行。按下上方向鍵可以回到上一條命令,這樣可以通過同樣的命令再次快速啟動 Odoo。

管理 Odoo 數據庫
前面我們學習了如何通過命令行創(chuàng)建和初始化 Odoo 數據庫。管理數據庫還有更多的命令值得我們學習。雖然 Odoo 服務可以自動地進行數據庫管理,我們還是可以使用如下命令來手動創(chuàng)建 PostgreSQL 數據庫:
createdb MyDB
更有趣的是,Odoo 可以通過--template 參數拷貝已有數據庫來創(chuàng)建新的數據庫。要進行這一操作,被拷貝的數據庫不能被連接,所以要確保 Odoo 實例已停止并且沒有其它應用連接該數據庫。命令如下:
createdb --template=MyDB MyDB2
事實上,每當創(chuàng)建數據庫時都會使用一個模板,如果沒有指定模板,會使用一個名為 template1的預設模板。
要在系統(tǒng)中列出已有數據庫,需要使用 PostgreSQL 的 psql 工具及-l 參數:
psql -l
執(zhí)行上述命令會列出我們截至目前所創(chuàng)建的數據庫。如果執(zhí)行了前述操作,可以看到列表中有MyDB和MyDB2。列表中還會顯示 每個數據庫所使用的編碼,默認為UTF-8,這也是 Odoo 所需要的數據庫編碼。
如需刪除數據庫,執(zhí)行dropdb命令:
dropdb MyDB2
現在我們已學習了數據庫的基本知識。要了解更多 PostgreSQL請參見官方文檔或PostgreSQL使用匯總。
警告:dropdb操作是不可撤銷的,在對重要數據庫執(zhí)行該命令時請務必備份數據庫
其它服務器配置項
Odoo 服務還支持一些其它參數,可通過--help 來查看更多參數:
~/odoo-dev/odoo/odoo-bin --help
我們在下面的部分將會學習一些重要參數,首先我們先學習下如何把當前使用參數保存到配置文件中。
Odoo 服務配置文件
大多數的參數都可以保存到配置文件中。默認 Odoo 使用.odoorc文件。Linux 系統(tǒng)中缺省的路徑是在家目錄($HOME)中,而在 Windows 中則和運行 Odoo 的可執(zhí)行文件放在同一個目錄中。
在老版本的 Odoo/OpenERP 中,默認的配置文件為.openerp-serverrc,為保持向后兼容,存在該文件且沒有.odoorc文件的情況下會使用該文件。
一個全新安裝中不會自動創(chuàng)建.odoorc配置文件,我們應使用--save參數來保存,如果配置文件不存在則會創(chuàng)建默認配置文件:
~/odoo-dev/odoo/odoo-bin --save --stop-after-init
此處我們還使用--stop-after-init參數以在執(zhí)行結束后停止服務。這一參數常在運行測試或要求運行模塊升級來檢測是否正確安裝時使用。
小貼士:命令行參數可以縮短到保持不混淆的程度,如--stop-after-init可縮寫為--stop。
現在可以通過如下命令來查看缺省配置文件:
more ~/.odoorc # 顯示配置文件
以上命令會顯示所有配置項及配認值,編輯文件后在下一次啟動 Odoo 實例后生效,輸入 q 回到命令行。
我們還可以使用--conf(或-c)參數來指定配置文件。配置文件無需包含所有配置項,僅包含需修改默認值的配置項即可。
修改監(jiān)聽端口
--http-port=(或-p)參數可以修改實例的監(jiān)聽端口(默認端口8069),不同的端口可以讓我們在同一臺機器上運行多個實例。
Odoo 11的修改:在 Odoo 11中引入--http-port參數以替代此前版本使用的--xmlrpc-port
下面就可以做個嘗試,打開兩個終端,第一個中輸入
~/odoo-dev/odoo/odoo-bin --http-port=8070
第二個中輸入
~/odoo-dev/odoo/odoo-bin --http-port=8071
此時就在同一臺機器上使用不同端口運行了兩個 Odoo 實例,這兩個實例可以使用同一個數據庫或不同數據庫。這取決于我們使用的配置參數,并且兩個端口上也可以運行相同或不同版本的 Odoo。
小貼士:不同 Odoo 版本必須使用不同的數據庫。嘗試在不同版本上使用相同數據庫將無法正常運行,因為各大版本采用了不兼容的數據庫模式。
數據庫選項
進行 Odoo 開發(fā)時,經常會使用多個數據庫,有時還會用到不同版本。在同一端口上停止、啟動不同服務實例,或在不同數據庫間切換,會導致網頁客戶端會話異常。因為瀏覽器會存儲會話的 Cookie。
在瀏覽器中使用私有模式訪問實例可以避免這一問題。另一優(yōu)良實踐是在服務實例上開啟數據庫過濾器,這樣可以確保實例僅允許對指定數據庫的請求,而忽略其它請求。
Odoo 11中的修改:
從Odoo 11開始,--database(或-d)參數可接收逗號分隔的多個數據庫名,設置--database參數時也會自動設置--db-filter參數,所以僅有這個數據庫才能為服務實例使用。對于 Odoo 11之前的版本,我們需要使用--db-filter來限制可訪問的數據庫。
--db-filter可限制 Odoo 實例所能使用的數據庫。它接收一個正則表達式來過濾可用數據庫名,要精確匹配一個名稱,表達式需要以^開頭并以$結束。例如,僅允許testdb數據庫,我們可以使用如下命令:
~/odoo-dev/odoo/odoo-bin --db-filter=^testdb$
使用--database和--db-filter參數來匹配同一數據庫是一個良好的實踐。事實上從 Odoo 11開始默認會為--database設置對應的--db-filter。
管理服務器日志消息
--log-level 參數可用于設置日志級別,這有助于了解服務的狀況。例如要開始調試日志級別,使用--log-level=debug參數。還有如下選項:
- debug_sql:查看服務中產生的 SQL 查詢
- debug_rpc:服務器接收到的請求詳情
- debug_rpc_answer:服務器發(fā)送的響應詳情
其實--log-level是設置Odoo 日志級別的簡化方式,此外通過更完整的--log-handler參數可以有選擇地打開/關閉日志記錄器。默認情況下日志會作為標準輸出(打印到屏幕),但是可以通過logfile=參數來指定日志存儲文件。
安裝第三方插件
在 Odoo 實例中產生新的模塊并安裝,對于初學者總會容易搞不清。下面一起來熟悉這一點。
查找社區(qū)模塊
網絡上有很多 Odoo 模塊,Odoo應用商店可以下載一系列模塊安裝到系統(tǒng)中。另一個重要的資源是Odoo 社區(qū)聯盟(OCA - Odoo Community Association)維護的模塊,可在 GitHub 上查找。OCA 是一個協調社區(qū)貢獻的非營利組織,它同時提升軟件質量,推廣最佳開發(fā)實踐和開源價值觀??赏ㄟ^https://odoo-community.org/來進一步了解 OCA。
為 Odoo 添加模塊,僅需將其拷貝到官方插件的 addons 文件夾中即可,按前述安裝即為~/odoodev/odoo/addons/。但這不是一個好的實踐,我們安裝的 Odoo 是由 Git 版本控制的代碼倉庫,將會與上游 GitHub 倉庫保持同步,在其中加入外部插件會不利于管理。
避免這一點,我們可以選取一個或多個存放模塊的目錄,讓 Odoo 服務也會從該目錄中查找模塊來使用。我們不僅可以把自定義模塊放在一個不同的目錄下不與官方的混在一起,還可以通過不同目錄組織這些模塊。
我們可以通過下載系統(tǒng)課程的代碼來準備供 Odoo 安裝的插件模塊,獲取 GitHub 上的源碼,執(zhí)行如下命令:
cd ~/odoo-dev
git clone https://github.com/alanhou/odoo12-development.git library
此時與/odoo同級的/library文件夾中將包含一些模塊,現在就需告知 Odoo 這個新的模塊目錄。
配置插件(add-ons)路徑
Odoo 服務有一個addons_path參數可設置查找插件的路徑,默認指向Odoo 服務所運行處的/addons文件夾。我們可以指定多個插件目錄,這樣就可以把自定義模塊放到另一個目錄下,無需與官方插件混到一起。
通過如下命令可包含新的模塊路徑來運行服務:
cd ~/odoo-dev/odoo
./odoo-bin -d 12-library --addons-path="../library,./addons"
仔細看服務日志,會發(fā)現有一行報告插件路徑,信息類似INFO ? odoo: addons paths: [...],確認下里面是否有l(wèi)ibrary/目錄。
使用 Python 虛擬環(huán)境安裝 Odoo
維護多個 Odoo 版本的代碼在 Odoo 開發(fā)中很常見,需要整理一下來保持項目在同一臺開發(fā)機器上并行。改變版本有時會需要上下文的切換。比如,現在 Odoo 的啟動執(zhí)行文件是odoo-bin,而在老版本中是odoo.py。遷移到 Python 3后又更易混淆了,我們要知道是選擇python / pip還是python3 / pip3,這取決于使用的 Odoo 版本。
Python 有一個在同機器上管理獨立環(huán)境的工具virtualenv。每個環(huán)境有自己的Python 可執(zhí)行文件和庫文件,僅需在使用時激活環(huán)境,然后python和 pip 無需指定就可以在相應的安裝了 Python庫的環(huán)境下運行。要在Debian/Ubuntu上使用virtualenv,執(zhí)行如下命令:
sudo apt install virtualenv
如果我們使用的工作目錄是~/odoo-dev,并把 Odoo 12源代碼克隆到~/odoo-dev/odoo目錄中,我們可以這樣進行虛擬環(huán)境的創(chuàng)建:
virtualenv -p python3 ~/odoo-dev/odoo12env
source ~/odoo-dev/odoo12env/bin/activate
一旦激活了虛擬環(huán)境,我們可以在其中安裝 Odoo,可以通過 pip 來進行操作:
pip install -e ~/odoo-dev/odoo
以上代碼會將~/odoo-dev/odoo中的 Odoo源代碼安裝到虛擬環(huán)境中。-e 參數非常重要,這是一個可編輯安裝。它不會復制一份代碼到虛擬環(huán)境中,僅僅只是保留了一個到原地址 Odoo 代碼的引用。因為使用到了源代碼,源代碼的修改在當前環(huán)境中也同樣生效。
Odoo 的 Python 依賴會被自動安裝,所以無需使用requirements.txt來進行手動安裝。我們也可以通過 pip 來安裝其它所需的 Python 庫:
pip install phonenumbers num2words psycopg2-binary watchdog xlwt
注意我們無需記住使用的是 Python 2還是 Python 3,這里的pip 命令會指向正確的版本。然后就可以運行 Odoo 了,pip 安裝創(chuàng)建了一個bin/odoo命令,可在任何位置運行,無需涉及源代碼所在目錄。
小貼士:如果決定使用虛擬環(huán)境,任何要使用odoo-bin運行的命令,都可以替換為 odoo
以下命令會啟動并關閉所安裝版本 Odoo,打印一些日志信息用于確定 Odoo 版本和使用的插件:
odoo --stop-after-init
推薦的操作是將配置文件放在虛擬環(huán)境文件夾中。以下會為我們的項目初始化一個12-library 數據庫,并創(chuàng)建一個對應的12-library.conf 文件:
odoo -c ~/odoo-dev/odoo12-env/12-library.conf -d 12-library --addons-path=~/odoo-dev/library,~/odoo-dev/odoo/addons --save --stop
自此開始,我們可通過如下命令啟動圖書項目 Odoo 服務:
odoo -c ~/odoo-dev/odoo12-env/12-library.conf
最后在完成后,通過如下命令來退出環(huán)境:
deactivate
假設我們要在同一臺機器上使用 Odoo 10項目,它使用的是 Python 2.7,通過如下命令創(chuàng)建環(huán)境、安裝 Odoo:
cd ~/odoo-dev
git clone https://github.com/odoo/odoo.git -b 10.0 --depth=1 odoo10
virtualenv odoo10env
source odoo10env/bin/activate
pip install -e ./odoo10
odoo --version
deactivate # To finish working with this env.
要使得在 Odoo 版本間切換更容易,我們可以在~/odoo-dev/odoo10目錄下再為10.0分支克隆一份源代碼。然后創(chuàng)建虛擬環(huán)境,激活環(huán)境,使用 pip創(chuàng)建一個 Odoo 10可編輯安裝。virtualenv沒有使用-p 參數指定 Python 版本,默認為 Python 2,也就是 Odoo 10所需的版本。
如果系統(tǒng)中沒有 Python 2,Ubuntu 18.04默認就不帶 Python 2,則需要執(zhí)行如下命令來進行安裝:
sudo apt install python-dev
使用 PyPI 下載和安裝插件模塊
社區(qū)貢獻的插件可以打包成 Python 庫,發(fā)布到 Python 包索引(PyPI -Python Package Index),然后像其它庫一樣使用 pip 安裝。為了能使用這一方法,Odoo 自動添加了site-packages/文件夾至插件配置路徑,用于安裝庫文件。打包可以通過setuptools-odoo工具。
OCA 項目使用該工具打包并發(fā)布插件至 PyPI。因不同 Odoo 版本中存在相同模塊,模塊名之前會加一個 Odoo 版本前綴。例如odoo12-addon-partner-fax 是Odoo 12的partner_fax PyPI 包,它為 partner 添加了一個傳真字段。
如需從 PyPI 下載該模塊及依賴,并隨后安裝至odoo12env環(huán)境,使用如下命令:
source ~/odoo-dev/odoo12env/bin/activate
pip install odoo12-addon-partner-fax
odoo -c ~/odoo-dev/odoo12-env/12-library.conf -i partner_fax --stop
服務器端開發(fā)者模式
為便于開發(fā)者,Odoo 有一個--dev=all參數可激活一些開發(fā)者友好的功能。
Odoo 10中的修改: --dev=...參數是在 Odoo 10中引入的,它取代了此前版本中更簡化、功能也更少的--debug參數
這啟用了一些有用的功能可加快開發(fā)流程,最重要的如下:
- 在保存 Python 文件時自動重載 Python 代碼,避免手動重啟服務
- 從 XML 中直接讀取 view 定義,避免手動升級模塊
--dev=all將在拋出異常時啟動 Python調試器(pdb),在服務報錯后做后驗(postmortem)分析非常有益。注意這一設置對日志輸出不產生任何影響。有關 Python 調試器命令詳情可參見Python 官方文檔。
雖然 all 值適用于大多數情況,--dev還可接一串逗號分隔的選項。缺省情況下會使用Python 調試器 pdb。有些人會傾向安裝、使用其它調試器,來改善功能和易用性。Odoo 是允許我們指定調試器的,常用的有ipdb和pudb。在本系列第八篇Odoo 12開發(fā)之業(yè)務邏輯 - 業(yè)務流程的支持中,我們將介紹如何在 Odoo 開發(fā)中使用調試器。
要自動偵測代碼文件的變化 ,服務開發(fā)者模式需安裝一個額外的依賴python3-watchdog。我們需要在Ubuntu/Debian系統(tǒng)中安裝它之后才可使用,命令如下:
sudo apt-get install python3-watchdog
對于 Odoo 11之前的版本,使用的是 Python 2,則需安裝python-watchdog。同樣可使用 pip 安裝,命令為pip install watchdog。
總結
在本文中,如們學習了如何在 Ubuntu 系統(tǒng)中安裝 Odoo 并從 GitHub 上獲取 Odoo源碼,以及如何創(chuàng)建Odoo 數據庫和運行 Odoo 實例。
現在我們的 Odoo 環(huán)境可正常用于開發(fā),并且也可以對數據庫和實例進行管理。有了這些,我們可以進行一步的學習了。在下文,我們將從零開始創(chuàng)建第一個 Odoo 模塊,并理解相關的主要元素。
??? 接下來請學習Odoo 12 開發(fā)之創(chuàng)建第一個 Odoo 應用
本文首發(fā)地址:Alan Hou 的個人博客