process:<program> 权限:用户批准程序后,IDE 按绝对路径和内容哈希固定(pin)它,
并在每次启动前重新校验。在此基础上,插件可以:
运行检测器
运行检测器是一种静态配置,在项目根目录包含其标记文件之一时提供:process:<command> 已授权,这个配置就会出现在检测到的配置中,并启动已批准的程序。不需要代码。
Solidity 为 Foundry 和 Hardhat 声明了检测器。
由代码提供配置
当配置取决于项目内容(比如package.json 中的脚本)时,声明标记文件并导出 run-configurations:
PluginRunConfiguration 包含 id、name、program、args、可选的项目内 cwd、test 和可选的 framework。
请返回该项目根目录的完整列表;列出配置时会刷新。宿主最多保留 1000 项 / 4 MiB,导出失败时保留上一次有效的列表,
程序未获批准的条目不会提供。该导出在没有窗口的情况下运行,不能弹出对话框。
测试结果
设置framework = "plugin"(在检测器或返回的配置上)后,IDE 会把运行输出交给 test-results 导出。
注册 test_results 并实现 TestResults:
parse(config, chunk)收到配置的短 id 和顺序到达的输出分块,分块不一定在换行处结束:请在两次调用之间保留残缺的行。- 事件:
SuiteStarted、TestStarted、Passed、Failed(比较类失败可带expected/actual)、Skipped、Output。 测试 id 只在本次运行内有效;父节点必须已经存在。位置使用项目内的绝对路径、从 0 开始的行号和 UTF-16 列号;耗时单位为毫秒。 - 每批调用使用编辑器提供者预算,最多返回 10,000 个事件 / 4 MiB。解析器缺失、出错或返回无效结果时,该次运行改用内置解析器。
select_tests(config, tests)收到测试树中的名称路径(从父套件到测试,与树中显示一致),返回只运行这些测试的完整参数列表。 有了它才能使用 重新运行失败的测试,以及测试树条目上的 运行 / 调试。默认返回None(不支持选择)。
从代码启动运行
host::start_run(config, &args, debug)(API 1.4)在发起调用窗口的 运行 工具窗口中启动本插件的某个配置
(检测器 id 或导出返回的配置;短 id 或 plugin:<plugin-id>:<config-id> 均可),并追加 args。
它返回一个操作 id,随后会收到 run-exited 事件({id, config, status, killed}),即使没有订阅也会发给所属插件。
Test Runner 示例中,行号槽按钮把测试名作为参数传入:
invalid。只能在命令或事件中调用,不能在激活或提供者中调用。
运行目标
运行目标是项目级的包装程序:选用它的每一次运行、测试、脚本和解释器启动,都会被改写为通过插件所有的程序执行, 比如ddev、lando 或容器 CLI。运行目标会出现在 设置 › 构建、执行、部署 › 运行目标 以及每个运行配置的
运行于 选择器中,并标注所属插件。
命令行如何构造
宿主直接构造 argv,不经过 shell:- 无覆盖:
program + args + workdir_args + command + command arguments。 - 覆盖项的名称与命令的程序名(去掉
.exe、.cmd、.bat的文件名)匹配时:program + override + workdir_args + command arguments。覆盖项同时替换args和命令名,所以要包含工具本身。
public/ 下运行 php x.php 会变成 ddev exec --dir=/var/www/html/public -- php x.php,
composer install 会变成 ddev composer --dir=/var/www/html/public -- install。
workdir_args的每个元素都可以包含{cwd},替换为映射到container_root下的配置工作目录。没有container_root或工作目录在项目之外时,会省略全部workdir_args。不提供workdir_args时,由包装程序自己管理目录。- 设置了
container_root时,argv 中的项目路径会映射到该目录下。项目之外的本地绝对工具路径会变成工具的文件名。 - 包装程序进程总是在配置的本地工作目录中启动,这样 DDEV 之类的工具才能找到自己的项目。配置的环境变量和 env 文件 会传给包装程序;是否转发进容器由包装程序决定。
host::register_run_target_with_overrides 接受
PluginRunTargetWithOverrides,其 commands 是 PluginCommandOverride { name, args, workdir_args }。
workdir_args: None 继承目标的列表,Some(vec![]) 省略,Some(args) 为该命令替换:
composer install 就变成 ddev composer install,而 php x.php 仍是 ddev exec --dir=/var/www/html/public -- php x.php。
选用运行目标
注册本身不会改变任何选择。第一次注册时,项目窗口会询问 “在此项目中使用<name> 运行 PHP / Node / Composer?”,
提供 使用 和 暂不使用;答案按项目、插件和目标 id 记住。选择 使用 会把它设为项目的默认运行目标,
以及 PHP 和 Node 的运行目标。解释器设置中还有 在目标中运行 选项(默认运行目标、本地计算机 或某个具名目标)。
单个配置上明确指定的目标优先。
规则与限制
- 每次启动都会检查项目信任、包装程序的进程授权及其可执行文件固定(包括在 设置 › 插件 中按项目选择的可执行文件)。
- 在插件运行目标上调试会返回
invalid;语言服务器、工具发现和版本探测仍在本地进行。 - 目标缺失时运行直接失败,不会悄悄改为本地运行。
- 每个插件每个项目最多 32 个目标、64 个命令覆盖,每个前缀最多 256 个参数(各 16 KiB),每次注册的元数据最多 256 KiB。
- 目标在空闲回收后保留。停止、禁用、重新加载或卸载插件时撤回;
host::unregister_run_target(&project, id)删除单个目标。 远程项目中,注册和执行都在服务器上进行。
启动前校验(API 1.5)
导出run-target-validation,在运行或测试即将启动前检查包装程序的运行环境:
RunTargetLaunch 包含 operation(Run 或 Test)、被包装的程序名 program 和本地绝对工作目录 cwd;
不传递参数和环境变量。返回 Err(message) 会通过正常的错误路径拒绝启动,消息前加插件名(最多 4096 字节)。
陷入异常或超时(默认 5 秒)也会拒绝启动。没有该导出的插件照常启动。
运行程序
- 只能在受信任项目中运行
process:授权所固定的程序。远程项目中,程序在服务器上解析和运行。 - 环境变量只能追加:名称已存在于准备好的环境中(包括登录 shell 的
PATH)会报错。最多 64 项。 - 调用会随任务或调用一起取消,超时即终止;耗时的工作请放进
host::begin_task。丢弃Child会终止进程, 禁用或回收插件会结束它启动的所有子进程。 - 用户可以在 设置 › 插件 中为
process:授权全局或按项目选择可执行文件;插件仍使用其声明的程序名调用。