ok-script 進階使用指南
English · 文件中心 · 快速開始 · API 參考
本文件是 ok-script 自動化指令碼開發指南 的進階補充,旨在幫助開發者更深入地利用框架的高階功能,並結合 CI/CD 流程實現專案的自動化管理。
目錄
1. 模板匹配 (Template Matching) { #1-模板匹配-template-matching }
ok-script 的模板匹配工作流基於 COCO 資料集格式,這使得標註和管理特徵點(模板圖片)變得高效且精準。
核心優勢
- 保留相對位置: COCO 格式可以記錄每個標註模板在原始截圖中的相對位置。
ok-script利用這一資訊,在匹配時可以智慧地縮小搜尋區域,從而極大地提升匹配速度和準確度。 - 高解析度優先: 建議標註時使用的截圖採用您計劃支援的最高解析度(例如 4K)。當終端使用者在較低解析度下執行時,框架會自動將高畫質的模板素材縮放以進行匹配,保證了向下的相容性和識別效果。
操作流程
- 標註工具: 使用任何支援匯出 COCO 格式的標註工具。推薦使用
label-studio==1.15.0,因為新版本匯出的 COCO 格式存在相容性問題。 - 放置素材: 將標註工具匯出的
result.json檔案以及對應的圖片資料夾(通常是images資料夾)完整地放入專案的assets目錄下。 - 自動處理: 執行
python main_debug.py啟動程式。在 Debug 模式下,點選開始按鈕後,ok-script會自動檢測assets目錄下的 COCO 檔案,並執行切圖和壓縮操作,將大圖中的各個標註區域切割成獨立的模板圖片,並進行最佳化,以備後續find_feature等方法呼叫。
2. 多語言國際化 (i18n) { #2-多語言國際化-i18n }
為指令碼新增多語言支援可以擴大使用者群體,ok-script 內建了簡便的國際化流程。
實現步驟
- 建立語言檔案:
在專案根目錄下,建立語言檔案。目錄結構必須遵循
i18n/<语言代码>/LC_MESSAGES/的格式,例如:- 英文:
i18n/en_US/LC_MESSAGES/ok.po - 簡體中文:
i18n/zh_CN/LC_MESSAGES/ok.po
- 英文:
- 編輯
.po檔案: 在這些檔案中,按照gettext格式編輯您的翻譯字串。 - 一鍵編譯: 修改
.po檔案後,無需執行任何命令列操作。只需在ok-script客戶端的開發者工具中,點選**“編譯 i18n”**按鈕。框架會自動將所有.po檔案編譯成二進位制的.mo檔案,程式執行時將自動載入對應的語言。
3. 自動化測試 { #3-自動化測試 }
為 Task 編寫單元測試是保證指令碼健壯性的關鍵。ok-script 提供了 TaskTestCase 基類,使得測試變得非常簡單。
測試實踐
- 穩定環境: 測試的核心是使用
self.set_image()將螢幕輸入固定為一張靜態圖片,從而創造一個穩定、可復現的執行環境。 - 使用者問題復現: 除了使用自己擷取的標準測試圖,您還可以將使用者打包上傳的截圖檔案 作為測試圖片。這是一種非常高效的除錯手段,可以幫助您快速定位並解決在特定使用者環境中出現的問題。
示例:使用使用者截圖定位問題
# file: tests/test_user_issue.py
from ok.test.TaskTestCase import TaskTestCase
from src.tasks.MyProblematicTask import MyProblematicTask
class TestUserIssue(TaskTestCase):
task_class = MyProblematicTask
def test_scenario_from_user_screenshot(self):
# 1. 使用用户提供的截图文件
self.set_image('tests/user_screenshots/user_bug_report_01.png')
# 2. 调用在用户环境中出错的特定方法
result = self.task.some_method_that_failed()
# 3. 断言修复后的行为是否符合预期
self.assertIsNotNone(result, "The method should now handle this scenario correctly.")
執行測試
執行所有測試
要一次性執行 tests/ 目錄下的所有測試用例,可以直接執行專案根目錄下的 run_tests.ps1 指令碼。
在 PyCharm 中執行單個測試
為了進行更精細的除錯,例如只執行一個測試檔案或檔案中的某個特定方法,可以直接在 PyCharm 中操作:
- 在程式碼編輯器中,右鍵點選測試檔案或某個
test_...方法。 - 選擇 "Run 'Unittests in ...'"。
重要提示:首次在 PyCharm 中執行測試時,需要修改其“執行/除錯配置”(Run/Debug Configuration)。請確保**“工作目錄”(Working
directory)** 設定為專案的根目錄。否則,測試指令碼會因為找不到 tests/images/ 等相對路徑下的檔案而執行失敗。
4. 使用 GitHub Actions 自動化打包與釋出 { #4-使用-github-actions-自動化打包與釋出 }
您提供的 .github/workflows/build.yml 檔案定義了一個完整的自動化流程(CI/CD),它會在您每次推送新的版本標籤(如 v1.0.0
)時,自動完成測試、打包和釋出。
該流程的核心是 PyAppify (https://github.com/ok-oldking/pyappify),這是一個專門用於將
Python 專案打包成獨立 Windows 執行檔的工具,它通過專案根目錄下的 pyappify.yml 配置檔案進行驅動。
關鍵步驟解析 { #關鍵步驟解析 }
- 觸發條件 (
on): 工作流由推送v*格式的 Git 標籤觸發,是標準的版本釋出方式。 - 安裝依賴與環境設定 (
Install dependencies): 讀取requirements.txt並安裝所有依賴,為後續步驟做準備。 - 原始碼內聯 (
inline_ok_requirements): 將ok-script、pyappify以及額外配置的小型依賴庫整合到 Git 程式碼中,使其隨倉庫一起更新,無需單獨通過 pip 升級。 - 執行自動化測試 (
Run tests): 執行tests/目錄下的所有單元測試,作為釋出的“質量門禁”。任何測試失敗都會中斷流程。 - 同步倉庫與生成更新日誌 (
Sync Repositories): 一個自定義 Action,用於將部分程式碼同步到輕量級的更新庫,並自動生成兩個版本標籤之間的更新日誌。 - 打包執行檔 (
Build with PyAppify Action): 呼叫 PyAppify 工具將 Python 專案打包成獨立的 Windows 執行檔。 - 建立 GitHub Release (
Release): 在 GitHub 上建立新的 Release,使用自動生成的更新日誌作為描述,並將打包好的執行檔作為附件上傳。
新增額外的原始碼內聯依賴 { #新增額外的原始碼內聯依賴 }
inline_ok_requirements 預設內聯 ok-script 和 pyappify。對於更新頻繁且體積較小、希望隨 Git
倉庫分發的 Python pip 庫,可以重複使用可選引數 --add-inlined-requirement PACKAGE=FOLDER:
python -m ok.update.inline_ok_requirements --tag "$env:RELEASE_TAG" `
--add-inlined-requirement custom-package=custom_package `
--add-inlined-requirement another-package=another_package
PACKAGE:requirements.txt中的 pip 發行包名稱,例如custom-package。FOLDER:該庫在site-packages中需要複製的原始碼目錄,例如custom_package。
使用 --tag 時,指令碼會從已安裝的依賴中複製 FOLDER,並從 requirements.txt 刪除對應的 PACKAGE。
若 deploy.txt 尚未包含 FOLDER 或其子路徑,指令碼會自動追加該目錄;已有條目不會重複新增。
此方式適合純 Python、小體積依賴;包含大型資源或依賴平臺二進位制檔案的庫,應繼續通過正常的依賴和打包流程管理。
Sync Repositories 的國內映象功能 { #sync-repositories-的國內映象功能 }
Sync Repositories 步驟的一個主要用途是同步程式碼到國內映象倉庫。對於無法流暢訪問 GitHub 的國內使用者,他們可以通過配置好的國內
Git URL 進行指令碼的自動更新,保證了更新渠道的暢通。
配置多地區更新源 { #配置多地區更新源 }
為了讓不同地區的使用者使用不同的更新源,您需要在 pyappify.yml 檔案中定義多個 profiles。這允許您為同一個專案打包出多個版本,每個版本內嵌了不同的更新地址。
pyappify.yml 配置示例:
name: "ok-ww"
uac: true
profiles:
# 面向国内用户的配置
- name: "China"
git_url: "https://cnb.cool/ok-oldking/ok-wuthering-waves.git"
# ... 其他配置
# 面向全球用户的配置
- name: "Global"
git_url: "https://github.com/ok-oldking/ok-ww-update.git"
# ... 其他配置
打包產物說明 { #打包產物說明 }
PyAppify Action 成功執行後,通常會生成以下檔案:
ok-ww-win32-China-setup.exe: 面向國內使用者的完整安裝包。ok-ww-win32-Global-setup.exe: 面向全球使用者的完整安裝包。ok-ww-win32-online-setup.exe: 線上安裝包,需要聯網下載資源,不推薦普通使用者使用。ok-ww-win32.zip: 構建加速檔案。它包含了本次構建的啟動器.exe,無法直接執行,其主要目的是用於加速下一次的構建流程。
加速構建速度 { #加速構建速度 }
啟動器 .exe 檔案(即 ok-ww-win32.zip 內的檔案)通常只在專案圖示變更或啟動器版本升級時才需要重新打包。在日常僅更新
Task 指令碼程式碼的情況下,我們可以複用上一次釋出中的啟動器來大幅縮短 GitHub Actions 的構建時間。
為此,可以在 pyappify-action 步驟中增加 use_release 配置:
- name: Build with PyAppify Action
id: build-app
uses: ok-oldking/pyappify-action@master
with:
# 使用上一个稳定版本的 Release 来获取已打包的启动器,从而跳过耗时的打包过程
use_release: https://api.github.com/repos/ok-oldking/ok-wuthering-waves/releases/tags/v2.7.12
注意: 您需要將上面的 URL 替換為您自己專案的上一個穩定 Release 的 API 地址。這樣配置後,Action 會直接下載並使用該版本中的
ok-ww-win32.zip,從而跳過編譯啟動器exe的步驟。