Odoo 12開發(fā)者指南第二章 管理Odoo服務(wù)器實(shí)例

全書完整目錄請(qǐng)見:Odoo 12開發(fā)者指南(Cookbook)第三版

本章中震肮,我們將講解如下內(nèi)容:

  • 配置插件路徑
  • 更新插件模塊列表
  • 標(biāo)準(zhǔn)化你的實(shí)例目錄布局
  • 安裝并升級(jí)本地插件模塊
  • 對(duì)插件應(yīng)用修改
  • 應(yīng)用及嘗試建議的拉取請(qǐng)求

引言

第一章 安裝Odoo開發(fā)環(huán)境中留量,我們學(xué)習(xí)了如何使用與編輯器一同發(fā)布的標(biāo)準(zhǔn)核心插件來設(shè)置 Odoo 實(shí)例搀缠。本章集中講解為 Odoo 實(shí)例添加非核心插件。Odoo中闷盔,可以從多個(gè)目錄中加載插件穆刻。此外亲轨,推薦將第三方插件(如OCA模塊)或自定義的插件放在一個(gè)單獨(dú)的文件夾中,這樣可以避免與 Odoo 核心模塊產(chǎn)生沖突孩锡。甚至Odoo 企業(yè)版也是一種類型的插件目錄酷宵,你需要像普通插件目錄一樣加載它。

??有關(guān)用詞 - 插件(add-on) vs. 模塊(module)

本書中躬窜,我們使用插件或插件模塊來指代 Odoo 所預(yù)期安裝的 Python 包浇垦。用戶界面常使用應(yīng)用(app)或模塊的表達(dá) ,但我們更愿意保留模塊一詞來表示Python模塊或包荣挨,它們不一定是 Odoo 插件男韧,而應(yīng)用(app)用來表示定義為應(yīng)用的插件模塊,表示它不是Odoo主菜單中的入口默垄。

配置插件路徑

通過addons_path參數(shù)的配置此虑,你可以在 Odoo 中加載自己的插件模塊。在Odoo初始化一個(gè)新數(shù)據(jù)庫時(shí)口锭,它會(huì)搜索在addons_path配置參數(shù)中給定的這些目錄朦前。addons_path會(huì)在這些目錄中搜索潛在的插件模塊。addons_path中所列出的目錄預(yù)期應(yīng)包含子目錄鹃操,每個(gè)子目錄是一個(gè)插件模塊韭寸。在數(shù)據(jù)庫初始化完成后,你將能夠安裝這些目錄中所給出的模塊荆隘。

準(zhǔn)備工作

這一部分假定你已經(jīng)準(zhǔn)備好了實(shí)例并生成了配置文件恩伺,如在第一章 安裝Odoo開發(fā)環(huán)境在一個(gè)文件中存儲(chǔ)實(shí)例配置一節(jié)所描述。Odoo的源碼存放在/odoo-dev/odoo中臭胜,而配置文件存放在/odoo-dev/myinstance.cfg中莫其。

如何配置...

按如下步驟在實(shí)例的addons_path中添加~/odoo-dev/local-addons目錄:

  1. 編輯你的實(shí)例的配置文件,即 ~/odoo-dev/my-instance.cfg耸三。
  2. 定位到以addons_path =開頭一行乱陡,默認(rèn),你會(huì)看到如下內(nèi)容:
addons_path = ~/odoo-dev/odoo/odoo/addons,~/odoo-dev/odoo/add-ons

譯者注:當(dāng)前默認(rèn)生成的配置文件中為絕對(duì)路徑仪壮,且僅包含xxx/odoo/addons

  1. 修改該行憨颠,添加一個(gè)逗號(hào)(英文半角),并接你想想要添加為addons_的目錄名稱,如以下代碼所示:
addons_path = ~/odoo-dev/odoo/odoo/addons,~/odoo-dev/odoo/addons,~/odoo-dev/local-addons
  1. 重啟你的實(shí)例
$ ~/odoo-dev/odoo/odoo-bin -c my-instance.cfg

運(yùn)行原理...

在重啟 Odoo 時(shí)爽彤,會(huì)讀取配置文件养盗。addons_path變量的值應(yīng)為一個(gè)逗號(hào)分隔的目錄列表∈矢荩可接受相對(duì)路徑往核,但它們是相對(duì)于當(dāng)前工作目錄的,因此應(yīng)在配置文件中盡量避免嚷节。

至此聂儒,~/odoo-dev/local-addons中包含的新插件尚不在該實(shí)例的可用模塊列表中。為此硫痰,你需要執(zhí)行一個(gè)額外的操作衩婚,在下一部分更新插件模塊列表中會(huì)進(jìn)行講解。

擴(kuò)展知識(shí)...

在第一次調(diào)用 odoo-bin腳本來初始化新數(shù)據(jù)庫時(shí)效斑,你可以傳遞一個(gè)帶逗號(hào)分隔目錄列表的--addons-path命令行參數(shù)非春。這會(huì)以所提供插件路徑中所找到的所有插件來初始化可用插件模塊列表。這么做時(shí)缓屠,你要顯式地包含基礎(chǔ)插件目錄(odoo/odoo/addons)以及核心插件目錄(odoo/addons)奇昙。

