跳到主要内容

运行代码

✍在本篇内容中你将学习到如何运行脚本这一基础功能。看上去内容很多?实际上一点也不难

$ arcadia run
❖ Arcadia CLI - 执行代码文件

使用方法:

arcadia run <name/path/url> [--options]

命令选项:

-l, --loop 循环运行,连续多次的执行代码文件,选项后需跟循环次数
-s, --silent 静默运行,不推送任何通知消息
-w, --wait 推迟执行,等待指定时间后再运行任务,选项后需跟时间值
-D, --delay 延迟执行,随机倒数一定秒数后再执行代码文件
-d, --daemon 守护进程,将代码文件设置为守护进程保持在后台运行,期间中断或结束会自动重新运行
-a, --agent 网络代理,使代码文件通过 HTTP/HTTPS 全局代理进行网络请求,仅支持 Node.js 和 TypeScript 脚本
-T, --timeout 运行超时,设置运行任务超时机制,选项后需跟 timeout 命令选项
-N, --no-log 忽略日志,不存储代码运行日志到本地
-p, --proxy 下载代理,仅适用于执行位于 GitHub 仓库的代码文件,代理固定为 jsDelivr CDN
-c, --concurrent 并发运行,默认运行1个任务,若想增加运行任务数量那么请传参任务数量
-b, --background 后台运行,不在前台输出代码执行进度,不占用终端命令行
-r, --recombine-env 变量重组,按照指定顺序重新组合复合变量的值,选项后需跟变量名称、分隔符、重组表达式
表达式语法:多个值用 "," 隔开,值区间用 "-" 连接,可以用 "%" 表示值的总数
-R, --recombine-env-group 分组运行,为每组变量单独运行,是变量重组的扩展,传参基本一致,其中重组表达式内用 "@" 来区分不同组
-S, --split-env 拆分运行,将复合变量的值拆分后为每个值声明变量并单独运行代码文件,选项后需跟需要拆分的变量名称、分隔符

-B,--use-bun 使用 Bun 作为 JavaScript 和 TypeScript 的运行时环境,替代默认的 Node.js 和 ts-node

命令帮助:

<name> 文件名(仅scripts目录) <path> 相对路径或绝对路径 <url> 链接地址 [--options] 命令选项

使用方法

arcadia run <name/path/url> [--options]
  • name 文件名称

    仅限 scripts 个人目录下的代码文件,并且仅涵盖 根目录,你可以把你常用的脚本存放在这里

  • 路径 path

    相对路径或绝对路径,支持使用 ../ 作为当前目录和用 ../ 作为上级目录,如果执行本地的个人代码文件则可以省略路径
    如果执行的是已配置的代码仓库中的代码文件可以使用相对路径,例如 /arcadia/repo/<仓库目录名称>/example.js 可以使用 repo/example.js 替代

  • 链接地址 <url>

    执行后代码文件默认保存在 scripts 个人目录,支持链接自动纠正功能
    链接自动纠正功能是当拉取位于远程托管仓库的代码文件时可自动将 blob 链接转换为 raw 原始文件链接,此功能已应用到整个项目

  • 命令选项 [--options]

    用于实现一些扩展功能,具体请查看下方的文档内容

你需要掌握的一些基础概念

关于日志存储

默认情况下代码文件在执行后会自动将日志存放在 log 目录下的文件夹内,会以目录的形式进行分类
目录名中的主要组成部分是代码文件名称,用户导入代码文件的日志目录名称为<仓库名/raw>_文件名去后缀,中间用下划线分割

支持直接运行的代码文件类型

目前支持的代码文件类型有 js mjs cjs py ts go lua ruby pl c sh,项目已默认预装了 JavaScriptPythonPerl 的运行环境,后续会适配更多语言类型

当执行本地代码文件时,文件名的后缀格式(代码文件类型)可以省略,届时将启用模糊查找,优先级为 JavaScript > Python > TypeScript > Go > Lua > Ruby > Perl > C > Shell,当存在同名代码文件时仍适用此规则

关于运行代码文件所需的依赖

这部分内容与项目命令无关,用于解决代码文件运行时缺少第三方依赖库报错的问题,具体详见 运行环境 文档

命令选项(高级用法)

使用方法:追加在命令的末尾,熟练后可以使用简写
一个高级的应用程序CLI指令往往有着复杂的命令选项设计,这可能是一个漫长的学习过程~

