aardio教程) 搭建自己的擴展庫倉庫

来源:https://www.cnblogs.com/kanadeblisst/p/18098123
-Advertisement-
Play Games

前言 aardio中有些經常使用的庫,換個項目總需要複製一下,還不便於修改。雖然可以直接把它放到aardio\lib目錄下,也是不便於共用給其他人使用。 最近偶然翻到編輯器里的工具->開發環境->擴展庫發佈工具,就想著可以像官方一樣,發佈自己的擴展庫,也便於分享給大家使用,最好能像官方擴展庫一樣線上 ...


前言

aardio中有些經常使用的庫,換個項目總需要複製一下,還不便於修改。雖然可以直接把它放到aardio\lib目錄下,也是不便於共用給其他人使用。

最近偶然翻到編輯器里的工具->開發環境->擴展庫發佈工具,就想著可以像官方一樣,發佈自己的擴展庫,也便於分享給大家使用,最好能像官方擴展庫一樣線上安裝。

閱讀官方代碼

翻了一下代碼,其實官方擴展庫的邏輯也很簡單,先請求一遍所有擴展庫列表,這是個json文件。

裡面包含擴展庫的基本信息和下載的url,下載的格式是.tar.lzma,而上面的擴展庫發佈工具就是將庫打包成這個格式。

當你要安裝某個庫時,就會把它下載並解壓到aardio\lib文件夾下。

寫好的成品

下麵是我弄的擴展庫,目前庫只有幾個,基本都是我最近才寫的,有興趣的可以去github下載測試下bug。

歡迎大家共用一些常用庫,減少造輪子的時間。

開源地址

搭建的代碼放到github了,你可以簡單的修改代碼裡面的倉庫地址來做一個自己的擴展倉庫

github:https://github.com/kanadeblisst00/aardio-extlibs

github的訪問國內偶爾會抽風,所以我擴展庫里的下載地址放的是國內伺服器搭建的鏡像倉庫(它會每10分鐘同步上面github的數據)

國內加速倉庫: http://git.pygrower.cn/kanadeblisst/aardio-extlibs

使用方法

先下載extlibs.aardio這個文件到本地(只需要這個文件,其他都是打包的代碼,這個是下載的代碼)

把它重命名為5.extlibs.aardio,移動到aardio\tools文件夾下,該目錄下還有個1.ext.aardio文件,這是官方擴展庫。

接著重新打開aardio的編輯器,就可以在工具里看到有個非官方擴展庫。使用方法和上面的擴展庫是一樣的,運行它選擇需要安裝的庫,它就會下載好放到aardio\lib目錄下

搭建教程

上面的倉庫里的代碼就是搭建的全部代碼。這裡我簡單的說一下這些代碼流程

目錄結構

  • dist: 打包後的文件,用於在extlibs.aardio里遠程下載安裝
  • lib: 庫代碼
  • res: 庫的使用案例
  • main.aardio: 將lib下的庫打包壓縮到dist里

搭建步驟

將你需要打包的庫放在lib目錄下,然後打開這個項目並運行。它會將lib下的所有庫打包成tar文件放在dist\package目錄下。

還會將res目錄存放的案例打包成zip放到dist\samples下,同時生成庫的json信息。而dist\exlibs.json是所有庫的彙總信息。

格式如下:

{
    "goquery":{
        "author":"kanadeblisst",
        "description":"goquery封裝庫,用於解析HTML",
        "url":"http://git.pygrower.cn/kanadeblisst/aardio-extlibs/raw/branch/master/dist/package/goquery.tar.lzma",
        "version":"1.0.0.1",
        "weight":1
    }
}

後面只需把項目代碼(extlibs.aardiomain.aardio)里的git地址換成你自己的git地址

thread.set("GithubRepo", "http://git.pygrower.cn/kanadeblisst/aardio-extlibs");

具體流程

運行了項目之後就會在dist目錄下生成需要的文件,而這些文件都可以通過鏈接直接訪問到。

比如exlibs.json的鏈接就是倉庫地址+ /raw/branch/master/dist/exlibs.json,這樣就能下載到所有的庫信息,然後把它顯示到界面。

下載的函數只需要在ide.requestLibInfo這個庫函數基礎上修改下url,代碼如下

var requestLibInfo = function(libName){
	return ..thread.invokeAndWait(
		function(libName){
			import web.rest.jsonLiteClient;
			
			var repoUrl = thread.get("GithubRepo");
			var url = repoUrl + "/raw/branch/master/dist/exlibs.json";
			var http = web.rest.jsonLiteClient(null,"");
			var libApi = http.api(url)
			var listLib = libApi.get();
			http.close();
			var lib;
			if(libName){
				lib = listLib[libName];
				lib["libName"] = libName;
			}else{
				lib = listLib;
			}
			
			return lib;
		},libName
	) 
};

requestLibInfo

官方使用的ide.requestLibInfo來下載庫信息。但url是在函數里寫死的,我並不想修改ide這個庫的代碼,又想讓這個函數去我指定的鏈接下載庫信息,怎麼操作最方便?

最先想到的肯定是將var libs = ide.requestLibInfo();改成var libs = requestLibInfo();,我不用它就行了。

但有個問題ide.installLib方法也被使用了,而且還調用了ide.requestLibInfo,難道又要重寫installLib?

偷懶的修改方式

當然不用,修改的話很簡單,只需要多加一行代碼:

import ide;
ide.requestLibInfo = requestLibInfo;
var libs = ide.requestLibInfo();

新增了ide.requestLibInfo = requestLibInfo;這行代碼後,在ide.installLib里調用的ide.requestLibInfo也會被替換成我的函數。

這樣就只多了一行代碼,不用去重寫多個函數。如果在多線程使用的話,同樣需要新增這行代碼。

hook

上面這個思路其實很常見,專業名詞的話是hook。比如我之前寫的Python調用ocr,有人提了個需求:https://github.com/kanadeblisst00/wechat_ocr/issues/6

這個需求很小眾,根本不用去修改庫代碼來實現,只需要hook一下print就能做到:

import builtins

def my_print(*args, **kwargs):
    pass
builtins.print = my_print

如果只想過濾某個模塊的print,可以通過inspect模塊獲取上上層調用的函數和所在模塊,根據函數名或模塊名就能過濾掉指定模塊的print列印

import builtins


def caller_info():
    # 獲取當前幀的上一幀,即調用者的幀
    caller_frame = inspect.currentframe().f_back.f_back
    # 獲取調用者所在的模塊和函數
    caller_module = inspect.getmodule(caller_frame)
    caller_name = caller_frame.f_code.co_name
    # 如果能獲取到調用者模塊,則提取模塊名;否則為None
    module_name = caller_module.__name__ if caller_module else None
    return module_name, caller_name

old_print = builtins.print

def my_print(*args, **kwargs):
    module_name, caller_name = caller_info()
    if "ocr" not in module_name:
        old_print(*args, **kwargs)
builtins.print = my_print

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...