與前面稍有不同的是本地插件目錄不能為空(譯者注:請(qǐng)先閱讀下面的小貼士),它必須要至少包含一個(gè)子目錄藏研,并包含插件模塊的最小化結(jié)構(gòu)敬矩。在第四章 創(chuàng)建Odoo插件模塊中,我們會(huì)來看如何編寫你自己的模塊蠢挡。同時(shí)弧岳,這里有一個(gè)生成內(nèi)容來滿足Odoo要求的快捷版黑科技:

$ mkdir -p ~/odoo-dev/local-addons/dummy
$ touch ~/odoo-dev/local-addons/dummy/__init__.py
$ echo '{"name": "dummy", "installable": False}' > \
~/odoo-dev/local-addons/dummy/__manifest__.py

你可以使用--save選項(xiàng)來保存配置文件的路徑:

$ odoo/odoo-bin -d mydatabase \
--add-ons-path="odoo/odoo/addons,odoo/addons,~/odoo-dev/local-addons" \
--save -c ~/odoo-dev/my-instance.cfg --stop-after-init

本例中,使用相對(duì)路徑不會(huì)有問題业踏,因?yàn)樗鼈儠?huì)在配置文件中轉(zhuǎn)化為絕對(duì)路徑禽炬。

小貼士:因?yàn)镺doo僅當(dāng)從命令行中設(shè)置路徑時(shí)在插件路徑的目錄中查看插件,而不是在從配置文件中加載路徑的時(shí)候勤家,dummy已不再必要腹尖。因此,你可以刪除它(或保留到你確定不需要新建一個(gè)配置文件時(shí))伐脖。

更新插件模塊列表

我們?cè)谇懊娴牟糠忠呀?jīng)說到热幔,在向插件路徑添加目錄時(shí),僅僅重啟Odoo服務(wù)是不足以安裝其中一個(gè)新插件模塊的讼庇。Odoo還需要有一個(gè)指定動(dòng)作來掃描路徑并更新可用插件模塊的列表绎巨。

準(zhǔn)備工作

啟動(dòng)你的實(shí)例并使用管理員賬號(hào)連接它。然后蠕啄,激活開發(fā)者模式(如果你不知道如何激活開發(fā)者模式场勤,請(qǐng)參見第一章 安裝Odoo開發(fā)環(huán)境)戈锻。

如何更新...

要更新你實(shí)例中的可用插件模塊列表,你需要執(zhí)行如下步驟:

  1. 打開Apps菜單
  2. 點(diǎn)擊Update Apps List:


    image.png
  1. 在彈出對(duì)話框中和媳,點(diǎn)擊Update按鈕:


    image.png
  2. 在更新的最后格遭,你可以點(diǎn)擊Apps入口來查看已更新的可用插件模塊列表。你將需要?jiǎng)h除Apps搜索框中的默認(rèn)過濾器來查看所有模塊留瞳。

運(yùn)行原理...

在點(diǎn)擊了Update按鈕之后拒迅,Odoo會(huì)讀取插件路徑配置變量。對(duì)于列表中的每一個(gè)目錄她倘,它會(huì)查看包含保存在插件模塊目錄中名為manifest.py的插件聲明文件的直接子目錄坪它。Odoo讀取聲明內(nèi)容,并預(yù)期查找其中的Python字典帝牡。除非聲明內(nèi)容中包含一個(gè)鍵installable的值為False,插件模塊的元數(shù)據(jù)就會(huì)存儲(chǔ)在數(shù)據(jù)庫中蒙揣。如果模塊已存在靶溜,則更新相關(guān)信息。否則懒震,會(huì)創(chuàng)建一條新記錄罩息。如果此前可用的插件模塊未找到,則從列表中刪除該記錄个扰。

??僅在初始化數(shù)據(jù)庫后添加了新的插件路徑時(shí)才需要更新應(yīng)用列表瓷炮。如果你在初始化數(shù)據(jù)庫之前在配置文件中添加了新插件路徑,那么就無需手動(dòng)更新模塊列表递宅。

標(biāo)準(zhǔn)化你的實(shí)例目錄布局

我們推薦你在開發(fā)和生產(chǎn)環(huán)境都使用相似的目錄布局娘香。這一標(biāo)準(zhǔn)化會(huì)在你要執(zhí)行運(yùn)維時(shí)體現(xiàn)出用處,它也會(huì)緩解你日常工作的壓力办龄。

這一部分創(chuàng)建將相似生命周期或相似用途的文件分組放在標(biāo)準(zhǔn)化子目錄中的目錄結(jié)構(gòu)烘绽。請(qǐng)自由按照自己的需求來調(diào)整這一結(jié)構(gòu),但請(qǐng)確保你將這一結(jié)構(gòu)在某處進(jìn)行記錄存檔俐填。

如何標(biāo)準(zhǔn)化...

創(chuàng)建所推薦實(shí)例布局安接,你需要執(zhí)行如下步驟:

譯者注:讀者也可直接使用 Alan 在 GitHub 上準(zhǔn)備的安裝腳本進(jìn)行操作

  1. 為實(shí)例創(chuàng)建一個(gè)目錄:
