[{"content":"官方安装包可以从下载页直接拿，但有时候你需要自己打包：改了代码、要嵌入自己的插件、或者单纯想验证一条 pull request。本文记录三端打包的完整姿势。\n前置依赖 依赖 说明 CMake ≥ 3.18 三端通用 C++20 编译器 Xcode / MSVC 2022 / gcc 11+ Qt6 brew install qt（macOS）；Windows 用 aqt 或官网安装器 OpenCV 可选（TASK_GRAPH_ENABLE_OPENCV，默认 ON 时 REQUIRED） 平台打包工具 macOS：brew install dylibbundler create-dmg；Linux：linuxdeployqt + appimagetool（脚本自动下载）；Windows：Windows SDK（makeappx 等） macOS：.dmg python scripts/package_macos.py --version 0.1.0 --out-dir dist/dmg # 产物：dist/dmg/graph_studio-0.1.0-macos.dmg 流水线：CMake 构建 → macdeployqt 收集 Qt 依赖 → dylibbundler 把 OpenCV 等第三方库塞进 Contents/Frameworks/ → create-dmg 打出带 Applications 快捷方式的镜像。\nLinux：.AppImage python scripts/package_linux.py --version 0.1.0 --out-dir dist/appimage # 产物：dist/appimage/graph_studio-0.1.0-x86_64.AppImage 流水线：AppDir + .desktop + 图标 → linuxdeployqt → appimagetool（CI 的无 FUSE 环境下自动走解压模式）。\nWindows：.msix scripts\\build_msix.ps1 -Version 0.1.0 -Config RelWithDebInfo -SkipSign # 产物：dist\\msix\\graph_studio-0.1.0_x64.msix 流水线：windeployqt → makepri 资源索引 → makeappx 打包。-SkipSign 产出 Store 风格未签名包；正式上架 Microsoft Store 时由 Partner Center 重签名。\nCI 发布流水线 .github/workflows/release.yml 把上面三步编排成手动触发的发布流水线（workflow_dispatch）：\n版本号：基准版本取自根 CMakeLists.txt 的 project(task_graph VERSION x.y.z)； 渠道：发布时选择 测试版 / 预览版 / 修复版 / 正式版，对应 tag 后缀 alpha / beta / hotfix / stable，加上 run 号成 v0.1.0-stable.42 这样的完整标签；只有正式版不会被标记为 prerelease； 三端并行打包后汇总为一个 GitHub Release，附三件安装包，并自动生成 release notes； Release 发布事件会触发官网自动重建 —— 下载页与更新日志随后就能看到新版本。 签名与分发提示 macOS：本地产物未签名未公证，用户首次打开需右键「打开」（详见下载页安装说明）；对外分发建议配置 Apple Developer ID 签名 + 公证； Windows：未签名 .msix 需要开发者模式；对外分发建议代码签名证书，或走 Microsoft Store； 安装包内不捆绑 Vulkan 运行时加载器：libtask_graph.dll 对 vulkan-1.dll 做了延迟加载并带失败兜底，无驱动机器上 GPU 后端自动降级、应用正常启动。 ","permalink":"https://studio.mangoeffect.net/blog/build-installers-from-source/","summary":"package_macos.py / package_linux.py / build_msix.ps1 三条打包命令、各自的依赖与产物路径，以及 GitHub Actions 发布流水线的四渠道版本规则。","title":"从源码构建 GraphStudio 三端安装包"},{"content":"task_graph 的核心只有几个概念，但组合起来足以覆盖从图像流水线到推理管路的大部分场景。本文按数据流动的顺序过一遍。\nTask 与 DAG 一切从 Task 开始：它有一个 ID、一个执行体（lambda 或子类化的 INode），以及最重要的 —— 端口契约：\nauto process = std::make_shared\u0026lt;Task\u0026gt;(\u0026#34;process\u0026#34;, [](TaskContext\u0026amp; ctx) { auto data = ctx.input\u0026lt;std::string\u0026gt;(\u0026#34;in\u0026#34;); // 从上游端口读数据 return TaskResult{.status = TaskStatus::COMPLETED, .value = std::string(*data + \u0026#34;_processed\u0026#34;)}; }); DAG 是任务的容器：add_task 注册，connect(\u0026quot;fetch\u0026quot;, \u0026quot;process\u0026quot;) 建边（默认接 out → in 端口，也支持端口限定的多端口边）。\n端口：类型化的数据流 任务间通过命名端口交换数据，载荷是 std::any； 读上游输出用 ctx.input\u0026lt;T\u0026gt;(\u0026quot;port\u0026quot;)； 返回结果放 TaskResult.value（默认输出端口 \u0026quot;out\u0026quot;），或通过 outputs 一次写多个端口； 跨动态库使用的自定义类型必须注册：TG_REGISTER_TYPE(MyType, \u0026quot;my::Type\u0026quot;) —— 稳定的字符串名保证跨 SO 边界的类型一致性。 执行器：拓扑并行 DAGExecutor 内置线程池，按依赖关系自动调度：无依赖关系的分支并行跑，有依赖的串行等待。执行完成后每个任务都能查到状态与耗时：\nDAGExecutor executor; executor.execute(dag).wait(); for (auto\u0026amp; [id, r] : executor.get_results()) std::cout \u0026lt;\u0026lt; id \u0026lt;\u0026lt; \u0026#34;: \u0026#34; \u0026lt;\u0026lt; (r.is_success() ? \u0026#34;SUCCESS\u0026#34; : \u0026#34;FAILED\u0026#34;) \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; 任务失败不会让整图崩溃：下游被跳过，失败原因随 TaskResult 带回（WASM/移动端以 -fno-exceptions 构建，插件边界一律不抛异常、只返回状态）。\n插件模型：编译期 + 运行时 两种扩展方式，共享同一套 INode 接口（type() / execute() / input_specs() / output_specs() / param_specs()）：\n方式 机制 适合 子模块（subnode） 编译期链接，subnode.json + cmake/Subnode.cmake 接入 官方插件（OpenCV、GPU、JS、MediaPipe） 动态插件 运行时 PluginLoader dlopen，导出 register_plugin，SDK 版本不匹配会拒绝加载 第三方分发、按需装载 新插件不用手写脚手架：python scripts/generate_submodule.py 一键生成 CMakeLists、任务类与双重注册代码。\nJSON 序列化（v2.0） 图是带版本号的纯数据（见快速上手中的示例）：任务数组 + 边数组，边可带 from_port / to_port。DAGSerializer::from_string 一行加载，GraphStudio 编辑器读写的也是同一格式。\nGPU 后端：全部 opt-in Metal（Apple）/ Vulkan / CUDA 三个后端由 CMake 开关控制（TASK_GRAPH_ENABLE_METAL/VULKAN/CUDA，默认全关）：需要 GPU 的任务在无后端环境优雅降级，测试在 CI 上自动 soft-skip。GPU 子模块提供 gpu_box_blur、gpu_gaussian_blur、gpu_resize 等图像算子。\n跨平台形态 桌面：libtask_graph 为 SHARED 库，支持 dlopen 动态插件； iOS / Android / WASM：STATIC 库 + -fno-exceptions，同一套图定义与任务代码复用。 小结 「typed port + 拓扑并行 + JSON 图 + 双层插件」是 task_graph 的全部骨架。想动手跑一遍？从快速上手 GraphStudio开始；想出包分发？看从源码构建三端安装包。\n","permalink":"https://studio.mangoeffect.net/blog/task-graph-architecture/","summary":"typed port、std::any 数据流、线程池拓扑执行、双层插件模型、JSON v2.0 序列化与 opt-in GPU 后端 —— 五分钟看懂 task_graph 的设计。","title":"task_graph 架构概览：任务、端口与执行器"},{"content":"GraphStudio 是 task_graph 框架的 Qt6 桌面编辑器：把「写代码组装 DAG」变成「画布上拖拽连线」。本文带你从零跑起第一张图。\n获取 GraphStudio 方式一：直接下载安装包（推荐）\n到官网下载页选择对应平台（macOS .dmg / Windows .msix / Linux .AppImage），内置全部官方插件任务。\n方式二：源码构建\n# 依赖：CMake \u0026gt;= 3.18、C++20 编译器、Qt6（macOS: brew install qt） python scripts/run_graph_studio.py # 构建并启动 python scripts/run_graph_studio.py --qt /path/to/qtbase # Qt6 未被自动探测到时 注意：OpenCV / GPU / 脚本 / MediaPipe 四个插件子模块仓库目前为私有，随官方安装包一同分发；外部克隆者可以正常构建核心框架与示例，完整编辑器体验建议使用安装包。\n认识界面 打开 GraphStudio 后你会看到三块区域：\n左侧节点面板 —— 按子模块分组的任务类型（图像读写、滤波、GPU 算子、JS 脚本、MediaPipe 视觉……）； 中央画布 —— 计算图本体：节点代表任务，连线代表数据流向，线上标注端口名； 右侧属性面板 —— 选中节点的参数（如 file_path、kernel_size）、输入输出端口契约。 搭建第一张图 目标：读入一张图片 → 高斯模糊 → Sobel 边缘检测。\n从面板拖入 opencv_image_read，在属性面板把 file_path 指向一张本地图片； 再拖入 opencv_gaussian_blur_filter 和 opencv_sobel_filter； 依次连线：image_read.out → blur.in、blur.out → sobel.in（拖动端口圆点即可，端口名会自动提示）； 点击运行。 运行结束后每个节点会显示执行状态与耗时；任务失败时错误信息直接标在节点上，方便定位是参数问题还是上游数据问题。\n图即数据：与 C++ / JSON 互通 GraphStudio 保存的 .json 就是框架的图格式（version: 2.0）：\n{ \u0026#34;version\u0026#34;: \u0026#34;2.0\u0026#34;, \u0026#34;tasks\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;src\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;opencv_image_read\u0026#34;, \u0026#34;params\u0026#34;: { \u0026#34;file_path\u0026#34;: \u0026#34;test.png\u0026#34; } }, { \u0026#34;id\u0026#34;: \u0026#34;gaussian\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;opencv_gaussian_blur_filter\u0026#34; }, { \u0026#34;id\u0026#34;: \u0026#34;sobel\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;opencv_sobel_filter\u0026#34; } ], \u0026#34;edges\u0026#34;: [ { \u0026#34;from\u0026#34;: \u0026#34;src\u0026#34;, \u0026#34;from_port\u0026#34;: \u0026#34;out\u0026#34;, \u0026#34;to\u0026#34;: \u0026#34;gaussian\u0026#34;, \u0026#34;to_port\u0026#34;: \u0026#34;in\u0026#34; }, { \u0026#34;from\u0026#34;: \u0026#34;gaussian\u0026#34;, \u0026#34;from_port\u0026#34;: \u0026#34;out\u0026#34;, \u0026#34;to\u0026#34;: \u0026#34;sobel\u0026#34;, \u0026#34;to_port\u0026#34;: \u0026#34;in\u0026#34; } ] } 同一份 JSON 可以脱离编辑器，在 C++ 里直接加载运行：\nusing namespace task_graph; auto dag = DAGSerializer::from_string(json_string); DAGExecutor executor; executor.execute(*dag).wait(); 也就是说：编辑器里调通的原型，可以原样搬进生产代码，不需要二次翻译。\n下一步 想知道连线背后发生了什么？读《task_graph 架构概览》； 想自己出安装包分发？读《从源码构建三端安装包》。 ","permalink":"https://studio.mangoeffect.net/blog/quick-start-graphstudio/","summary":"从安装到运行第一张图像处理计算图：拖几个节点、连几条线，理解 GraphStudio 的工作方式，以及图如何与 C++ / JSON 互通。","title":"快速上手 GraphStudio：你的第一个计算图"},{"content":"版本数据来自 GitHub Releases：每次发布都会自动生成 release notes，本页面在发布后自动重建。渠道命名规则见下载页。\n","permalink":"https://studio.mangoeffect.net/changelog/","summary":"\u003cp\u003e版本数据来自 \u003ca href=\"https://github.com/mangoeffect/graph-studio/releases\"\u003eGitHub Releases\u003c/a\u003e：每次发布都会自动生成 release notes，本页面在发布后自动重建。渠道命名规则见\u003ca href=\"/download/\"\u003e下载页\u003c/a\u003e。\u003c/p\u003e","title":"更新日志"},{"content":"安装说明 macOS（.dmg） 下载 .dmg 并打开，把 GraphStudio 拖入 Applications 文件夹； 当前版本未做开发者签名与公证，首次打开可能被 Gatekeeper 拦截：在 Finder 中右键选择「打开」，或在「系统设置 → 隐私与安全性」中点击「仍要打开」。 Windows（.msix） 下载 .msix 双击安装（需要 Windows 10 1809+）； 安装包当前未签名：请先在「设置 → 系统 → 开发者选项」中开启开发者模式，或对包做信任签名后再安装； 正式上架 Microsoft Store 后将由 Store 统一签名分发。 Linux（.AppImage） chmod +x graph_studio-*-x86_64.AppImage ./graph_studio-*-x86_64.AppImage AppImage 需要 FUSE（多数发行版自带）；无 FUSE 环境可用 --appimage-extract 解压后运行。\n版本渠道 发布流水线提供四种渠道：测试版（alpha）/ 预览版（beta）/ 修复版（hotfix）/ 正式版（stable）。本页默认展示最新正式版；其余渠道可在 GitHub Releases 按标签区分（如 v0.1.0-beta.42）。\n从源码构建 等不及发布？自己打包也只需一条命令，详见博客《从源码构建 GraphStudio 三端安装包》：\npython scripts/package_macos.py --version 0.1.0 # macOS -\u0026gt; dist/dmg/*.dmg python scripts/package_linux.py --version 0.1.0 # Linux -\u0026gt; dist/appimage/*.AppImage ","permalink":"https://studio.mangoeffect.net/download/","summary":"\u003ch2 id=\"安装说明\"\u003e安装说明\u003c/h2\u003e\n\u003ch3 id=\"macosdmg\"\u003emacOS（\u003ccode\u003e.dmg\u003c/code\u003e）\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e下载 \u003ccode\u003e.dmg\u003c/code\u003e 并打开，把 \u003cstrong\u003eGraphStudio\u003c/strong\u003e 拖入 \u003ccode\u003eApplications\u003c/code\u003e 文件夹；\u003c/li\u003e\n\u003cli\u003e当前版本未做开发者签名与公证，首次打开可能被 Gatekeeper 拦截：在 Finder 中右键选择「打开」，或在「系统设置 → 隐私与安全性」中点击「仍要打开」。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"windowsmsix\"\u003eWindows（\u003ccode\u003e.msix\u003c/code\u003e）\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e下载 \u003ccode\u003e.msix\u003c/code\u003e 双击安装（需要 Windows 10 1809+）；\u003c/li\u003e\n\u003cli\u003e安装包当前未签名：请先在「设置 → 系统 → 开发者选项」中开启\u003cstrong\u003e开发者模式\u003c/strong\u003e，或对包做信任签名后再安装；\u003c/li\u003e\n\u003cli\u003e正式上架 Microsoft Store 后将由 Store 统一签名分发。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"linuxappimage\"\u003eLinux（\u003ccode\u003e.AppImage\u003c/code\u003e）\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echmod +x graph_studio-*-x86_64.AppImage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./graph_studio-*-x86_64.AppImage\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003eAppImage 需要 FUSE（多数发行版自带）；无 FUSE 环境可用 \u003ccode\u003e--appimage-extract\u003c/code\u003e 解压后运行。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"版本渠道\"\u003e版本渠道\u003c/h2\u003e\n\u003cp\u003e发布流水线提供四种渠道：\u003cstrong\u003e测试版\u003c/strong\u003e（alpha）/ \u003cstrong\u003e预览版\u003c/strong\u003e（beta）/ \u003cstrong\u003e修复版\u003c/strong\u003e（hotfix）/ \u003cstrong\u003e正式版\u003c/strong\u003e（stable）。本页默认展示最新\u003cstrong\u003e正式版\u003c/strong\u003e；其余渠道可在 \u003ca href=\"https://github.com/mangoeffect/graph-studio/releases\"\u003eGitHub Releases\u003c/a\u003e 按标签区分（如 \u003ccode\u003ev0.1.0-beta.42\u003c/code\u003e）。\u003c/p\u003e\n\u003ch2 id=\"从源码构建\"\u003e从源码构建\u003c/h2\u003e\n\u003cp\u003e等不及发布？自己打包也只需一条命令，详见博客\u003ca href=\"/blog/build-installers-from-source/\"\u003e《从源码构建 GraphStudio 三端安装包》\u003c/a\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython scripts/package_macos.py --version 0.1.0   \u003cspan style=\"color:#75715e\"\u003e# macOS -\u0026gt; dist/dmg/*.dmg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython scripts/package_linux.py --version 0.1.0   \u003cspan style=\"color:#75715e\"\u003e# Linux -\u0026gt; dist/appimage/*.AppImage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"下载 GraphStudio"},{"content":"GraphStudio 被完整编译为 WebAssembly（多线程），可以在浏览器里直接运行。\n首次加载约 16 MB（wasm 主模块 + Qt 运行时），请耐心等待；之后浏览器缓存会显著加快。\n打开后页面自动刷新一次属正常现象：Web 版通过 service worker 启用跨域隔离 （SharedArrayBuffer，多线程 wasm 的必要条件），刷新后即进入隔离上下文。 无痕/隐私窗口等禁用 service worker 的环境下 Web 版可能无法启动，请改用桌面版。 图像处理子节点（OpenCV）与 JS 脚本节点均已内置，可以直接搭建计算图运行； 结果图像面板在 Web 版为静态展示（桌面版是 GPU 加速视图）。 重度使用建议下载桌面安装包，性能与稳定性更佳。 ","permalink":"https://studio.mangoeffect.net/online/","summary":"\u003cp\u003eGraphStudio 被完整编译为 WebAssembly（多线程），可以在浏览器里直接运行。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e首次加载约 16 MB\u003c/strong\u003e（wasm 主模块 + Qt 运行时），请耐心等待；之后浏览器缓存会显著加快。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e打开后页面\u003cstrong\u003e自动刷新一次\u003c/strong\u003e属正常现象：Web 版通过 service worker 启用跨域隔离\n（SharedArrayBuffer，多线程 wasm 的必要条件），刷新后即进入隔离上下文。\u003c/li\u003e\n\u003cli\u003e无痕/隐私窗口等禁用 service worker 的环境下 Web 版可能无法启动，请改用桌面版。\u003c/li\u003e\n\u003cli\u003e图像处理子节点（OpenCV）与 JS 脚本节点均已内置，可以直接搭建计算图运行；\n结果图像面板在 Web 版为静态展示（桌面版是 GPU 加速视图）。\u003c/li\u003e\n\u003cli\u003e重度使用建议\u003ca href=\"/download/\"\u003e下载桌面安装包\u003c/a\u003e，性能与稳定性更佳。\u003c/li\u003e\n\u003c/ul\u003e","title":"在线体验"}]