OpenClaw 纯 Windows 环境源码部署教程(含修改脚本配置)

OpenClaw 纯 Windows 环境源码编译部署教程(含修改脚本配置)

本文专为 Windows 10/11 系统编写(理论上是跨平台 any os),全程实操无冗余,涵盖 OpenClaw 源码克隆、环境搭建、关键脚本修改、依赖构建及项目启动,重点解决 A2UI 打包相关配置,适合新手快速上手部署。

一、前置环境准备(自行安装配置)

所有工具均需配置系统环境变量(安装时勾选"Add to PATH",或手动配置),确保命令可全局调用。

  1. Node.js :推荐 v20+ 版本

    下载地址:https://nodejs.org/(选择 Windows Installer 64-bit)

  2. pnpm :安装 Node.js 后,打开 CMD/PowerShell 执行
    npm install -g pnpm

  3. Git :用于克隆项目源码

    下载地址:https://git-scm.com/download/win

  4. Python 3.10+ :编译项目依赖需用到

    下载地址:https://www.python.org/(安装时勾选"Add Python to PATH")

二、克隆 OpenClaw 源码

打开 CMD/PowerShell,执行以下命令,克隆项目到本地(可自定义路径):

bash 复制代码
# 克隆项目
git clone https://github.com/openclaw/openclaw.git

# 或者使用我已经fork的 OpenClaw 仓库地址
git clone https://github.com/WJX20/openclaw.git

# 进入项目根目录
cd OpenClaw

三、关键配置:修改 A2UI 打包脚本(核心步骤)

这一步是部署成功的关键,需修改 package.json 命令,并新建指定脚本文件。

1. 修改 package.json 命令

打开项目根目录的 package.json 文件,搜索并找到 "canvas:a2ui:bundle" 字段,将其替换为以下内容:

json 复制代码
"canvas:a2ui:bundle": "node --import tsx scripts/bundle-a2ui.mts",

2. 新建 bundle-a2ui.mts 脚本

在项目根目录的 scripts 文件夹下(若没有则新建 scripts 文件夹),新建文件 bundle-a2ui.mts,复制以下完整代码粘贴进去(直接复制可用,无需修改):

typescript 复制代码
import { createHash } from "node:crypto";
import { promises as fs } from "node:fs";
import path from "node:path";
import { execSync } from "node:child_process";
import { fileURLToPath } from "node:url";

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ROOT_DIR = path.resolve(__dirname, "..");
const HASH_FILE = path.join(ROOT_DIR, "src/canvas-host/a2ui/.bundle.hash");
const OUTPUT_FILE = path.join(ROOT_DIR, "src/canvas-host/a2ui/a2ui.bundle.js");
const A2UI_RENDERER_DIR = path.join(ROOT_DIR, "vendor/a2ui/renderers/lit");
const A2UI_APP_DIR = path.join(ROOT_DIR, "apps/shared/OpenClawKit/Tools/CanvasA2UI");

const exists = async (p: string) => fs.access(p).then(() => true).catch(() => false);

// 检查源码目录
const rendererExists = await exists(A2UI_RENDERER_DIR);
const appExists = await exists(A2UI_APP_DIR);

if (!rendererExists || !appExists) {
  if (await exists(OUTPUT_FILE)) {
    console.log("A2UI sources missing; keeping prebuilt bundle.");
    process.exit(0);
  }
  console.error(`A2UI sources missing and no prebuilt bundle found at: ${OUTPUT_FILE}`);
  process.exit(1);
}

// 计算哈希
async function walk(entryPath: string): Promise<string[]> {
  const st = await fs.stat(entryPath);
  if (st.isDirectory()) {
    const entries = await fs.readdir(entryPath);
    const results = await Promise.all(entries.map(e => walk(path.join(entryPath, e))));
    return results.flat();
  }
  return [entryPath];
}

const normalize = (p: string) => p.split(path.sep).join("/");

const inputPaths = [
  path.join(ROOT_DIR, "package.json"),
  path.join(ROOT_DIR, "pnpm-lock.yaml"),
  A2UI_RENDERER_DIR,
  A2UI_APP_DIR,
];

const allFiles = (await Promise.all(inputPaths.map(walk))).flat();
allFiles.sort((a, b) => normalize(a).localeCompare(normalize(b)));

const hash = createHash("sha256");
for (const filePath of allFiles) {
  const rel = normalize(path.relative(ROOT_DIR, filePath));
  hash.update(rel);
  hash.update("\0");
  hash.update(await fs.readFile(filePath));
  hash.update("\0");
}
const currentHash = hash.digest("hex");

// 检查是否需要重新构建
if (await exists(HASH_FILE) && await exists(OUTPUT_FILE)) {
  const previousHash = (await fs.readFile(HASH_FILE, "utf8")).trim();
  if (previousHash === currentHash) {
    console.log("A2UI bundle up to date; skipping.");
    process.exit(0);
  }
}

const exec = (cmd: string) => execSync(cmd, { stdio: "inherit", cwd: ROOT_DIR });

// 编译 TypeScript
exec(`pnpm -s exec tsc -p "${A2UI_RENDERER_DIR}/tsconfig.json"`);

// 打包
try {
  execSync("rolldown --version", { stdio: "ignore" });
  exec(`rolldown -c "${A2UI_APP_DIR}/rolldown.config.mjs"`);
} catch {
  exec(`pnpm -s dlx rolldown -c "${A2UI_APP_DIR}/rolldown.config.mjs"`);
}

// 保存哈希
await fs.writeFile(HASH_FILE, currentHash, "utf8");
console.log("A2UI bundle complete.");

四、安装项目依赖并启动

在项目根目录(OpenClaw 文件夹)执行命令,安装所有项目依赖:

复制代码
pnpm install
pnpm ui:build
pnpm build

pnpm link --global

openclaw --version

openclaw onboard --install-daemon

openclaw gateway restart
相关推荐
CSND74021 小时前
零基础学Python合集---3:字符串的定义和常用方法
人工智能·python
数据堂官方账号1 天前
数据上新|覆盖全双工、具身智能、世界模型等热门研究趋势
人工智能·大模型·具身智能
LienJack1 天前
《Re0 Build Harness》第二章Agent 组成模型:Model、Loop、Tools、State
人工智能·agent
霸道流氓气质1 天前
Windows批处理脚本完整指南:可移植的交互式SpringBoot项目管理
windows·spring boot·后端
Raink老师1 天前
【AI面试临阵磨枪-087】Skill 生命周期:注册、加载、调度、熔断、卸载、版本管理?
人工智能·面试·职场和发展
夜郎king1 天前
告别创作卡壳!体验 CSDN AI 数字营销,解锁全新写作思路
人工智能·数字营销体验·ai 营销新体验
Luke Ewin1 天前
从零开始部署Fun-ASR-Nano实时语音识别并区分说话人教程 | 私有化部署开源的实时语音转写项目
人工智能·语音识别·funasr·实时语音识别·fun-asr
跨境技工小黎1 天前
Playwright vs Puppeteer :自动化脚本工具全面对比
人工智能
Hotchip_MEMS1 天前
韬τ定律的技术内核:逻辑折叠与信息路径重构
人工智能·物联网
AI服务老曹1 天前
解耦异构算力:基于 Docker 与 GB28181/RTSP 的边缘计算 AI 视频管理平台架构设计(支持源码交付)
人工智能·docker·边缘计算