$ mkdir ~/odoo-dev/projectname
   $ cd ~/odoo-dev/projectname
  1. 在名為env/的子目錄中創(chuàng)建一個(gè)Python虛擬環(huán)境:
$ virtualenv -p python3 env
  1. 創(chuàng)建一些子目錄,如下:
$ mkdir src local bin filestore logs
這些子目錄的功能如下:

*   src/:這包含Odoo本身的一個(gè)拷貝英融,以及一些第三方插件項(xiàng)目(我們?cè)谙乱徊街刑砑恿薕doo源碼)
*   local/:這用于保存你針對(duì)具體實(shí)例的插件
*   bin/:這包含各類幫助可執(zhí)行shell腳本
*   filestore/:這用于文件存儲(chǔ)
*   logs/(可選):這用于存儲(chǔ)服務(wù)日志文件
  1. 克隆Odoo并安裝所需依賴包(參見第一章 安裝Odoo開發(fā)環(huán)境獲取更多內(nèi)容):
$ git clone https://github.com/odoo/odoo.git src/odoo
    $ env/bin/pip3 install -r src/odoo/requirements.txt
  1. 以bin/odoo保存如下shell腳本:
#!/bin/sh
    ROOT=$(dirname $0)/..
    PYTHON=$ROOT/env/bin/python3
    ODOO=$ROOT/src/odoo/odoo-bin
    $PYTHON $ODOO -c $ROOT/projectname.cfg "$@"
    exit $?
  1. 讓該腳本可執(zhí)行:
$ chmod +x bin/odoo
  1. 創(chuàng)建一個(gè)空的本地模塊dummy:
$ mkdir -p local/dummy
    $ touch local/dummy/__init__.py
    $ echo '{"name": "dummy", "installable": False}' >\
    local/dummy/__manifest__.py
  1. 為你的實(shí)例生成配置文件:
$ bin/odoo --stop-after-init --save \
     --addons-path src/odoo/odoo/addons,src/odoo/addons,local \
     --data-dir filestore
  1. 添加一個(gè).gitignore文件盏檐,用于告訴GitHub排除這些給定目錄,這樣Git在提交代碼時(shí)就會(huì)忽略掉這些目錄驶悟,例如 filestore/, env/, logs/和src/:
# dotfiles, with exceptions:
    .*
    !.gitignore
    # python compiled files
    *.py[co]
    # emacs backup files
    *~
    # not tracked subdirectories
    /env/
    /src/
    /filestore/
    /logs/
  1. 為這個(gè)實(shí)例創(chuàng)建一個(gè)Git倉(cāng)庫并將已添加的文件添加到Git中:
$ git init
    $ git add .
    $ git commit -m "initial version of projectname"

運(yùn)行原理...

我們生成了一個(gè)有明確標(biāo)簽?zāi)夸浐酮?dú)立角色的干凈的目錄結(jié)構(gòu)胡野。我使用了不同的目錄來存儲(chǔ)如下內(nèi)容:

  • 由其它人所維護(hù)的代碼(src/中)
  • 本地相關(guān)的具體代碼
  • 實(shí)例的文件存儲(chǔ)

通過為每個(gè)項(xiàng)目建一個(gè)virtualenv環(huán)境,我們可以確保該項(xiàng)目的依賴文件不會(huì)與其它項(xiàng)目的依賴產(chǎn)生沖突撩银,這些項(xiàng)目你可能運(yùn)行著不同的Odoo版本或使用了不同的第三方插件模塊给涕,這將需要不同版本的Python依賴。這當(dāng)然也會(huì)帶來一部分磁盤空間的開銷。

以類似的方式够庙,通過為我們不同的項(xiàng)目使用不同的Odoo拷貝以及第三方插件模塊恭应,我們可以讓每個(gè)項(xiàng)目單獨(dú)的進(jìn)行推進(jìn)并僅在需要時(shí)在這些實(shí)例上安裝更新,因此也減少了引入回退的風(fēng)險(xiǎn)耘眨。

bin/odoo允許我們不用記住各個(gè)路徑或激活虛擬環(huán)境就可以運(yùn)行服務(wù)昼榛。這還為我們?cè)O(shè)置了配置文件。你可以在其中添加其它腳本來協(xié)助你的日常工作剔难。例如胆屿,你可以添加一個(gè)腳本來檢查運(yùn)行實(shí)例所需的第三方項(xiàng)目。

有關(guān)配置文件偶宫,我們僅展示了這里需要設(shè)置的最小化選項(xiàng)非迹,但很明顯你可以設(shè)置更多,例如數(shù)據(jù)庫名纯趋、數(shù)據(jù)庫過濾器或項(xiàng)目所監(jiān)聽的端口憎兽。有關(guān)這一話題的更多信息,請(qǐng)參見第一章 安裝Odoo開發(fā)環(huán)境吵冒。

最后纯命,通過在Git倉(cāng)庫中管理所有這些,在不同的電腦上復(fù)制這一設(shè)置及在團(tuán)隊(duì)中分享開發(fā)內(nèi)容變得相當(dāng)容易痹栖。

小貼士:加速貼士

