aardio教程) 搭建自己的扩展库仓库

前言

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是所有库的汇总信息。

格式如下:

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,代码如下

javascript 复制代码
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?

偷懒的修改方式

当然不用,修改的话很简单,只需要多加一行代码:

javascript 复制代码
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就能做到:

python 复制代码
import builtins

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

如果只想过滤某个模块的print,可以通过inspect模块获取上上层调用的函数和所在模块,根据函数名或模块名就能过滤掉指定模块的print打印

python 复制代码
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
相关推荐
try2find23 分钟前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取1 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector3 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习3 小时前
Python入门Day2
开发语言·python
Vertira3 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉3 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗3 小时前
黑马python(二十四)
开发语言·python
晓13134 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr
是小王同学啊~4 小时前
(LangChain)RAG系统链路向量检索器之Retrievers(五)
python·算法·langchain
AIGC包拥它4 小时前
提示技术系列——链式提示
人工智能·python·langchain·prompt