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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...