要加速項(xiàng)目的創(chuàng)建亿汞,你可以創(chuàng)建一個(gè)包含空結(jié)構(gòu)的模板倉(cāng)庫,并為每個(gè)項(xiàng)目復(fù)制(fork)該倉(cāng)庫揪阿。這會(huì)省卻你重新輸入bin/odoo腳本疗我、.gitignore及其它所需模板文件(持續(xù)集成配置、README.md图甜、ChangeLog等等)所花費(fèi)的時(shí)間碍粥。

參見內(nèi)容

如果你喜歡這種方法,我們建議你嘗試第三章 服務(wù)器部署中的使用 Docker 運(yùn)行 Odoo 一部分的內(nèi)容黑毅。

擴(kuò)展知識(shí)...

復(fù)雜模塊的開發(fā)要求有各類配置選項(xiàng)嚼摩,在想要嘗試任何配置選項(xiàng)時(shí)都會(huì)要更新配置文件。更新配置常常是一件頭痛的事矿瘦,避免它的一種方式是通過命令行傳遞所有配置選項(xiàng)枕面,如下:

  1. 手動(dòng)激活虛擬環(huán)境:
$ source env/bin/activate
  1. 進(jìn)行Odoo源代碼目錄:
$ cd src/odoo
  1. 運(yùn)行服務(wù):
./odoo-bin --addons-path=addons,../../local -d test-12 -i account,sale,purchase --log-level=debug

第三步中,我們直接通過命令行傳遞了一些參數(shù)缚去。第一個(gè)是--addons-path潮秘,它加載Odoo的核心插件目錄addons,以及你自己的插件目錄local易结,在其中你可以放自己的插件模塊枕荞。選項(xiàng)-d會(huì)使用test-12數(shù)據(jù)庫或者在該數(shù)據(jù)庫不存在時(shí)新建一個(gè)數(shù)據(jù)庫柜候。選項(xiàng)-i 會(huì)安裝會(huì)計(jì)、銷售和采購(gòu)模塊躏精。接著渣刷,我們傳遞了log-level選項(xiàng)來將日志級(jí)別提升為debug,這樣日志中會(huì)顯示更多的信息矗烛。

??通過使用命令行辅柴,你可以快速地修改配置選項(xiàng)。你也可以在Terminal中查看實(shí)時(shí)日志瞭吃。所有可用選項(xiàng)可參見第一章 安裝Odoo開發(fā)環(huán)境碌嘀,或使用-help命令來查看所有的選項(xiàng)列表及各個(gè)選項(xiàng)的描述。

安裝并升級(jí)本地插件模塊

Odoo 功能的核心來自于它的插件模塊歪架。Odoo自帶的插件是你所擁有的財(cái)富股冗,同時(shí)你也可以在應(yīng)用商店下載一些插件模塊或者自己寫。

這一部分中和蚪,我們將展示如何通過網(wǎng)頁界面及命令行來安裝并升級(jí)插件模塊魁瞪。

對(duì)這些操作使用命令行的主要好處包含可以同時(shí)作用于一個(gè)以上的插件以及在安裝或升級(jí)的過程中可以清晰地瀏覽到服務(wù)端日志,對(duì)于開發(fā)模式或編寫腳本安裝實(shí)例時(shí)都非常有用惠呼。

準(zhǔn)備工作

確保你有一個(gè)運(yùn)行中的 Odoo 實(shí)例,且數(shù)據(jù)庫已初始化峦耘、插件路徑已進(jìn)行恰當(dāng)?shù)卦O(shè)置剔蹋。在這一部分中,我們將安裝/升級(jí)一些插件模塊辅髓。

如何安裝升級(jí)...

安裝或升級(jí)插件有兩種方法-可以使用網(wǎng)頁界面或命令行泣崩。

通過網(wǎng)頁界面

可按照如下步驟來使用網(wǎng)頁界面安裝新的插件模塊到數(shù)據(jù)庫中:

  1. 使用管理員賬戶連接實(shí)例并打開Apps菜單


    image.png
  2. 使用搜索框來定位你想要安裝的插件。這里有一些幫助你完成該任務(wù)的操作指南:

    • 激活Not Installed過濾器
    • 如果你要查找一個(gè)具體的功能插件而不是擴(kuò)展的功能插件洛口,刪除Apps過濾器
    • 在搜索框中輸入模塊名的一部分并使用它來作為模塊過濾器
    • 你會(huì)發(fā)現(xiàn)使用列表視圖可以閱讀到更多的信息
  3. 點(diǎn)擊卡片中模塊名下的Install按鈕矫付。

注意有些Odoo插件模塊需要有外部Python依賴,如果你的系統(tǒng)中未安裝該P(yáng)ython依賴第焰,那么 Odoo 會(huì)中止安裝并顯示如下的對(duì)話框:

image.png

譯者注:按正常安裝不會(huì)出現(xiàn)一錯(cuò)誤买优,需通過 pip uninstall pyldap 才能復(fù)現(xiàn)這一錯(cuò)誤

修復(fù)這一問題,僅需在你的系統(tǒng)中安裝相關(guān)的Python依賴即可挺举。

