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

本文介绍了如何利用Aardio的扩展库发布工具,将自己的常用库打包并发布,以便于分享和在线安装。作者分享了制作过程、搭建教程和使用方法,包括如何修改IDE以指向自己的扩展仓库,以及利用hook技术进行库功能的定制化集成。

前言

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
### 关于 aardio 扩展库的使用方法及相关资料 #### PDFium-aardio 的使用 在 aardio 中,PDFium 已作为官方扩展库的一部分被收录,这意味着无需额外下载或安装该库。通过简单地导入 `fsys.pdfium` 即可实现其功能[^1]。 ```aardio import fsys.pdfium; var pdf = fsys.pdfium.open("example.pdf"); pdf.renderPageToImage(0).save("output.png"); ``` 上述代码展示了如何打开一个 PDF 文件并将其第一页渲染为图像文件。 #### 名字空间库的扩展方式 对于名字空间库的扩展,如果目标是内核库,则可以跳过导入基库的操作,因为这些库会被 IDE 自动加载。例如,在扩展 `table` 库时,可以通过定义新函数来增强现有功能[^2]: ```aardio namespace table { function maxIndex(array) { var maxValue = array[0]; var index = 0; for (i=1; i<array.len(); i++) { if (array[i] > maxValue) { maxValue = array[i]; index = i; } } return index; } } console.log(table.maxIndex([1, 3, 7, 2])); // 输出最大值索引:2 ``` 此示例演示了如何向 `table` 库添加一个新的函数用于查找数组中的最大值及其对应的索引位置。 #### 范例搜索工具 为了更高效地学习和应用 aardio 提供的功能,推荐使用由风行者开发的一款范例搜索工具。这款工具能够很好地集成到 aardio IDE 内部,并提供便捷的方式浏览各种案例[^3]。 #### 动态链接库(DLL)的支持与 C 语言接口调用 当涉及到外部动态链接库或者需要调用低级 API 函数时,aardio 支持 TCC 编译器以及 DLL 加载机制。以下是创建自定义 DLL 并调用其中函数的例子[^4]: ```aardio import tcc; // 创建TCC编译器对象 var vm = tcc(); // 添加标准Windows库支持 vm.addLib("user32", "kernel32", "gdi32"); // 定义C源码字符串 var code = ` #include <windows.h> int Msgbox(char* str){ MessageBoxA(NULL,str,"Message from Aardio",MB_OK); return strlen(str); } `; // 将C源码编译成DLL vm.output("/bin.dll", code); // 关闭TCC环境 vm.close(); // 加载生成好的DLL var dll = raw.loadDll("/bin.dll", , "cdecl"); // 声明API函数原型 dll.Msgbox = api("Msgbox", "int(string)"); // 测试调用消息框显示 dll.Msgbox("来自C语言的消息!"); ``` 这段脚本说明了怎样利用内置的 TCC 插件编写简单的 C 程序片段并将它们即时转换为可用组件的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值