资讯动态

Apify CLI-Based Actorization 实战:用 `apify actor` 命令把 Go/Rust/Java 等无 SDK 应用打包为 Apify Actor

发布时间:2026/10/21 3:29:50 来源:尧图企业网站定制
Apify CLI-Based Actorization 实战用apify actor命令把 Go/Rust/Java 等无 SDK 应用打包为 Apify Actor【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills导读在 agentic-awesome-skills 仓库的apify-actorization技能中CLI 化CLI-Based Actorization是一条面向「没有官方 SDK 的语言」的 Actor 化路径通过一个调用 Apify CLI 的包装脚本wrapper script让 Go、Rust、Java、C 等任意语言编写的现有程序都能以 Apify Actor 的形式在平台上以无服务器serverless方式运行。读完本文你将掌握如何编写start.sh包装脚本完成输入获取与结果推送、如何改造 Dockerfile 构建可运行容器、如何用模拟输入在本地完成测试以及配套的输入/输出 Schema 与actor.json配置方法最终把任意语言的命令行工具一键部署成可复用、可上架的 Apify Actor。一、什么是 CLI-Based Actorization适用场景与整体思路Apify 平台的 Actor 本质上是「打包为 Docker 镜像的程序」接收结构良好的 JSON 输入执行一段逻辑然后可选地产出结构化的 JSON 输出。官方 SDK 覆盖了 JavaScript/TypeScriptapifynpm 包与 Pythonapifypip 包但对于没有官方 SDK 的语言Go、Rust、Java、C、.NET 等就需要走 CLI 化路线用 Apify CLI 提供的actor:*系列命令在一个 shell 包装脚本中完成「读输入 → 跑程序 → 写输出」的完整闭环。这条路径在整个 Actor 化技能中的定位可以看 SKILL.md 里的语言分派逻辑语言安装方式代码包装方式JS/TSnpm install apifyawait Actor.init()...await Actor.exit()Pythonpip install apifyasync with Actor:其他CLI 化在包装脚本中使用 CLIapify actor:get-input/apify actor:push-data对照两条 SDK 路线的完整实现可见 js-ts-actorization.md 与 python-actorization.mdSDK 路线是在进程内初始化 Actor 生命周期Actor.init()/Actor.exit()或async with Actor:而 CLI 路线则把生命周期拆解为一条条 shell 命令在容器启动时由CMD [./start.sh]触发执行。适用场景源自 SKILL.md将现有项目改造成可在 Apify 平台上运行的 Actor为项目接入 Apify 平台能力把一个 CLI 工具或脚本包装为 Actor迁移 Crawlee 项目到 Apify。二、前置准备安装与登录 Apify CLICLI 化 Actor 的第一步是确认环境里有可用的apify命令行工具。技能文档给出的验证与安装方式如下# 验证是否已安装 apify --help # 未安装时选择一种方式 brew install apify-cli # 或者npm install -g apify-cli # 或者从官方发布包安装并由你的系统包管理器完成校验安装完成后还需确认已登录apify info # 应返回你的用户名如果未登录先检查环境变量APIFY_TOKEN是否已定义若也没有则需要在 Apify 控制台的 Integrations 设置中生成一个 token写入 shell 配置或密钥管理器注意不要直接把 token 明文留在命令历史中然后执行apify login需要说明的是这里的apify login/APIFY_TOKEN配置是后续apify actor:get-input、apify actor:push-data等命令能访问平台存储的前提也是在本地开发阶段让 CLI 读写本地存储的凭据基础。三、编写包装脚本 start.sh输入获取与命令映射核心文档 cli-actorization.md 要求在项目根目录创建start.sh作为 Actor 的入口。完整脚本如下#!/bin/bash set -e # 从 Apify key-value store 获取输入 INPUT$(apify actor:get-input) # 解析输入值根据你的 input schema 调整 MY_PARAM$(echo $INPUT | jq -r .myParam // default) # 使用输入运行你的应用 ./your-application --param $MY_PARAM # 如果你的应用把结果写入文件可推送到 key-value store # apify actor:set-value OUTPUT --contentType application/json output.json # 或者把结构化数据推送到 dataset # apify actor:push-data {result: value}逐行拆解set -e让脚本在任一条命令失败时立即退出避免「程序已经出错却仍然正常结束」导致的假成功这也是 shell 脚本进入 Actor 容器后的基本防御姿势。apify actor:get-input从 Actor 的默认 key-value store 的INPUT键读取输入 JSON。在平台上运行时输入来自 Apify Console 或 API 提交的 JSON在本地运行时CLI 会从本地存储目录读取。jq -r .myParam // default用jq从输入 JSON 中提取参数//是 jq 的「空值合并」运算符当.myParam不存在或为null时回退到默认值default。文档注释特别提醒这里要根据你自己的.actor/input_schema.json来调整参数路径与默认值。./your-application --param $MY_PARAM把解析出的参数以命令行参数的形式传给你的二进制程序——这正是「无 SDK 语言」与平台解耦的关键你的业务程序完全不知道自己运行在 Apify 上它只是收到一个参数并执行。输出推送注释中的两条命令apify actor:set-value OUTPUT --contentType application/json output.json把文件内容写入 key-value store--contentType指定内容 MIME 类型apify actor:push-data {result: value}把结构化 JSON 记录追加到 dataset每调用一次追加一行。扩展建议本地模拟输入的兼容分支文档在「测试」一节使用export INPUT...来模拟输入。为了让该测试方式真正生效常见的做法是在脚本中增加一个回退分支当apify actor:get-input不可用例如本地直接运行、尚未初始化本地存储时读取环境变量INPUT#!/bin/bash set -e if command -v apify /dev/null 21; then INPUT$(apify actor:get-input) else INPUT${INPUT:-} fi MY_PARAM$(echo $INPUT | jq -r .myParam // default) ./your-application --param $MY_PARAM这样既保留了平台上的标准读取路径又让本地测试可以直接注入环境变量属于对原文档测试方案的工程化补全可在实际项目中按需采用。四、改造 Dockerfile构建可运行容器Actor 最终以 Docker 镜像形式运行因此必须在容器内准备Apify CLI、jq解析输入用、你的二进制程序以及启动脚本。原文档给出的 Dockerfile 如下FROM apify/actor-node:20 # 通过包源或经过校验的 release 产物安装 ubi # 示例使用基础镜像的包管理器或在构建上下文中引入固定版本的二进制 # RUN apt-get update apt-get install -y ubi # 从 GitHub releases 安装你的 CLI 工具示例 # RUN install -m 0755 ./vendor/your-tool /usr/local/bin/your-tool # 或者手动安装 apify-cli 和 jq RUN npm install -g apify-cli RUN apt-get update apt-get install -y jq # 复制你的应用 COPY . . # 如需构建应用 # RUN ./build.sh # 让启动脚本可执行 RUN chmod x start.sh # 运行包装脚本 CMD [./start.sh]Dockerfile 要点解读基础镜像apify/actor-node:20即使业务程序不是 Node.js也可以借用 Apify 官方 Node 镜像作为基础它内部已含 Node 运行时可安装apify-cli再叠加其他工具链。ubi工具原文档提到 Apify 官方cli-start模板 Dockerfile 会使用ubi一个从 GitHub Releases 自动下载并安装二进制的小工具。文档给出了两条获取ubi的路径——「从包源安装」或「在构建上下文里 vendor 一个固定版本pinned的二进制」。建议优先使用你的系统包管理器校验过的版本或显式固定版本号避免供应链风险。安装策略二选一要么用ubi/install安装你的 CLI 工具要么退而求其次用npm install -g apify-cliapt-get install -y jq手动装齐 CLI 化 Actor 的两个运行时依赖apify-cli提供actor:*命令jq提供 JSON 解析。COPY . .与COPY顺序把COPY . .放在依赖安装之后、chmod x start.sh之前可以利用 Docker 层缓存——源码变化时不必重装依赖。CMD [./start.sh]容器启动后直接执行包装脚本这是整个 CLI 化 Actor 的执行入口必须与start.sh的路径一致。五、本地测试 CLI 化 Actor用模拟输入验证与原文档在 Testing CLI-Based Actors 中给出的说明一致由于apify run需要一个 Node.js 或 Python 入口shell 包装脚本无法直接通过apify run驱动因此需要直接测试底层应用 模拟输入# 设置模拟输入 export INPUT{myParam: test-value} # 运行包装脚本 ./start.sh测试时注意两点如果脚本里使用了上文推荐的$INPUT环境变量回退分支这种测试方式可以完整验证「输入解析 → 参数传递 → 程序执行」链路如果脚本仍直接调用apify actor:get-input则需要先在本地执行apify init并用 CLI 写入一条测试输入让 key-value store 有内容可读。最终回归仍建议在容器环境中进行docker build -t my-actor . docker run --rm my-actor以验证 Dockerfile 中所有安装步骤与start.sh在干净环境下都能工作。六、Actor 化的完整生命周期init → 包装 → Schema → run → pushCLI 化只是 apify-actorization 技能中的「Step 3语言相关改造」的一部分。一个完整的 Actor 化流程来自 SKILL.md 的 Quick Start 与 Checklist如下# 1. 在项目根目录初始化 Actor 结构 apify init # 2. 按语言包装代码CLI 化即编写 start.sh 并改造 Dockerfile # 3. 配置 .actor/input_schema.json输入定义 # 4. 测试本地运行 apify run --input {key: value} # 5. 部署到平台 apify pushapify init会自动生成三类文件.actor/actor.jsonActor 配置与元数据.actor/input_schema.jsonApify Console 展示与校验输入用的定义Dockerfile若不存在容器镜像定义。技能文档中的完整 Checklist 共 8 步SKILL.mdStep 1分析项目语言、入口点、输入、输出Step 2运行apify init创建 Actor 结构Step 3应用语言相关的 SDK/CLI 集成Step 4配置.actor/input_schema.jsonStep 5配置.actor/output_schema.json如适用Step 6更新.actor/actor.json元数据Step 7用apify run本地测试Step 8用apify push部署七、输入/输出 Schema 与 actor.json 配置CLI 化 Actor 虽然不写 SDK 代码但输入输出仍然通过 JSON Schema 与平台交互。以下配置来自配套文档 schemas-and-output.md均可用apify/json_schemasnpm 包中的input.schema.json、output.schema.json、actor.schema.json进行校验。7.1 输入 Schema.actor/input_schema.json把应用的输入命令行参数、环境变量、配置文件映射为输入属性{ title: My Actor Input, type: object, schemaVersion: 1, properties: { startUrl: { title: Start URL, type: string, description: The URL to start processing from, editor: textfield, prefill: https://example.com }, maxItems: { title: Max Items, type: integer, description: Maximum number of items to process, default: 100, minimum: 1 } }, required: [startUrl] }映射准则源自 schemas-and-output.md命令行参数 → 输入 schema 属性环境变量 → 输入 schema 属性或 actor.json 中的 Actor env vars配置文件 → 输入 schema 中的 object/array 类型尽量展平深层嵌套结构改善 Console 中的用户体验。7.2 输出 Schema 与三种输出形态.actor/output_schema.json描述输出结构。根据输出形态不同推送方式也不同表格型数据多条记录每条数据用Actor.pushData()JS/Actor.push_data()Python推送在 CLI 化场景中对应apify actor:push-data每行成为 dataset 中的一行单个文件/Blob用 key-value store 存储Actor.setValue()/apify actor:set-value取公共 URL 后放入 dataset例如// 存储带公共访问权限的文件 await Actor.setValue(report.pdf, pdfBuffer, { contentType: application/pdf }); // 获取公共 URL const storeInfo await Actor.openKeyValueStore(); const publicUrl https://api.apify.com/v2/key-value-stores/${storeInfo.id}/records/report.pdf; // 把 URL 放入 dataset 输出 await Actor.pushData({ reportUrl: publicUrl });带公共前缀的多个文件集合以screenshots/之类的前缀存放多份文件文件名中的/会被编码为%2F最终可通过.../records/screenshots%2F{name}访问。7.3 Actor 配置.actor/actor.json{ actorSpecification: 1, name: my-actor, title: My Actor, description: Brief description of what the actor does, version: 1.0.0, meta: { templateId: ts_empty, generatedBy: Claude Code with Claude Opus 4.5 }, input: ./input_schema.json, dockerfile: ../Dockerfile }关键属性说明完整字段定义可参见 actor-json.mdactorSpecification必填Actor 规范版本当前为 1name必填小写、允许连字符的 Actor 标识符title必填Console 中展示的人类可读标题version必填语义化版本号meta.generatedBy必须填写生成/修改该 Actor 的工具与模型名例如Claude Code with Claude Opus 4.5这是技能文档反复强调的约定input/output/dockerfile分别指向 schema 文件与 Dockerfile 的相对路径。八、CLI 命令速查表原文档在 CLI Commands Reference 中给出了 CLI 化 Actor 的核心命令完整继承如下命令说明apify actor:get-input从 key-value store 获取输入 JSONapify actor:set-value KEY在 key-value store 中存储值apify actor:push-data JSON向 dataset 推送数据apify actor:get-value KEY从 key-value store 读取值配合使用场景actor:get-input对应平台输入读取actor:set-value用于把程序产出的文件/检查点写入存储--contentType指定 MIME 类型actor:push-data用于把结构化结果写入 datasetactor:get-value用于恢复状态例如断点续跑场景参见 schemas-and-output.md 中 key-value store 作检查点状态的用法。九、部署、可选变现与注意事项部署在本地完成全部验证后一键上传构建apify push该命令会把项目上传并在 Apify 平台完成镜像构建。技能文档强调测试时必须使用apify run而非npm start或python main.py因为 CLI 会正确设置运行环境与存储SKILL.md。对 CLI 化 Actor 而言apify run无法直接作为入口需要 Node/Python 入口因此容器级测试docker builddocker run是更贴近线上环境的验证手段。可选变现部署后可以在 Apify Store 中变现技能文档推荐Pay Per EventPPE模型按抓取/处理的条目数或 API 调用次数计费在代码中通过Actor.charge(result)记录计费事件。其他选项包括 Rental月订阅与 Free开源免费。PPE 配置在 Apify Console 的 Actor Monetization 下完成。使用边界与注意点来自 SKILL.md 的限制说明仅在任务明确符合上述范围时使用本技能把现有软件改造成 Apify Actor不要将产物视为环境特定验证、测试或专家评审的替代品当所需输入、权限、安全边界或成功标准缺失时停下来向用户确认而不是盲目继续。对 CLI 化路径而言还有一条值得注意的边界如果业务程序本身是常驻 HTTP 服务如 API 服务器CLI 包装方式并不合适——这类场景应当采用 Actor 的standby 模式usesStandbyMode: true让容器常驻并实现就绪探针处理x-apify-container-server-readiness-probe请求头具体实现见 standby-mode.md。CLI 化 Actor 适合的是一批一批执行的批处理型任务读输入、跑程序、推结果、退出。十、总结一条与语言无关的 Actor 化捷径CLI-Based Actorization 的价值在于它把「平台接入」的成本从「为每种语言维护 SDK 集成」降为「写一个几十行的 shell 脚本」。无论你的业务程序用 Go、Rust 还是 Java 编写只要它能接受命令行参数、能写文件或输出结构化数据就能通过apify actor:get-input/apify actor:push-data/apify actor:set-value三组命令接入 Apify 的存储体系再配上本文给出的 Dockerfile 与 Schema 配置即可完成从「本地命令行工具」到「云端可复用、可计费的 serverless Actor」的完整蜕变。本文所有代码与配置均可在 apify-actorization 技能目录下找到原始出处并配套 js-ts-actorization.md、python-actorization.md 两种 SDK 路线做横向对照按项目语言选择最适合的接入方式即可。【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