要升級(jí)已安裝到數(shù)據(jù)庫的模塊杀赢,使用如下步驟:

  1. 使用管理員賬戶連接到實(shí)例

  2. 打開Apps菜單

  3. 點(diǎn)擊Apps:


    image.png
  4. 使用搜索框來定位你所安裝的插件。有如下的小貼士:

    • 激活I(lǐng)nstalled過濾器
    • 如果你要查找一個(gè)具體的功能插件而不是擴(kuò)展的功能插件湘纵,刪除Apps過濾器
    • 在搜索框中輸入部分插件模塊的名稱并按下 Enter 來使用它作為模塊過濾器脂崔。例如,輸入CRM并按下 Enter 來搜索CRM應(yīng)用
    • 你會(huì)發(fā)現(xiàn)使用列表視圖可以閱讀到更多的信息
  5. 點(diǎn)擊卡片右上角的的三個(gè)點(diǎn)梧喷,然后點(diǎn)擊Upgrade選項(xiàng):

image.png

激活開發(fā)者模式來查看模塊的技術(shù)名稱砌左。如果你不知道如何激活開發(fā)者模式脖咐,請(qǐng)參見第一章 安裝Odoo開發(fā)環(huán)境

image.png

在激活開發(fā)者模式之后,它會(huì)以紅色顯示模塊的技術(shù)名稱汇歹。如果你使用的是Odoo社區(qū)版屁擅,會(huì)看到一些帶有Upgrade的附加應(yīng)用。這些是Odoo企業(yè)版的應(yīng)用秤朗,要想安裝/使用它們煤蹭,需要購(gòu)買一個(gè)證書。

通過命令行

要在你的數(shù)據(jù)庫中安裝新插件取视,可按照如下步驟:

  1. 查找插件的名稱硝皂。這是包含manifest.py文件的目錄名,不帶前面的路徑作谭。
  2. 停止實(shí)例稽物。如果你在操作生產(chǎn)數(shù)據(jù)庫,請(qǐng)進(jìn)行備份折欠。
  3. 運(yùn)行如下命令:
$ odoo/odoo-bin -c instance.cfg -d dbname -i addon1,addon2 --stop-after-init

譯者注:請(qǐng)將addon1,addon2替換為你所要安裝的插件名

> **小貼士:**你可以省略掉-d dbname贝或,因?yàn)檫@在配置文件中進(jìn)行了設(shè)置。
  1. 重新啟動(dòng)實(shí)例

運(yùn)行原理...

插件模塊的安裝和升級(jí)是兩個(gè)緊密關(guān)聯(lián)的操作锐秦,但有一些重要的區(qū)別咪奖,在下面兩部分中進(jìn)行了強(qiáng)調(diào):

插件安裝

在你安裝插件時(shí),Odoo以提供的名稱檢查它的可用插件列表中未安裝插件酱床。它還會(huì)檢查該插件的依賴羊赵,并且如果有依賴的話,它會(huì)在安裝插件前遞歸安裝這些依賴扇谣。

單個(gè)模塊的安裝包含如下步驟:

  1. 如果存在昧捷,運(yùn)行插件preinit鉤子
  2. 從Python源代碼中加載模型定義并在必要時(shí)更新數(shù)據(jù)庫結(jié)構(gòu)(參見第五章 應(yīng)用模型了解更多信息)
  3. 加載插件的數(shù)據(jù)文件并在必要時(shí)更新數(shù)據(jù)庫內(nèi)容(參見第七章 模塊數(shù)據(jù)了解更多信息)
  4. 如果實(shí)例中啟用了演示數(shù)據(jù)則安裝插件演示數(shù)據(jù)
  5. 如果存在,運(yùn)行插件postinit鉤子
  6. 運(yùn)行對(duì)插件視圖定義的驗(yàn)證
  7. 如果啟用了演示數(shù)據(jù)并啟用了測(cè)試罐寨,運(yùn)行該插件的測(cè)試(參見第十八章 自動(dòng)化測(cè)試用例了解更多信息)
  8. 在數(shù)據(jù)庫中更新模塊狀態(tài)
  9. 從插件的翻譯文件中更新數(shù)據(jù)庫中的翻譯(參見第十二章 國(guó)際化了解更多信息)

??preinit和postinit鉤子分別使用pre_init_hook和post_init_hook鍵名在manifest.py文件中定義靡挥。這些鉤子用于在插件模塊的安裝之前及之后觸發(fā)Python函數(shù)。參見第四章 創(chuàng)建Odoo插件模塊了解更多有關(guān) init 鉤子的知識(shí)鸯绿。

插件升級(jí)

升級(jí)插件時(shí)跋破,Odoo以給定的名稱在可用的插件模塊列表中檢查已安裝插件。它還會(huì)檢查該插件的反向依賴(即依賴于所升級(jí)插件的那些插件)瓶蝴。如果存在幔烛,則也會(huì)對(duì)它們進(jìn)行遞歸升級(jí)。