选项用途选项值描述
-l, --loop循环运行连续多次运行代码文件,选项后需跟 循环次数(正整数),该参数与 等待执行延迟执行 参数同时使用时仍然有效互不干涉
-s, --silent静默运行静默运行任务不推送任何通知消息
-w, --wait推迟执行等待指定时间后再运行代码文件,选项后需跟 等待时间单位 作为参数值,具体参照 sleep 命令的用法
-D, --delay延迟执行随机倒数一定秒数后再运行代码文件,该秒数上限可以在配置文件中定义
-d, --daemon守护进程通过 PM2 将代码文件设置为守护进程保持在后台运行,期间中断或结束会自动重新运行
-a, --agent网络代理使代码文件通过 HTTP/HTTPS 全局代理进行网络请求,目前仅支持 Node.js 和 TypeScript 脚本,使用该功能需要自行在配置文件对应处定义代理地址变量
-T, --timeout运行超时设置运行任务超时机制,选项后需跟 timeout 命令选项作为选项值
-N, --no-log忽略日志不存储代码运行日志到本地
-p, --proxy下载代理仅适用于执行位于 GitHub 仓库的远程文件,该代理固定为 jsDelivr 公共 CDN 加速代理
-c, --concurrent并发运行默认运行1个任务,若想增加运行任务数量那么请传参 任务数量(正整数)
-b, --background后台运行不在前台输出代码执行进度,不占用终端命令行
-r, --recombine-env变量重组按照指定顺序重新组合复合变量的值,选项后需跟变量名称、分隔符、重组表达式。表达式语法:多个值用 , 隔开,值区间用 - 连接,可以用 % 表示值的总数
-R, --recombine-env-group分组运行基于变量重组功能上的扩展应用,为每组变量单独运行代码文件,传参与变量重组功能基本一致,其中重组表达式内用 @ 来区分不同组
-S, --split-env拆分运行将复合变量的值拆分后为每个值声明变量并单独运行代码文件,选项后需跟需要拆分的变量名称、分隔符
-B, --use-bunBun使用 Bun 作为 JavaScript 和 TypeScript 的运行时环境,替代默认的 Node.js 和 ts-node

如何区分并发运行与后台运行?

通俗易懂的来说并发就是同一时间启动多个任务在后台运行,所以这意味着运行单个任务时使用并发运行命令选项是无意义的行为。
这两个命令选项的作用实际上是等价的,为了便于理解才分开设计,你需要加强对功能的理解以作出正确的选择判断。

项目命令会根据运行的任务数量动态检测使用场景,届时会判定一些无意义的操作从而报错跳出。
例如分组运行和拆分运行就是多任务类型,你应该使用并发运行而不是后台运行。

关于并发任务的一些注意事项

在并发运行代码文件时,会将每个任务的运行日志存储在独特的日志文件中,文件名会使用特殊的标记以进行区分,具体规则如下:

  • g<index> 代表分组运行时的标记、e<index> 代表拆分运行时的标记、t<index> 表示并发任务数
目前并发运行的底层实现逻辑较为原生,暂时没有控制并发线程数的概念即全量并发,所以请合理使用以减少对系统造成的压力

关于重组表达式的应用示例

在 Linux 系统命令行中有一些特殊的字符例如 ; &,届时你应该用引号包裹以避免传递错误

接下来是一些示例用法,以 example.js 脚本和 TEST_CONFIG 配置变量为例,其中 TEST_CONFIG 为复合变量且分隔符为 @

1. 指定第1个和第3个配置
arcadia run example.js -r TEST_CONFIG @ 1,3
2. 指定第1个至第5个配置
arcadia run example.js -r TEST_CONFIG @ 1-5
3. 倒序加载所有配置
arcadia run example.js -r TEST_CONFIG @ %-1
4. 以第1个和第2个、第3个至第5个配置为两组分别运行
arcadia run example.js -R TEST_CONFIG @ 1,2@3-5

什么是守护进程?

守护进程是可以周期运行的特殊进程,在这里指的是将代码文件设置为后台进程循环运行
当代码文件运行结束或中断时会自动重新运行,适用于需要长期连续运行的代码文件
针对同一个代码文件只可存在一个守护进程,这就意味着当被运行代码文件存在多个任务时是不允许设置守护进程的

  • 如何管理?

    查看有哪些守护进程正在运行
    pm2 list

    默认有四个项目内置的服务 arcadia_server arcadia_ttyd arcadia_inner tgbot,请不要删除它们其中的任何一个

    停止运行
    pm2 delete <任务名>