戰(zhàn):Raize 6.1.1.12完整配置與排錯(cuò))
簡(jiǎn)介面向 Delphi 開(kāi)發(fā)者的 Raize 6.1.1.12 DX10.1 Berlin 修正版組件包針對(duì) Berlin 版安裝時(shí) pas 錯(cuò)誤導(dǎo)致編譯失敗的問(wèn)題做了修復(fù)并重新調(diào)整配置使組件能在 RAD Studio 10.1 Berlin 環(huán)境中順利安裝使用。資源共956個(gè)文件壓縮包約10.74MB主要包含 hpp 頭文件、dcu 預(yù)編譯單元、pas 源碼、dfm 窗體定義、bmp 設(shè)計(jì)期圖像以及 dpk 包文件等覆蓋組件庫(kù)的完整編譯與運(yùn)行所需。使用時(shí)可解壓至指定目錄并執(zhí)行附帶的構(gòu)建腳本即可完成安裝過(guò)程清晰適合需要快速搭建 Raize 組件環(huán)境的開(kāi)發(fā)人員。目前已有330人學(xué)習(xí)下載。借助修正后的源碼和構(gòu)建腳本可避免手工排查錯(cuò)誤同時(shí)完整目錄結(jié)構(gòu)也便于后續(xù)按需定制或二次開(kāi)發(fā)對(duì)使用 Raize 6 的 Delphi 工程師具有實(shí)用價(jià)值。1. 安裝前的版本坑DX10.1 不等于 DirectX 10.1第一次把老項(xiàng)目從 Delphi XE8 往 10.1 Berlin 遷的時(shí)候我在 Raize 組件上翻了個(gè)大跟頭。工程里到處是 RxLabel、RaizeButton 這類控件裝完組件包后 IDE 直接報(bào) “package not found”編譯列表滿屏紅連著排查了兩天才定位到是版本識(shí)別問(wèn)題。包名里的 DX10.1 指的不是 DirectX 10.1而是 Delphi 10.1 Berlin這個(gè)版本號(hào)跟 XE10.1 的寫法在安裝腳本里經(jīng)?;熘眠x錯(cuò)一個(gè)目錄后面全是白費(fèi)。這篇安裝筆記按環(huán)境檢查、編譯包、注冊(cè)、排錯(cuò)、驗(yàn)證的順序來(lái)寫順序就是我當(dāng)時(shí)踩完坑之后整理出來(lái)的可執(zhí)行流程。新手照著走能跑通熟手可以重點(diǎn)看第 5 章的五個(gè)排查記錄。2. 環(huán)境檢查與資源準(zhǔn)備Delphi 10.1 Berlin 匹配度決定能不能裝裝這套包不順的時(shí)候大部分情況不是安裝包本身?yè)p壞而是 IDE 版本、包結(jié)構(gòu)、安裝路徑三者沒(méi)對(duì)齊。所以我不急著解壓、不急著點(diǎn) Install先把環(huán)境確認(rèn)清楚每一步才有據(jù)可查。這一章花十分鐘做完后面挑錯(cuò)的時(shí)候能少走一半彎路。2.1 確認(rèn) IDE 版本DX10.1 指的是 10.1 Berlin不是 DirectX先打開(kāi) Delphi 10.1 Berlin進(jìn)入 Help About 看版本號(hào)。10.1 Berlin 的 IDE 內(nèi)部版本號(hào)是 18.0Win32 編譯器版本號(hào)是 31.0。包名里的 DX10_1、Delphi18、Berlin 本質(zhì)都是指向同一個(gè) IDE只是不同組件包作者習(xí)慣用的目錄名不一樣。Delphi XE10.1 是 10.1 Berlin 在更名過(guò)程中的早期叫法安裝腳本里如果寫的是 XE10.1裝到 Berlin 上也沒(méi)問(wèn)題但你必須確認(rèn)目標(biāo)機(jī)器裝的確實(shí)是這個(gè)版本而不是 Delphi XE10.2 或 10.2 Tokyo。版本差一個(gè)小版本編譯出來(lái)的包符號(hào)都不通用。命名內(nèi)部版本號(hào)包目錄常見(jiàn)寫法Delphi 10.1 BerlinIDE 18.0 / 編譯器 31.0DX10_1、Delphi18、BerlinDelphi XE10.1IDE 18.0 / 編譯器 31.0XE10.1還需要確認(rèn) IDE 的活動(dòng)平臺(tái)是 Win32。Raize 6.x 的組件包是按 32 位組件庫(kù)方式編譯的在 10.1 Berlin 里用 Win64 平臺(tái)打開(kāi)包編譯時(shí)會(huì)提示平臺(tái)不匹配即使勉強(qiáng)裝上設(shè)計(jì)期也可能只顯示占位框。打開(kāi) Tools Options Tools Platforms把當(dāng)前活動(dòng)平臺(tái)切到 Win32再繼續(xù)后面的步驟。2.2 檢查安裝包解壓后先看目錄再?zèng)Q定怎么裝拿到 Raize 6.1.1.12 修正版后先不要急著雙擊什么 Install.exe。這類修正版通常已經(jīng)把原版安裝器拆開(kāi)改成了手動(dòng)編譯注冊(cè)的模式解壓后你會(huì)看到幾個(gè)固定目錄。先確認(rèn)下面幾個(gè)目錄都在缺了哪一塊后面裝到一半就會(huì)卡住。Sources組件源碼目錄設(shè)計(jì)器定位和調(diào)試用必查。Packages按 Delphi 版本分子目錄存放的 dpk 包工程核心目錄。Compiled 或 Bpl存放編譯后的 bpl / dcp 文件有些版本會(huì)預(yù)先編好一份。Examples示例工程可以不裝但建議留著對(duì)照驗(yàn)證。Readme.txt 或“安裝說(shuō)明.txt”修正版作者通常會(huì)把改動(dòng)點(diǎn)寫在這里先看。同時(shí)認(rèn)識(shí)一下這幾種文件類型后面會(huì)反復(fù)用到擴(kuò)展名作用注意事項(xiàng).dpkDelphi 包工程編譯入口先編譯它.bpl編譯生成的包二進(jìn)制文件由 IDE 或系統(tǒng)加載.dcp包符號(hào)文件必須能被 IDE 在 Library 路徑中找到.dcu單元編譯產(chǎn)物與源碼路徑配套不能單獨(dú)分發(fā).pas組件源碼設(shè)計(jì)器定位時(shí)使用這里我一般不會(huì)直接用修正版預(yù)編譯好的 bpl。.bpl 對(duì)編譯器版本非常敏感你本機(jī)如果裝過(guò) 10.1 Berlin 的 Update 補(bǔ)丁而預(yù)編譯 bpl 是在另一個(gè)補(bǔ)丁版本下編的加載時(shí)就會(huì)報(bào)“對(duì)象版本不匹配”或“接口單元沖突”。寧可自己動(dòng)手重編一遍花不了幾分鐘能省下后面一堆玄學(xué)問(wèn)題。2.3 規(guī)劃安裝路徑三個(gè)不能放的位置安裝路徑的規(guī)劃直接決定后面編譯能不能一次過(guò)。我見(jiàn)過(guò)太多人的包放在中文用戶名目錄下編譯時(shí)報(bào)錯(cuò)路徑亂碼還以為是包壞了。三個(gè)位置不要放不要放在 C:\Program Files (x86) 下。這個(gè)目錄有 UAC 權(quán)限保護(hù)編譯時(shí)寫入 dcu、bpl 會(huì)頻繁彈權(quán)限提示甚至靜默失敗。不要放在帶中文的路徑下。Delphi 編譯器對(duì)非 ASCII 路徑的支持一直很一般老組件包尤甚。桌面路徑如果帶中文也會(huì)踩同樣的坑。不要放在桌面或網(wǎng)盤同步目錄。網(wǎng)盤同步會(huì)鎖文件編譯時(shí)正好撞上文件占用報(bào)錯(cuò)沒(méi)有任何規(guī)律。建議裝到 D 盤根目錄下的純英文目錄比如 D:\Raize61112 或 D:\RaizeComponents。整個(gè)安裝過(guò)程記錄一個(gè)固定路徑后面每次配置 Library 路徑、bpl 路徑都用這一條不要今天用 D 盤明天用 E 盤項(xiàng)目換臺(tái)機(jī)器打開(kāi)時(shí)路徑不一致會(huì)很難排查。提示如果機(jī)器上之前裝過(guò)舊版 Raize先記下舊版本的安裝位置后面第 5 章會(huì)講怎么清理?,F(xiàn)在先確保新版本在一個(gè)干凈、獨(dú)立、純英文的目錄里。3. 安裝流程從編譯運(yùn)行期包到注冊(cè)設(shè)計(jì)期包安裝順序不能亂必須先編譯運(yùn)行期包再安裝設(shè)計(jì)期包。因?yàn)樵O(shè)計(jì)期包在 IDE 中注冊(cè)時(shí)要解析運(yùn)行期包的符號(hào)順序反了IDE 會(huì)報(bào) “package not found” 這種假錯(cuò)誤看起來(lái)像是包壞了其實(shí)只是依賴沒(méi)就緒。整個(gè)流程分三步編譯 Runtime 包、注冊(cè) Design 包、配置 Library 路徑。3.1 第一步編譯運(yùn)行期包Runtime Packages區(qū)分一下兩個(gè)概念運(yùn)行期包是程序運(yùn)行時(shí)加載的 bpl里面是組件實(shí)現(xiàn)代碼設(shè)計(jì)期包是 IDE 設(shè)計(jì)器使用的負(fù)責(zé)把組件注冊(cè)到面板上它自身引用運(yùn)行期包。所以編譯順序一定是 Runtime 在前。用 IDE 編譯的方式比較適合新手。先以管理員身份打開(kāi) Delphi 10.1 Berlin執(zhí)行 File Open找到 D:\Raize61112\Packages\DX10_1 目錄下的運(yùn)行期包文件。文件名通常是 Raize 開(kāi)頭、帶 Runtime 或 Run 后綴的 dpk。打開(kāi)后在 Project Manager 面板里右鍵這個(gè)包節(jié)點(diǎn)選擇 Compile等輸出窗口出現(xiàn) BUILD SUCCESSFUL 就算過(guò)了。如果手頭有開(kāi)發(fā)構(gòu)建環(huán)境也可以走命令行速度更快也更好復(fù)現(xiàn)cd /d D:\Raize61112\Packages\DX10_1 call C:\DelphiInstall\Studio\18.0\bin\rsvars.bat msbuild RaizeVCLRuntime.dpk /p:ConfigRelease /t:Build第一行進(jìn)入包目錄第二行調(diào)用 Delphi 的環(huán)境變量腳本把編譯器路徑、庫(kù)路徑等設(shè)置到當(dāng)前命令行第三行用 MSBuild 執(zhí)行編譯。rsvars.bat 的路徑要改成你本機(jī) Delphi 10.1 Berlin 的實(shí)際安裝位置找不到就搜索一下它在安裝目錄的 bin 文件夾下。參數(shù)方面/p:ConfigRelease 指定按 Release 配置編譯組件包一般用 Release/t:Build 表示執(zhí)行構(gòu)建動(dòng)作。如果你看到不止一個(gè) dpk 文件文件名不是 RaizeVCLRuntime.dpk那就把文件名替換成實(shí)際包名。編譯完成后去輸出目錄確認(rèn)生成了兩個(gè)文件一個(gè) .bpl 和一個(gè) .dcp。只有 bpl 沒(méi)有 dcp或者兩個(gè)都沒(méi)有說(shuō)明 Output directory 沒(méi)配對(duì)。到 Project Manager 里雙擊包節(jié)點(diǎn)查看 Project Options 中的 Output directory確保它指向 D:\Raize61112\Compiled然后重新編譯一次。有人會(huì)在這里漏看導(dǎo)致后面設(shè)計(jì)期包安裝了卻找不到運(yùn)行期符號(hào)浪費(fèi)大量時(shí)間。3.2 第二步安裝設(shè)計(jì)期包Design Packages運(yùn)行期包編譯好后回到 IDE 主窗口執(zhí)行 Components Install Packages。在彈出的對(duì)話框里點(diǎn) Add找到設(shè)計(jì)期包對(duì)應(yīng)的 bpl 文件。設(shè)計(jì)期包的文件名一般帶 Design 后綴注意別選成運(yùn)行時(shí)包。選完后對(duì)話框列表里會(huì)多出一條 Raize 相關(guān)記錄組件面板上也會(huì)出現(xiàn)一個(gè)名為 Raize 的頁(yè)簽。這里有個(gè)細(xì)節(jié)Add 時(shí)選的是 bpl不是 dpk。有人直接在 Project Manager 里打開(kāi)設(shè)計(jì)期 dpk 然后點(diǎn)右鍵 Install這也可以但我更建議用 Install Packages 對(duì)話框操作因?yàn)樗苤庇^看到“哪個(gè)包被加載了、來(lái)自哪個(gè)路徑”排查時(shí)方便。另外不要雙擊 bpl 文件來(lái)安裝bpl 雙擊只會(huì)一閃而過(guò)Windows 不會(huì)因此把它注冊(cè)到 Delphi 的包列表里什么都裝不上。如果安裝后組件面板沒(méi)有出現(xiàn) Raize 頁(yè)簽先檢查當(dāng)前是否還開(kāi)著一個(gè)含有 Raize 控件的項(xiàng)目。IDE 加載失敗時(shí)會(huì)鎖住包注冊(cè)流程關(guān)掉項(xiàng)目再裝。還有一種可能是活動(dòng)平臺(tái)不在 Win32回到 2.1 節(jié)核對(duì)。這一步驟做完了設(shè)計(jì)期算是通了但離真正跑通還差最后一步路徑配置。3.3 第三步配置 Library 路徑打開(kāi) Tools Options Environment Options Delphi Options Library在 Library path 框里新增兩個(gè)路徑D:\Raize61112\Sources D:\Raize61112\Compiled第一行是源碼路徑讓 IDE 在設(shè)計(jì)器中打開(kāi)含 Raize 控件的窗體時(shí)能定位到控件類的源碼文件第二行是 dcp 所在目錄讓編譯器在編譯項(xiàng)目時(shí)能解析到 Raize 包的符號(hào)。這兩個(gè)路徑缺一個(gè)后面都會(huì)出現(xiàn)“編譯通過(guò)但設(shè)計(jì)器打不開(kāi)”“設(shè)計(jì)器能打開(kāi)但編譯報(bào)錯(cuò)”的奇怪組合問(wèn)題。加完路徑后強(qiáng)烈建議重啟一次 IDE。Library 路徑的緩存不會(huì)在修改后立即全部刷新有時(shí)候面板上已經(jīng)能看到組件但一編譯就報(bào)找不到 dcu重啟后緩存重建問(wèn)題自動(dòng)消失。這一步很多人跳過(guò)然后在群里問(wèn)“為什么我都裝好了還是編譯失敗”其實(shí)只是沒(méi)重啟。4. 配置細(xì)節(jié)bpl、dcp、源路徑三個(gè)關(guān)鍵項(xiàng)組件面板出來(lái)了編譯也過(guò)了并不代表這項(xiàng)工作結(jié)束了。真正在項(xiàng)目里跑一段時(shí)間你會(huì)發(fā)現(xiàn)大部分問(wèn)題都集中在三件事上bpl 文件是不是在系統(tǒng)能找到的位置、dcp 文件是不是和 bpl 配套、源碼路徑是不是讓設(shè)計(jì)器認(rèn)到了。這一章專門把這三個(gè)細(xì)節(jié)拆開(kāi)講每一項(xiàng)我都踩過(guò)坑。4.1 bpl 輸出路徑與系統(tǒng) PATHbpl 本質(zhì)上是一個(gè) Windows DLL。程序在運(yùn)行時(shí)加載它Windows 會(huì)按固定順序去搜索先看 exe 所在目錄再找系統(tǒng)目錄最后按系統(tǒng) PATH 逐個(gè)找。如果你的 bpl 放在 D:\Raize61112\Compiled而系統(tǒng) PATH 里沒(méi)有這個(gè)目錄就會(huì)出現(xiàn)一個(gè)很經(jīng)典的場(chǎng)景IDE 里編譯運(yùn)行一切正常把 exe 單獨(dú)拷到一個(gè)目錄去跑立刻彈窗“找不到 RaizeVCLRuntime.bpl”。解決方法是把 bpl 目錄加進(jìn)系統(tǒng) PATH。我推薦用 PowerShell 修改機(jī)器級(jí) PATH而不是用 setx$bplPath D:\Raize61112\Compiled $oldPath [Environment]::GetEnvironmentVariable(Path, Machine) [Environment]::SetEnvironmentVariable(Path, $oldPath ; $bplPath, Machine)第一行定義要加入的 bpl 目錄第二行讀取當(dāng)前機(jī)器級(jí) PATH第三行在原值后面追加新目錄并寫回。Machine 作用域表示對(duì)所有用戶生效修改時(shí)需要管理員權(quán)限。為什么不建議用 setxsetx 有個(gè)老毛病它會(huì)把 PATH 截?cái)嗟?1024 個(gè)字符一旦你的 PATH 原本就比較長(zhǎng)追加完發(fā)現(xiàn)后面的路徑全丟了系統(tǒng)里一堆命令失效這個(gè)后果比裝組件失敗還難受。用 PowerShell 的 .NET 接口可以繞過(guò)長(zhǎng)度限制。改完 PATH 后關(guān)掉當(dāng)前打開(kāi)的命令行窗口和 IDE重新打開(kāi)一次讓環(huán)境變量刷新。如果項(xiàng)目要交給其他機(jī)器編譯也要在構(gòu)建機(jī)上重復(fù)這一步。另一種做法是把 bpl 復(fù)制到 exe 輸出目錄這樣單機(jī)跑沒(méi)問(wèn)題但項(xiàng)目一多每個(gè)輸出目錄都放一份 bpl版本容易亂我一般不這么做。提示改 PATH 前先跑一遍上面的第二行命令把原值存成一個(gè)文本文件備份。改系統(tǒng)環(huán)境變量這種事有后悔藥總比沒(méi)有好。4.2 dcp 文件必須與 bpl 配套dcp 是編譯 dpk 時(shí)生成的包符號(hào)文件它記錄了這個(gè)包里所有單元的公開(kāi)符號(hào)。IDE 編譯項(xiàng)目時(shí)如果能在 Library path 里找到 dcp就直接引用包符號(hào)編譯不會(huì)去重新編譯源碼如果找不到IDE 會(huì)退回源碼路徑去找 dcu再找不到就直接編譯源碼。這個(gè)過(guò)程看起來(lái)“也能過(guò)”但代價(jià)是你的工程對(duì)源碼的依賴變得非常強(qiáng)源碼目錄只要有一點(diǎn)變動(dòng)編譯結(jié)果就跟著變出現(xiàn)那種“換個(gè)目錄就報(bào)錯(cuò)”的病。我習(xí)慣把 dcp 和 bpl 放在同一個(gè)目錄里也就是 D:\Raize61112\Compiled。這樣 Library path 里只需要這一條路徑既能找到 dcp也能兼顧運(yùn)行時(shí) bpl 的查找路徑越少排查越簡(jiǎn)單。不要做的一件事是把 dcp 復(fù)制到 Delphi 自帶的 Lib 目錄。表面上編譯速度變快了但后續(xù)麻煩很大下次 Delphi 打補(bǔ)丁或者你裝另一個(gè)組件包的版本時(shí)Lib 目錄被覆蓋殘留的舊 dcp 會(huì)讓 IDE 報(bào)“單元標(biāo)識(shí)符重定義”或者“常量重復(fù)定義”報(bào)錯(cuò)信息指向的根本不是你的代碼。檢查 dcp 是否配套我一般直接看文件的修改時(shí)間和所在目錄。在 Windows 資源管理器里搜索 Raize*.dcp如果搜出來(lái)多份只保留 D:\Raize61112\Compiled 這一份其余全部刪除再重啟 IDE。4.3 源路徑要加到 Library path 而不是 Search path設(shè)計(jì)器打開(kāi)含有 Raize 控件的窗體時(shí)需要讀到控件類的源文件或至少是源路徑里的聲明。如果 Library path 里沒(méi)有加 D:\Raize61112\Sources你會(huì)看到兩種典型情況一種是窗體打開(kāi)后控件變成灰色矩形屬性窗口里什么都點(diǎn)不了另一種是 IDE 彈窗提示 cannot find source讓你手動(dòng)定位文件。Library path 和 Search path 的區(qū)別很多人分不清。Library path 是編譯器和 IDE 共用的單元搜索路徑設(shè)計(jì)器定位類聲明也用它Search path 是編譯器專用的輔助搜索路徑IDE 的設(shè)計(jì)器不一定認(rèn)。所以我兩個(gè)都加Library path 用來(lái)保證源碼可見(jiàn)Search path 用來(lái)防止編譯器漏掉某些間接引用。路徑重復(fù)不會(huì)報(bào)錯(cuò)不需要擔(dān)心。加好源路徑后有一個(gè)簡(jiǎn)單的驗(yàn)證方法在窗體設(shè)計(jì)器里右鍵一個(gè) Raize 控件選擇 View Source不同版本菜單名可能略有差異如果能跳到對(duì)應(yīng)的 .pas 文件說(shuō)明源路徑生效如果跳不到回 3.3 檢查路徑有沒(méi)有寫錯(cuò)、有沒(méi)有重啟 IDE。另外代碼導(dǎo)航用的 Browsing Path 有時(shí)候也需要同步加一條 D:\Raize61112\Sources否則 Ctrl 點(diǎn)擊控件屬性時(shí)同樣跳不到實(shí)現(xiàn)位置。5. 避坑與排查Raize 6.1.1.12 在 Berlin 下的 5 個(gè)常見(jiàn)問(wèn)題這五個(gè)問(wèn)題基本覆蓋了 6.1.1.12 在 10.1 Berlin 下最常翻車的點(diǎn)每條我都按“現(xiàn)象、原因、解決”三個(gè)步驟拆開(kāi)寫。你在群里問(wèn)裝機(jī)問(wèn)題的時(shí)候多半也是這幾個(gè)姿勢(shì)。5.1 坑一組件面板空白現(xiàn)象Install Packages 對(duì)話框里能看到 Raize 設(shè)計(jì)期包但組件面板翻遍所有頁(yè)簽都沒(méi)有 Raize 頁(yè)。原因大概率是 Add 錯(cuò)了 bpl裝成了運(yùn)行時(shí)包。運(yùn)行時(shí)包只提供實(shí)現(xiàn)代碼不負(fù)責(zé)注冊(cè)設(shè)計(jì)期組件所以它在包列表里但面板沒(méi)有任何變化。另一個(gè)可能是 IDE 當(dāng)前活動(dòng)平臺(tái)是 Win64而 bpl 是按 32 位編譯的加載被靜默跳過(guò)。解決先在 Install Packages 列表里把已經(jīng)加進(jìn)來(lái)的 Raize 條目 Remove 掉重新 Add 那個(gè)帶 Design 后綴的 bpl。接著確認(rèn) Tools Options Tools Platforms 里的活動(dòng)平臺(tái)是 Win32最后在組件面板右鍵選擇 Reset Component Palette強(qiáng)制刷新一次面板緩存。多數(shù)情況走完這三步Raize 頁(yè)就回來(lái)了。5.2 坑二編譯報(bào) cant load package 或 package not found現(xiàn)象打開(kāi)項(xiàng)目或啟動(dòng) IDE 時(shí)彈窗提示 Cant load package D:...\RaizeVCLDesign.bpl 或者找不到指定的模塊。原因常見(jiàn)的是 design 包依賴的運(yùn)行時(shí) bpl 不在這臺(tái)機(jī)器的搜索路徑里或者 bpl 文件根本不存在。設(shè)計(jì)期包加載時(shí)會(huì)連帶加載依賴的運(yùn)行期包運(yùn)行期包找不到設(shè)計(jì)期包也跟著加載失敗。還有一種可能是機(jī)器上裝了兩個(gè)版本的 RaizeIDE 加載時(shí)先撞到了舊包的路徑。解決在 D:\Raize61112 下搜索 Raize*.bpl確認(rèn) Runtime 和 Design 兩個(gè)包都在 Compiled 目錄里并把目錄加進(jìn) PATH見(jiàn) 4.1。如果搜出來(lái)多個(gè)不同位置的 bpl刪除舊的只保留 6.1.1.12 這一份。刪完后打開(kāi) IDE 的 Install Packages把設(shè)計(jì)期包先 Remove 再重新 Add讓它按新路徑重新注冊(cè)一次。5.3 坑三設(shè)計(jì)期正常運(yùn)行期找不到類現(xiàn)象IDE 里拖控件毫無(wú)問(wèn)題設(shè)計(jì)器也正常但程序一運(yùn)行就報(bào) Class TRaizeButton not found或者窗體加載失敗進(jìn)程直接掛掉。原因項(xiàng)目勾選了 Build with runtime packages運(yùn)行時(shí)必須能加載 Raize 運(yùn)行期包。但開(kāi)發(fā)機(jī)上 bpl 目錄沒(méi)有加到系統(tǒng) PATH或者發(fā)布部署時(shí)沒(méi)有把 bpl 一并帶過(guò)去。IDE 里能跑是因?yàn)?IDE 自己加載過(guò)這個(gè)包脫離 IDE 跑 exe 時(shí)系統(tǒng)找不到了。解決開(kāi)發(fā)機(jī)把 D:\Raize61112\Compiled 加入 PATH重啟后再跑。發(fā)布機(jī)上把 Raize 相關(guān)的幾個(gè) bpl 復(fù)制到 exe 同一目錄或者用安裝腳本裝到系統(tǒng)目錄。如果項(xiàng)目不是必須要用 runtime packages也可以在 Project Options Runtime Packages 里取消勾選讓組件以靜態(tài)鏈接方式編進(jìn) exe體積變大一點(diǎn)但省了分發(fā) bpl 的麻煩。5.4 坑四中文用戶名導(dǎo)致路徑亂碼現(xiàn)象編譯時(shí)提示 Cannot open file輸出窗口里路徑顯示成亂碼或者直接提示文件路徑非法但文件明明就在那里。原因Windows 用戶名是中文時(shí)桌面和文檔目錄都帶非 ASCII 路徑。Delphi 10.1 的編譯器對(duì)非 ASCII 路徑支持有歷史問(wèn)題組件包的編譯腳本里如果有相對(duì)路徑引用拼接后就會(huì)變成亂碼。修正版雖然處理了安裝腳本但源碼工程一旦放到中文路徑下編譯仍然可能踩中。解決把安裝包和工程都放到純英文路徑下比如 D:\Raize61112 和 D:\MyProject。工程已經(jīng)在中文路徑的先用資源管理器移動(dòng)到英文目錄再在 Project Manager 里調(diào)整輸出路徑。如果非要放在帶中文的用戶目錄下可以給中文用戶目錄做英文 junction 映射但這樣換一臺(tái)機(jī)器就要重配一次我試過(guò)一次就不再用了統(tǒng)一英文路徑是最省心的。5.5 坑五覆蓋安裝后舊版本殘留現(xiàn)象裝完 6.1.1.12 后啟動(dòng) IDE 很慢編譯時(shí)大量報(bào) Duplicate unit 或 Unit 重定義指向的文件路徑既有新版本又有舊版本。原因舊版 Raize 沒(méi)有卸載干凈。安裝新包時(shí)舊 bpl、dcp 還殘留在系統(tǒng) PATH、Library path 和 Delphi 包緩存里IDE 同時(shí)加載新舊兩套組件單元符號(hào)重復(fù)注冊(cè)編譯自然沖突。解決這一步要按順序來(lái)。先在 Install Packages 里移除舊版本的設(shè)計(jì)期包再用 Everything 或資源管理器搜索 Raize*.bpl 和 Raize*.dcp按修改時(shí)間篩選把舊版本文件刪除只留 6.1.1.12 對(duì)應(yīng)的那一份最后清理 Delphi 包緩存位置一般在用戶目錄的 AppData 下的 BDS 18.0 相關(guān)文件夾找到 KnownIDE 或 Package 緩存子目錄把里面 Raize 相關(guān)記錄清掉。清理前先備份目錄刪除操作比安裝更需要謹(jǐn)慎。重啟 IDE確認(rèn)編譯不再報(bào)重復(fù)單元即可。6. 裝完怎么驗(yàn)證用一個(gè)小項(xiàng)目把 Raize 組件跑起來(lái)裝完先別急著打開(kāi)老工程用最小驗(yàn)證跑一遍確認(rèn)安裝是干凈可用的。這一步只花十分鐘能擋住后面一整天“明明裝好了但項(xiàng)目就是怪怪的”的折騰。6.1 新建 VCL 應(yīng)用并拖入組件File New VCL Forms Application新建一個(gè)空窗體。在組件面板找到 Raize 頁(yè)依次拖一個(gè) RxLabel、一個(gè) RaizeButton、一個(gè) RaizePanel 到窗體上。然后重點(diǎn)檢查對(duì)象監(jiān)視器選中控件右側(cè)屬性列表能不能完整展開(kāi)能不能修改 Caption、Color 這些基礎(chǔ)屬性。如果屬性列表空白或者出現(xiàn)灰色的未識(shí)別對(duì)象說(shuō)明源路徑配置有問(wèn)題回到 4.3 再查一次。6.2 寫代碼編譯并拷出去運(yùn)行給窗體加一個(gè) FormCreate 事件輸幾行最基礎(chǔ)的代碼驗(yàn)證運(yùn)行期包procedure TForm1.FormCreate(Sender: TObject); begin RxLabel1.Caption : Raize 6.1.1.12 is ready; RaizeButton1.Caption : Click me; RaizePanel1.Color : clBtnFace; end;編譯前看一下 Project Options 里的 Runtime Packages 狀態(tài)確認(rèn)你是按需要勾選或取消的。按 F9 運(yùn)行窗體應(yīng)該正常顯示標(biāo)簽文字正確按鈕可點(diǎn)擊不彈任何找不到包的提示。運(yùn)行沒(méi)問(wèn)題后到工程輸出目錄把 exe 單獨(dú)復(fù)制到一個(gè)空目錄雙擊運(yùn)行它。這一步專門驗(yàn)證脫離 IDE 后 bpl 能不能被系統(tǒng)找到。如果彈缺 bpl說(shuō)明 4.1 的 PATH 還沒(méi)配對(duì)回去確認(rèn)。6.3 反向驗(yàn)證移除源路徑后重新編譯最后做一個(gè)比“看到組件面板”更嚴(yán)格的驗(yàn)證。打開(kāi) Tools Options把 Library path 里的 D:\Raize61112\Sources 臨時(shí)移除只保留 Compiled 路徑然后重新編譯剛才這個(gè)測(cè)試工程。如果能編譯通過(guò)說(shuō)明項(xiàng)目是通過(guò) dcp 包符號(hào)來(lái)解析 Raize 單元的而不是依賴源碼現(xiàn)編。這是安裝配置真正合格的標(biāo)準(zhǔn)。如果報(bào)錯(cuò)說(shuō)明當(dāng)前工程還對(duì)源碼路徑有直接依賴把源路徑加回去檢查 dcp 是否真的被 IDE 找到了。驗(yàn)證完再把源路徑加回來(lái)第一次重新編譯會(huì)慢一點(diǎn)因?yàn)?IDE 要重建部分 dcu 緩存屬于正?,F(xiàn)象。從那以后我每次裝完 Raize 6.1.1.12 修正版都強(qiáng)制走一遍“新建工程、拖三個(gè)控件、寫一行代碼、編譯、拷 exe 到干凈目錄運(yùn)行、移除源路徑再編一次”的流程一條不過(guò)就回查對(duì)應(yīng)章節(jié)。這套流程十分鐘不到但能省下后續(xù)項(xiàng)目里大量“明明裝好了怎么還報(bào)錯(cuò)”的無(wú)效排查。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取