首页 > 其他分享 >aardio教程) 搭建自己的扩展库仓库

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

时间:2024-03-27 09:15:37浏览次数:21  
标签:教程 lib aardio caller requestLibInfo print ide 搭建

前言

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 发布!

标签:教程,lib,aardio,caller,requestLibInfo,print,ide,搭建
From: https://www.cnblogs.com/kanadeblisst/p/18098123

相关文章

  • AI实用指南:5分钟搭建你自己的LLM聊天应用
    今天,我们将迅速着手搭建一个高效且富有创意的混元聊天应用,其核心理念可以用一个字来概括——快。在这个快节奏的时代,构建一个基础的LLM(LargeLanguageModel,大型语言模型)聊天应用并不需要耗费太多时间。市面上充斥着各种功能强大的大型语言模型,我们可以根据项目需求灵活选择,而今天......
  • GitHub WebHook 使用教程
    本文收录于Github.com/niumoo/JavaNotes,Java系列文档,数据结构与算法!本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗什么是WebHookWebHook直译是网络钩子,可以把WebHook看做一种通知方式,只要发生关注的事件,就会发送通知到我们指定的Web服务。使用WebHoo......
  • 使用Nexus搭建私服:加速依赖管理和提高项目稳定性
    在软件开发过程中,依赖管理是至关重要的一环。随着项目的增长和复杂性的提升,对于依赖库的管理变得越来越复杂。为了解决这一问题,搭建一个私有的仓库是一个明智的选择。本文将介绍如何使用Nexus搭建私服,并利用其来加速依赖管理和提高项目稳定性。什么是Nexus?Nexus是一款强大......
  • 服务器运维新手的第一台服务器学习教程
    目前刚接触服务器这一块的学习,这里记录一下解如何获取自己的第一台虚拟云服务器,给刚入行服务器开发的小伙伴做一个参考。具体的步骤如下:一、服务器的注册和获取1、打开bwg88服务器平台地址:点击进入https://bwh88.net/aff.php?aff=743202、进入到官网界面后如下图:3、点击注......
  • 中国国内怎么使用订阅升级Duolingo多邻国plus?多邻国使用教程
    多邻国Duolingo合租平台,环球巴士首单9折优惠码:110072多邻国Duolingo是什么,能用来做什么?众所周知,多邻国考试的性价比非常高,不仅考试时间短,出分也很快,国际认可度越来越高。不过要注意的是,虽然相比托福和雅思,多邻国的考试难度有所降低,但依旧需要同学们投入大量时间和精力备考,想要......
  • 最详细爬虫零基础教程11——html格式提取之xpath
    文章目录一、html和xml二、xpath获取节点属性三、xpath语法四、案例展示总结一、html和xmllxml是一款高性能的PythonHTML/XML解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息。区别:1.xml被设计为传输和存储数据,其焦点是数据的内容2.html是显示......
  • 最详细爬虫零基础教程10——json格式提取之jsonpath
    文章目录一、json数据解析二、案例演示1.解析获得数据2.简化代码3.豆瓣json数据解析总结一、json数据解析用来解析多层嵌套的json数据;JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript,Python,PHP和Java。语......
  • CycleGAN训练教程
    目录项目下载链接 CycleGAN概述CycleGAN原理CycleGAN的应用场景 训练过程    代码内容        环境配置        预训练权重下载        下载训练数据        参数设置        训练操作        训练界面......
  • Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE
    前面几篇文章讲了那么多似乎和Docker无关的实战操作,本篇总算开始说到Docker了。1、关于Docker1.1、什么是DockerDocker概念就是大概了解一下就可以,还是引用一下百度百科吧:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然......
  • Docker搭建持续集成平台Jenkins最简教程
    前言持续集成(ContinuousIntegration,CI)是软件开发中的一种实践,它旨在通过频繁地集成代码变更并自动运行测试,以确保代码的质量和稳定性。Jenkins是一个广泛使用的开源持续集成工具,它能够自动化构建、测试和部署软件项目。在本文中,我们将使用Docker搭建一个基于Jenkins的持续......