單個(gè)插件模塊的升級(jí)過程包含如下步驟:

  1. 如果有的話囊蓝,先運(yùn)行插件模塊的預(yù)遷移步驟(參見第七章 模塊數(shù)據(jù)了解更多信息)
  2. 從Python源碼中加載模型定義并在必要時(shí)更新數(shù)據(jù)庫結(jié)構(gòu)(參見第五章 應(yīng)用模型了解更多信息)
  3. 加載插件的數(shù)據(jù)文件并在必要時(shí)更新數(shù)據(jù)庫內(nèi)容(參見第七章 模塊數(shù)據(jù)了解更多信息)
  4. 如果實(shí)例中啟用了演示數(shù)據(jù)更新插件演示數(shù)據(jù)
  5. 如果模塊有任何遷移方法的話饿悬,先運(yùn)行插件模塊的后置遷移步驟(參見第七章 模塊數(shù)據(jù)了解更多信息)
  6. 運(yùn)行對(duì)插件視圖定義的驗(yàn)證
  7. 如果啟用了演示數(shù)據(jù)并啟用了測(cè)試,運(yùn)行該插件的測(cè)試(參見第十八章 自動(dòng)化測(cè)試用例了解更多信息)
  8. 在數(shù)據(jù)庫中更新模塊狀態(tài)
  9. 從插件的翻譯文件中更新數(shù)據(jù)庫中的翻譯(參見第十二章 國(guó)際化了解更多信息)

??注意更新未安裝的插件模塊什么也不會(huì)做聚霜。但是安裝已安裝的插件模塊會(huì)重新安裝該插件狡恬,這會(huì)通過一些包含數(shù)據(jù)的數(shù)據(jù)文件產(chǎn)生一些預(yù)期外的問題珠叔,這些文件可能應(yīng)由用戶進(jìn)行更新而非在常規(guī)的模塊升級(jí)處理時(shí)進(jìn)行更新(參見第七章 模塊數(shù)據(jù)中使用noupdate和forcecreate標(biāo)記部分的內(nèi)容)。通過用戶界面不存在錯(cuò)誤的風(fēng)險(xiǎn)弟劲,但通過命令行時(shí)則有可能發(fā)生祷安。

擴(kuò)展知識(shí)...

要當(dāng)心依賴的處理。假定有一個(gè)實(shí)例你想要安裝sale兔乞、sale_stock和sale_specific插件汇鞭,sale_specific依賴于sale_stock,而sale_stock依賴于sale庸追。要安裝這三者霍骄,你只需要安裝sale_specific,因?yàn)樗鼤?huì)遞歸安裝sale_stock和sale這兩個(gè)依賴淡溯。要升級(jí)這兩者读整,你需要升級(jí)sale,因?yàn)檫@樣會(huì)遞歸升級(jí)其反向依賴咱娶,sale_stock和sale_specific米间。

管理依賴另一個(gè)比較搞的地方是在你向已經(jīng)有一個(gè)版本安裝了的插件添加依賴的時(shí)候。我們繼續(xù)通過前例來理解這一問題膘侮。想像一下你在sale_specific中添加了一個(gè)對(duì)stock_dropshipping的依賴屈糊。更新sale_specific插件不會(huì)自動(dòng)安裝新的依賴,也會(huì)要求安裝sale_specific琼了。在這種情況下另玖,你會(huì)收到非常糟糕的錯(cuò)誤消息,因?yàn)椴寮腜ython代碼沒有成功的加載表伦,而插件的數(shù)據(jù)和模型表則存在于數(shù)據(jù)庫中。要解決這一問題慷丽,你需要停止該實(shí)例并手動(dòng)安裝新的依賴蹦哼。

從GitHub安裝插件模塊

GitHub是第三方插件的一個(gè)很好的來源。很多Odoo合作伙伴使用GitHub來分享他們內(nèi)部維護(hù)的插件要糊,而Odoo社區(qū)聯(lián)盟(OCA)在GitHub上共同維護(hù)著幾百個(gè)插件纲熏。在你開始編寫自己的插件之前,確保查看是否已有可用的插件或者作為初始以繼續(xù)擴(kuò)展插件锄俄。

這一部分向你展示如何從GitHub上克隆OCA的partner-contact項(xiàng)目并讓其中所包含的插件模塊在我們實(shí)例中可用局劲。

準(zhǔn)備工作

假設(shè)你想要改變你的實(shí)例中地址的處理方式,你的客戶需要在Odoo兩個(gè)字段(街道和街道2)之外的第三個(gè)字段來存儲(chǔ)地址奶赠。你肯定是可以編寫自己的插件來為res.partne添加一個(gè)字段的鱼填,但如果想要讓地址在發(fā)票上以合適的格式顯示,問題就要比看上去麻煩一些了毅戈。所幸苹丸,你郵件列表上的某個(gè)人告訴了你partner_address_street3插件愤惰,由OCA作為partner-contact項(xiàng)目的一部分進(jìn)行維護(hù)。

本部分中所使用的路徑反映了我們?cè)?em>標(biāo)準(zhǔn)化你的實(shí)例目錄布局一節(jié)中所推薦的布局赘理。

如何安裝...

按照如下步驟來安裝partner_address_street3:

  1. 進(jìn)入你的項(xiàng)目目錄:
$ cd ~/odoo-dev/my-odoo/src
  1. 在src/目錄中克隆partner-contact項(xiàng)目的12.0分支:
$ git clone --branch 12.0 \
    https://github.com/OCA/partner-contact.git src/partner-contact
  1. 修改插件路徑來包含該目錄并更新你的實(shí)例中的插件列表(參見本章中的配置插件路徑和更新插件模塊列表一節(jié))宦言。instance.cfg中的addons_path一行應(yīng)該是這樣的:
