() scheduleResult, err := sched.schedule(pod, pluginContext) if err ! *framework.PluginContext) (core.ScheduleResult, error) { result, err := sched.Algorithm.Schedule (pod, pluginContext) if err ! ) (scheduleResult ScheduleResult, err error) Preempt(*framework.PluginContext, *v1.Pod, error) (selectedNode *framework.PluginContext) (result ScheduleResult, err error) { ...... // 1.检查 pod pvc if
() scheduleResult, err := sched.schedule(pod, pluginContext) if err ! *framework.PluginContext) (core.ScheduleResult, error) { result, err := sched.Algorithm.Schedule (pod, pluginContext) if err ! ) (scheduleResult ScheduleResult, err error) Preempt(*framework.PluginContext, *v1.Pod, error) (selectedNode *framework.PluginContext) (result ScheduleResult, err error) { ...... // 1.检查 pod pvc if
hvigorfile.ts文件中只需定义一个pluginId(任务Id)和name(任务名称),并实现其中的run方法,即可创建一个任务,然后当前node节点添加插件并执行插件的apply方法,然后调用接口pluginContext : string) { return { pluginId: 'CustomPluginID1', apply(pluginContext) { //注册自定义任务 接口pluginContext 方法registerTask pluginContext.registerTask({ // 编写自定义任务 name: 'customTask1', : string) { return { pluginId: 'CustomPluginID2', apply(pluginContext) { pluginContext.registerTask : string) { return { pluginId: 'CustomPluginID3', apply(pluginContext) { pluginContext.registerTask
framework: ") << Exception.what(); return 1; } //install plugin ctkPluginContext* pluginContext = framework->getPluginContext(); QSharedPointer<ctkPlugin> Plugin = pluginContext->installPlugin { std::cout << "Error in " << pluginSymbolicName << std::endl; return UNKNOW_EXCEPTION; } 获取pluginContext
scheduleResult, err := sched.schedule(pod, pluginContext) // predicates 算法和 priorities 算法执行失败 // 执行抢占机制 preemptionStartTime := time.Now() sched.preempt(pluginContext k8s.io/kubernetes/pkg/scheduler/scheduler.go:352 func (sched *Scheduler) preempt(pluginContext *framework.PluginContext ", err } // 执行抢占算法 node, victims, nominatedPodsToClear, err := sched.Algorithm.Preempt(pluginContext *framework.PluginContext, pod *v1.Pod, scheduleErr error) (*v1.Node, []*v1.Pod, []*v1.Pod, error) {
qt_gui.composite_plugin_provider import CompositePluginProvider import rclpy from rqt_gui.ros2_plugin_context import Ros2PluginContext _init_node() ros_plugin_context = Ros2PluginContext(handler=plugin_context. rclcpp::shutdown(); } } void* RosCppPluginProvider::load(const QString& plugin_id, qt_gui_cpp::PluginContext plugin_context); } qt_gui_cpp::Plugin* RosCppPluginProvider::load_plugin(const QString& plugin_id, qt_gui_cpp::PluginContext
const { code: scriptCode, map: scriptMap } = await genScriptCode( descriptor, options, pluginContext async function genScriptCode(descriptor, options, pluginContext, ssr, customElement) { let scriptCode ({ code: templateCode, map: templateMap } = await genTemplateCode( descriptor, options, pluginContext , ssr, customElement) { const result = compile( code, descriptor, options, pluginContext async function transformStyle(code, descriptor, index, options, pluginContext, filename) { const block
*framework.PluginContext) (result ScheduleResult, err error) { ...... // 执行 predicates 策略 filteredNodes, failedPredicateMap, filteredNodesStatuses, err := g.findNodesThatFit(pluginContext, pod /kubernetes/pkg/scheduler/core/generic_scheduler.go:464 func (g *genericScheduler) findNodesThatFit(pluginContext *framework.PluginContext, pod *v1.Pod) ([]*v1.Node, FailedPredicateMap, framework.NodeToStatusMap, error } } // 4.执行 Filter Plugin status = g.framework.RunFilterPlugins(pluginContext
scheduleResult, err := sched.schedule(pod, pluginContext) // predicates 算法和 priorities 算法执行失败 // 执行抢占机制 preemptionStartTime := time.Now() sched.preempt(pluginContext k8s.io/kubernetes/pkg/scheduler/scheduler.go:352 func (sched *Scheduler) preempt(pluginContext *framework.PluginContext ", err } // 执行抢占算法 node, victims, nominatedPodsToClear, err := sched.Algorithm.Preempt(pluginContext *framework.PluginContext, pod *v1.Pod, scheduleErr error) (*v1.Node, []*v1.Pod, []*v1.Pod, error) {
*framework.PluginContext) (result ScheduleResult, err error) { ...... // 执行 predicates 策略 filteredNodes, failedPredicateMap, filteredNodesStatuses, err := g.findNodesThatFit(pluginContext kubernetes/pkg/scheduler/core/generic_scheduler.go:464 func (g *genericScheduler) findNodesThatFit(pluginContext *framework.PluginContext, pod *v1.Pod) ([]*v1.Node, FailedPredicateMap, framework.NodeToStatusMap, error } } // 4.执行 Filter Plugin status = g.framework.RunFilterPlugins(pluginContext
{ return &pluginContext{} } type pluginContext struct { // 嵌入默认的插件上下文,这样我们就不需要重新实现所有方法 types.DefaultPluginContext func (ctx *pluginContext) NewHttpContext(contextID uint32) types.HttpContext { return &httpRegex{ contextID: contextID, pluginContext: ctx, } } // OnPluginStart 在插件被加载时调用。 contextID uint32 pluginContext *pluginContext } // OnHttpResponseHeaders 在收到 HTTP 响应头时调用。 proxywasm.SetVMContext(&vmContext{}) } 在上面的代码中,我们主要关注 pluginContext 和 httpRegex 这两个结构体,其中 pluginContext
, id], // source.code 和 模块id transformReducer, // 第四个参数是一个函数,用来声明某些钩子上下文中需要的方法 (pluginContext ); return { ...pluginContext, cache: trackedPluginCache ? trackedPluginCache.cache : pluginContext.cache, warn(warning: RollupWarning | string, warning.id = id; warning.hook = 'transform'; pluginContext.warn err.id = id; err.hook = 'transform'; return pluginContext.error
,把pluginResources设置到pluginContext中去 //我们这创造的这个context ,是个 ContextThemeWrapper ,导入的包是android x 下的 ContextThemeWrapper pluginContext = new ContextThemeWrapper(getBaseContext(),0); Class classname = pluginContext.getClass(); try { Field field = classname.getDeclaredField ("mResources"); field.setAccessible(true); field.set(pluginContext, pluginResources 创造view View view = LayoutInflater.from(pluginContext).inflate(R.layout.activity_main, null);
: object | null }) { // ... } // 插件上下文插件,实现了 rollup 插件的接口 class Context implements PluginContext container } 直接看上面的代码逻辑非常清晰,定义了 Context 和 TransformContext 两个类,TransformContext 是 Context 的子类,Context 实现了 PluginContext PluginContext 是从 rollup 包导入的。所以 vite 的插件跟 rollup 的插件基本一致,但也不是完全兼容。 ssr // 创建函数执行上下文,根据上图 Context 是 Vite 继承于 rollup 的 PluginContext const ctx = new Context() ctx.ssr MinimalPluginContext 直接复用 rollup,Context 复用了 rollup 的 PluginContext 的绝大部分能力,但是也有不兼容的情况,比如 emitFile、setAssetSource
//点击插件,加载资源 //资源需要通过资源加载器进行加载--context //记住是plugin的context //1.获取插件的上下文 Context pluginContext = findPluginContext(position); //2.从插件上下文加载资源 int resId = findResoucesId(pluginContext, position = 0) { Drawable drawable = pluginContext.getResources().getDrawable(resId); mRelativeLayout.setBackgroundDrawable 里面逻辑就是通过反射机制,使用插件的Context来获取R.java文件下的静态类drawable,返回插件应用里的图片id,代码如下: private int findResoucesId(Context pluginContext , int position) { //使用反射机制 ClassLoader classLoader = new PathClassLoader(pluginContext.getPackageResourcePath
对象,PluginContext 类继承自 LayoutInflaterProxyContext ,里面封装了一些插件的信息,比如有插件资源、插件 ClassLoader 等。 值得一提的是,在插件中 PluginContext 可以得到“宿主”的 Context ,也就是所谓的“破壳”。具体可查看 PluginContext 的源码。 = null) { //初始化插件Activity Context baseContext = activity.getBaseContext(); PluginContext pluginContext = new PluginContext(baseContext, currentPlugin); try { try { //在许多设备上,Activity自身hold资源 Reflect.on(activity).set("mResources", pluginContext.getResources
types.DefaultVMContext } // Override types.DefaultVMContext. func (*vmContext) NewPluginContext(contextID uint32) types.PluginContext { return &pluginContext{contextID: contextID} } type pluginContext struct { // Embed the default contextID uint32 // callBack func(numHeaders, bodySize, numTrailers int) cnt int } func (*pluginContext types.HttpContext { return &types.DefaultHttpContext{} } // Override types.DefaultPluginContext. func (ctx *pluginContext tickMilliseconds) return types.OnPluginStartStatusOK } // Override types.DefaultPluginContext. func (ctx *pluginContext
string]LocalDescriptor) (*Builder, error) { pb := &Builder{ middlewareDescriptors: map[string]pluginContext {}, // 中间件类型插件包名:插件实例 providerDescriptors: map[string]pluginContext{}, // 提供者类型插件包名:插件实例 } manifest.Type { case "middleware": // 将 middleware 类型插件放置到这里 pb.middlewareDescriptors[pName] = pluginContext manifest.BasePkg, } case "provider": // 将 provider 类型插件放置到这里 pb.providerDescriptors[pName] = pluginContext pkg/plugins/middlewares.go 的 40 行,同样是使用解释器执行插件的 CreateConfig 和 New 函数: func newMiddleware(descriptor pluginContext
Manager'; // 引入React import * as React from 'react'; // 引入相关API的类和函数 import { actions, PluginContext , appRegistry } from 'cloudstudio'; // 初始化插件上下文 const context = new PluginContext({}); / JSON.stringify(after)) } index.jsx注册插件: import Manager from 'webide-plugin-sdk/Manager'; import { actions, PluginContext /snippets.json'; const context = new PluginContext({}); // 插件唯一 key // 一定要确保代码中 pluginKey 的唯一性,推荐使用
classLoader) { mProxy = true; mProxyActivity = context; mPluginContext = new PluginContext classLoader, PackageInfo packageInfo) { mProxy = true; mProxyActivity = context; mContext = new PluginContext (context, 0, mApkFilePath, mDexClassLoader); attachBaseContext(mContext); } PluginContext中通过重载getAssets 来实现包括插件apk查找路径的Context: public PluginContext(Context base, int themeres, String apkPath, ClassLoader