HarmonyOS 鸿蒙Next 自定义hvigrow插件怎么扫描实现了某个装饰器的所有类

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 自定义hvigrow插件怎么扫描实现了某个装饰器的所有类 项目想要扫描实现了某个装饰器的所有类,从而动态import来触发装饰器的执行
目前是导入了所有的自研库,但是有些库可能每实现这个装饰器,是否有其它方案可行?

代码如下:

export function routerAutoRegisterPlugin(): HvigorPlugin {
    return {
        pluginId: 'routerAutoRegisterPlugin',
        apply(node: HvigorNode) {
            console.log('[routerAutoRegisterPlugin] start======');
            // const rootNodeContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN);
            const hapContext = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;

            if (!hapContext) {
                console.log('[routerAutoRegisterPlugin] hapContext is null.');
                return;
            }
            const dependenciesInfo = hapContext.getDependenciesOpt();

            let allPlug = ''
            let runtimePackages:string[] = []
            let index = 0
            for (let library in dependenciesInfo){
                if (library.search('iflytek') > 0){
                    // console.log('[routerAutoRegisterPlugin] find iflytek library:' + library)
                    runtimePackages[index]=library
                    allPlug+=(library+',')
                    index++
                } else {
                    console.log(library)
                }
            }
            console.log('[routerAutoRegisterPlugin] allplug=' + allPlug)
            console.log('[routerAutoRegisterPlugin] runtimePackages=' + runtimePackages)

            const buildProfileInfo = hapContext.getBuildProfileOpt();
            console.log('[routerAutoRegisterPlugin] old runtimeOnly.packages is:');
            console.log(buildProfileInfo.buildOption.arkOptions.runtimeOnly.packages)

            let newBuildProFile = buildProfileInfo
            newBuildProFile.buildOption.arkOptions.runtimeOnly.packages = runtimePackages
            newBuildProFile.buildOption.arkOptions.buildProfileFields.allPlug = allPlug

            console.log('[routerAutoRegisterPlugin] setBuildProfileOpt:');
            hapContext.setBuildProfileOpt(newBuildProFile)
            console.log('[routerAutoRegisterPlugin] new runtimeOnly.packages is:');
            console.log(buildProfileInfo.buildOption.arkOptions.runtimeOnly.packages)
            console.log('[routerAutoRegisterPlugin] end======');

        }
    }
}

更多关于HarmonyOS 鸿蒙Next 自定义hvigrow插件怎么扫描实现了某个装饰器的所有类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

一、需要注册一个rollup插件,并根据arkts的ast扫描,来获取实现了某个装饰器的类

二、注册rollup插件指导文档为: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-build-expanding-sample-0000001824472821-V5

三、注册rollup插件代码示例如下

1、新建Stage工程
2、在entry模块的根目录下创建一个文件compilePlugin.ts,内容为
function plugin1() {
  return {
    name: 'plugin1',
    buildStart() {
      console.log('buildStart1');
    },
    buildEnd() {
      console.log('buildEnd1');
    },
    transform(code,id){
      // 操作抽象语法树,获取实现了某个装饰器的类
    }
  }
}

export default plugin1();

3、在entry模块的hvigorfile.ts中修改代码,同步
import { hvigor, HvigorNode, HvigorPlugin } from '@ohos/hvigor';
import { hapTasks, OhosHapContext, OhosPluginId, Target } from '@ohos/hvigor-ohos-plugin';

export function customPlugin(): HvigorPlugin {
    return {
        pluginId: 'customPlugin',
        async apply(node: HvigorNode): Promise<void> {
            hvigor.nodesEvaluated(() => {
                const hapContext = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext;
                hapContext?.loadCompilePlugin('./compilePlugin.ts');
            });
        }
    };
}

export default {
    system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
    plugins: [customPlugin()] /* Custom plugin to extend the functionality of Hvigor. */
}
4、点击build hap,查看控制台中打印信息

四、操作ast文档为: https://stackoverflow.com/questions/69657572/can-rollup-plugins-access-the-ast-created-by-previous-plugins-in-the-plugin-chai

更多关于HarmonyOS 鸿蒙Next 自定义hvigrow插件怎么扫描实现了某个装饰器的所有类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬,有办法在插件里更改编译后的产物吗,

基本信息

<div>
    <p>大佬,有办法在插件里更改编译后的产物吗,</p>
    <div>基本信息</div>
    <pre><code class="language-css">/* 深色代码主题 */
/* 代码内容 */
</code></pre>
    <img src="" alt="图片">
</div>

在HarmonyOS鸿蒙Next系统中,自定义hvigrow插件扫描实现了某个装饰器的所有类,通常涉及到插件内部对鸿蒙系统类加载机制和注解处理的深入理解和应用。

要实现这一功能,你需要:

  1. 定义装饰器:首先,确保你的装饰器在鸿蒙系统中是可识别和应用的。装饰器通常用于标记特定的类,以便后续处理。

  2. 插件扫描机制:在hvigrow插件中,实现一个类扫描机制。这通常涉及到遍历鸿蒙系统的类加载器,查找所有被特定装饰器标记的类。

  3. 注解处理:鸿蒙系统支持注解处理,你可以利用这一点来解析装饰器注解,并收集所有被装饰的类。

  4. 结果处理:将扫描到的类进行必要的处理或记录,以满足你的插件需求。

需要注意的是,鸿蒙系统的类加载机制和注解处理可能与Android或其他Java平台有所不同,因此具体实现时需要参考鸿蒙系统的开发文档和API。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部