addons_path = ~/odoo-dev/my-odoo/src/odoo/odoo/addons, \
    ~/odoo-dev/my-odoo/src/odoo/addons, \
    ~/odoo-dev/my-odoo/src/, \
    ~/odoo-dev/local-addons
  1. 安裝partner_address_street3插件(如果你不知道如何安裝該模塊,參見前面一節(jié)商模,安裝并升級(jí)本地插件模塊)

運(yùn)行原理...

所有 Odoo社區(qū)聯(lián)盟的代碼倉(cāng)庫都將他們自己的插件放在單獨(dú)的目錄中奠旺,這與Odoo對(duì)插件路徑中目錄的預(yù)期是相一致的。因此施流,只需復(fù)制某處的倉(cāng)庫并將其添加到插件路徑中就夠了响疚。

擴(kuò)展知識(shí)...

有些維護(hù)者遵循不同的方法,每個(gè)插件模塊一個(gè)倉(cāng)庫嫂沉,放在倉(cāng)庫的根目錄下稽寒。這種情況下,你需要?jiǎng)?chuàng)建一個(gè)新的目錄趟章,在這個(gè)目錄中添加插件路徑并克隆你所需的維護(hù)者的插件到該目錄中杏糙。記住在每次添加一個(gè)新倉(cāng)庫拷貝時(shí)要更新插件模塊列表。

對(duì)插件應(yīng)用修改

GitHub上可用的大部分插件需要進(jìn)行修改并且不遵循Odoo對(duì)其穩(wěn)定發(fā)行版所強(qiáng)制的規(guī)則蚓土。它們可能收到漏洞修復(fù)或改善宏侍,包含你提交的問題或功能請(qǐng)求,這些修改可能會(huì)引入數(shù)據(jù)庫模式的修改或數(shù)據(jù)文件和視圖中的更新蜀漆。這一部分講解如何安裝升級(jí)后的版本谅河。

準(zhǔn)備工作

假定你對(duì)partner_address_street3報(bào)告了一個(gè)問題并收到通知說該問題已在partner-contact項(xiàng)目12.0分支的最近一次修訂中得以解決。這種情況下确丢,你可以使用最新版本來更新你的實(shí)例绷耍。

如何修改...

要對(duì)GitHub的插件進(jìn)行源的變更,需執(zhí)行如下步驟:

  1. 停止使用該插件的實(shí)例鲜侥。
  2. 如果是生產(chǎn)實(shí)例請(qǐng)做一個(gè)備份(參見第一章 安裝Odoo開發(fā)環(huán)境管理Odoo服務(wù)端數(shù)據(jù)庫一節(jié))褂始。
  3. 進(jìn)入克隆了partner-contact的目錄:
$ cd ~/odoo-dev/my-odoo/src/partner-contact
  1. 為該項(xiàng)目創(chuàng)建一個(gè)本地標(biāo)簽,這樣萬一出現(xiàn)了崩潰你可以進(jìn)行回退:
$ git checkout 12.0
    $ git tag 12.0-before-update-$(date --iso)
  1. 獲取源碼的最新版本:
$ git pull --ff-only
  1. 在你的數(shù)據(jù)庫中更新partner_address_street3插件(參見安裝并升級(jí)本地插件模塊一節(jié))
  2. 重啟實(shí)例

運(yùn)行原理...

通常描函,插件模塊的開發(fā)者有時(shí)會(huì)發(fā)布插件的最新版本崎苗。這一更新一般包含漏洞修復(fù)及新功能。這里舀寓,我們將獲取一個(gè)插件的新版本并在我們的實(shí)例中更新它胆数。

如果git pull --ff-only失敗的話,你可以使用如下命令回退到前一個(gè)版本:

$ git reset --hard 12.0-before-update-$(date --iso)

然后互墓,你可以嘗試git pull(不添加--ff-only)必尼,它會(huì)產(chǎn)生一個(gè)合并,但這表示你對(duì)插件做了本地修改篡撵。

擴(kuò)展知識(shí)...

如果更新這一步崩潰了胰伍,參見第一章 安裝Odoo開發(fā)環(huán)境從源碼更新Odoo一節(jié)獲取恢復(fù)的操作指南齿诞。記住要總是在一個(gè)生產(chǎn)數(shù)據(jù)庫的拷貝上先進(jìn)行測(cè)試。

應(yīng)用及嘗試建議的拉取請(qǐng)求

在GitHub的世界中骂租,拉取請(qǐng)求(PR)是由開發(fā)者所提交的請(qǐng)求祷杈,這樣項(xiàng)目維護(hù)人員可以添加一些新的開發(fā)。比如一個(gè) PR 可能包含漏洞修復(fù)或新功能渗饮。這里請(qǐng)求在拉取到主分支之前會(huì)進(jìn)行審核和測(cè)試但汞。

這一部分講解如何對(duì)你的 Odoo 項(xiàng)目應(yīng)用一個(gè)PR來測(cè)試漏洞修復(fù)的改進(jìn)。

準(zhǔn)備工作

在前一節(jié)中互站,假定你對(duì)partner_address_street3 報(bào)告了一個(gè)問題并收到一條通知在拉取請(qǐng)求中問題已修復(fù)私蕾,尚未合并到項(xiàng)目的12.0分支中。開發(fā)人員要求你驗(yàn)證PR #123中的修復(fù)狀況胡桃。你需要使用這一分支更新一個(gè)測(cè)試實(shí)例踩叭。

你不應(yīng)在生產(chǎn)數(shù)據(jù)庫直接使用該分支,因此先創(chuàng)建一個(gè)帶有生產(chǎn)數(shù)據(jù)庫拷貝的測(cè)試環(huán)境(參見第一章 安裝Odoo開發(fā)環(huán)境第三章 服務(wù)器部署)翠胰。

如何操作...

應(yīng)用并測(cè)試一個(gè)插件的GitHub拉取請(qǐng)求容贝,你需要執(zhí)行如下步驟:

  1. 停止實(shí)例
  2. 進(jìn)入partner-contact所被克隆的目錄:
$ cd ~/odoo-dev/my-odoo/src/partner-contact
  1. 為該項(xiàng)目創(chuàng)建一個(gè)本地標(biāo)簽,這樣萬一出現(xiàn)崩潰時(shí)你可以回退:
$ git checkout 12.0
   $ git tag 12.0-before-update-$(date --iso)
  1. 拉取pull請(qǐng)求的分支之景。這么做最容易的方式是使用PR編號(hào)斤富,在開發(fā)者與你溝通時(shí)你應(yīng)該可以看到。在本例中锻狗,這個(gè)拉取請(qǐng)求編號(hào)是123:
$ git pull origin pull/123/head
  1. 在你的數(shù)據(jù)庫中更新partner_address_street3插件模塊并重啟該實(shí)例(如果你不知道如何更新該模塊的話請(qǐng)參見安裝并升級(jí)本地插件模塊一節(jié))
  2. 測(cè)試該更新 - 嘗試重現(xiàn)問題满力,或測(cè)試你想要的功能。

如果這不能運(yùn)行轻纪,在GitHub的PR頁面進(jìn)行評(píng)論油额,說明你做了什么以及什么不能運(yùn)行,這樣開發(fā)者可以更新這個(gè)拉取請(qǐng)求刻帚。

如果它沒有問題潦嘶,也在PR頁面說下;這是PR驗(yàn)證流程中非常重要的一部分我擂;這會(huì)加速主分支中的合并。

運(yùn)行原理...

我們?cè)谑褂靡粋€(gè)GitHub功能缓艳,使用pull/nnnn/head分支名稱來通過編號(hào)進(jìn)行拉取請(qǐng)求的拉取校摩,其中nnnn是PR的編號(hào)。Git pull命令合并遠(yuǎn)程分支到我們的分支阶淘,在我們基礎(chǔ)代碼中應(yīng)用修改衙吩。在這之后,我們更新插件模塊溪窒、對(duì)其測(cè)試并向作者報(bào)回修改是成功或是失敗坤塞。

擴(kuò)展知識(shí)...

如果你想要同步測(cè)試它們冯勉,你可以針對(duì)相同倉(cāng)庫的不同拉取請(qǐng)求重復(fù)本節(jié)中的第4步。如果你對(duì)結(jié)果很滿意摹芙,你可以創(chuàng)建一個(gè)分支來保留對(duì)應(yīng)用了改變的結(jié)果的引用:

$ git checkout -b 12.0-custom

使用一個(gè)不同的分支會(huì)幫助你記住你沒有從GitHub使用該版本灼狰,而是一個(gè)自定義的版本。

??git branch命令可用于列出你倉(cāng)庫中的所有本地分支浮禾。

從這開始交胚,如果你需要應(yīng)用來自GitHub中12.0分支的最近一個(gè)審核版本,你需要不使用--ff-only來拉取它:

$ git pull origin 12.0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盈电,一起剝皮案震驚了整個(gè)濱河市蝴簇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匆帚,老刑警劉巖熬词,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吸重,居然都是意外死亡互拾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門晤锹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摩幔,“玉大人,你說我怎么就攤上這事鞭铆』蚝猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)氧急。 經(jīng)常有香客問我而昨,道長(zhǎng),這世上最難降的妖魔是什么坡疼? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮衣陶,結(jié)果婚禮上柄瑰,老公的妹妹穿的比我還像新娘。我一直安慰自己剪况,他們只是感情好教沾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著译断,像睡著了一般授翻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天堪唐,我揣著相機(jī)與錄音巡语,去河邊找鬼。 笑死淮菠,一個(gè)胖子當(dāng)著我的面吹牛男公,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兜材,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼理澎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了曙寡?” 一聲冷哼從身側(cè)響起糠爬,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎举庶,沒想到半個(gè)月后执隧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡户侥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年镀琉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕊唐。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屋摔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出替梨,到底是詐尸還是另有隱情钓试,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布副瀑,位于F島的核電站弓熏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糠睡。R本人自食惡果不足惜挽鞠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狈孔。 院中可真熱鬧信认,春花似錦、人聲如沸均抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽到忽。三九已至橄教,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喘漏,已是汗流浹背护蝶。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翩迈,地道東北人持灰。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像负饲,于是被迫代替她去往敵國(guó)和親堤魁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355