ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在 Sandstorm 上开发 Wekan:从环境搭建、本地调试到发布 .spk 的完整指南

在 Sandstorm 上开发 Wekan:从环境搭建、本地调试到发布 .spk 的完整指南 在 Sandstorm 上开发 Wekan从环境搭建、本地调试到发布 .spk 的完整指南【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan本指南以仓库中的 Developing-Wekan-for-Sandstorm.md 为骨架结合 Wekan 源码中 Sandstorm 相关的真实实现sandstorm.js、sandstorm-pkgdef.capnp、sandstorm-src/start.js、packages/wekan-accounts-sandstorm 等面向想要为 Wekan 贡献功能、并在 Sandstorm 平台上验证其行为的开发者。读完本文你将掌握Wekan 在 Sandstorm 与独立运行两种形态下的差异与切换机制从安装 Sandstorm 开发版、下载 meteor-spk 打包工具、Fork 并克隆源码到./build.sh两级菜单构建、meteor --port 4000本地调试、MongoDB 连接检查、meteor-spk dev在本地 Sandstorm 中加载dev 模式实例并验证功能最后提交 Pull Request 的完整工作流。背景Standalone Wekan 与 Sandstorm Wekan 的关系Wekan 在 Sandstorm 上与独立部署版本使用的是同一份代码。二者唯一的差别在于在 Sandstorm 环境下部分功能会被从 Web UI 中隐藏其判断依据是isSandstorm环境变量——该变量定义在wekan/sandstorm*代码文件中即仓库根目录的 sandstorm.js并被注册为 Blaze 全局模板助手// sandstorm.js 末尾 Blaze.registerHelper(isSandstorm, isSandstorm);其中isSandstorm的取值来自 Meteor settings// sandstorm.js const isSandstorm Meteor.settings?.public?.sandstorm;而Meteor.settings.public.sandstorm true是通过 sandstorm-pkgdef.capnp 中命令环境的METEOR_SETTINGS注入的(key METEOR_SETTINGS, value {\public\: {\sandstorm\: true}})在模板层client/components/*/*.jade与client/components/*/*.js中随处可见isSandstorm判断用于隐藏在 Sandstorm 语境下没有意义的功能。例如client/components/settings/informationBody.jadeunless isSandstorm控制管理面板中部分信息项的展示client/components/sidebar/sidebar.jade侧边栏中的if isSandstorm/unless isSandstorm分支client/components/users/userAvatar.jadeunless isSandstorm隐藏用户名编辑等入口client/components/settings/peopleBody.js根据isSandstorm决定是否显示 email 设置项。从源码结构看Sandstorm 版还通过 packages/wekan-accounts-sandstorm 实现了单一 SSO 登录Sandstorm 不使用用户名和密码而是把 sandstorm 用户 ID 保存到 MongoDB 中因此其数据库结构也与独立版不同。表/集合的定义位于 models/ 目录如 models/users.js 扩展了Meteor.usersmodels/boards.js 定义看板集合。开发过程中请先阅读 Developer Documentation 和 Directory Structure 以熟悉代码布局——后文所有命令中的路径~/repos/wekan、~/repos/meteor-spk-0.4.0等都以此目录结构为基准。1) 安装 Sandstorm开发版在 Ubuntu/Debian 系 64 位系统上安装 Sandstorm 开发版运行官方安装脚本curl https://install.sandstorm.io | bash安装过程中请选择development / dev install选项开发安装会提供本地 App Market、dev 模式加载等开发能力。安装完成后编辑 Sandstorm 配置sudo nano /opt/sandstorm/sandstorm.conf将UPDATE_CHANNEL一行取消注释并设为 dev避免 Sandstorm 自身被自动更新打断开发环境#UPDATE_CHANNELdev随后重启 Sandstorm 使配置生效sudo sandstorm stop sudo sandstorm start仓库中的 releases/install-sandstorm.sh 记录了维护者使用的更完整流程先下载 meteor-spk 工具并写入~/.bashrc再执行上面的curl https://install.sandstorm.io | bash最后cd ~/repos/wekan准备构建可作为参考。2) 下载 meteor-spk 打包工具meteor-spk是 Sandstorm 官方提供的、用于把 Meteor 应用打包成 Sandstorm 包.spk的工具。官方信息源为 https://github.com/sandstorm-io/meteor-spk 。mkdir ~/repos cd ~/repos curl https://dl.sandstorm.io/meteor-spk-0.4.0.tar.xz | tar Jxf - echo export PATH$PATH:~/repos/meteor-spk-0.4.0 ~/.bashrc注意把meteor-spk加入PATH后需要重新打开终端或执行source ~/.bashrc才能生效。仓库中较新的安装脚本使用meteor-spk-0.6.0见 releases/install-sandstorm.sh实际版本以你下载到的为准。3) Fork Wekan 并克隆你的 Fork在 GitHub 上 Fork https://github.com/wekan/wekan 后克隆你自己的 Forkcd ~/repos git clone gitgithub.com:YOUR-USER-NAME-HERE/wekan.git将官方仓库添加为 upstream便于同步最新代码git remote add upstream https://github.com/wekan/wekan.git切换到 master 分支进行开发并拉取 upstream 的最新变更git checkout master git fetch upstream git merge upstream/master4) 安装依赖并构建 Wekan进入仓库目录运行构建菜单cd ~/repos/wekan ./build.shbuild.sh是两级菜单先选类别1) Setup 2) Dev server 3) Tests 4) Docker 5) Tools 6) Quit再选该类别下的具体项。首先安装依赖Setup - Install dependencies依次按1再按1。然后再次运行./build.sh选择Setup - Build WeKan依次按1再按2构建 Wekan。关于构建产物meteor build会生成.build/发布用的 bundlemeteor build .build --directory的输出.build/bundle即被部署、测试和打包的对象与_build/rspack 编译输出被 Meteor 从_build/main-prod/读取属于构建交接物而非残留。两者均为生成物且被 git 忽略详见 Directory Structure 和 Build from source。5) 用独立版 Wekan 进行日常开发Sandstorm 版与独立版共享同一份代码因此日常功能开发在独立版上完成效率最高——Sandstorm 环境需要虚拟化、权限模型也更复杂。启动独立开发服务器cd ~/repos/wekan meteor --port 4000Wekan 运行在 http://localhost:4000。当你修改文件后Meteor 会自动侦测变化并重新构建、热重载。如果 Meteor 没有侦测到改动可以按Ctrl-c停止然后重新运行./build.sh-Setup - Build WeKan按1再按2。6) 连接 MongoDB 检查数据独立开发模式下Meteor 会为应用启动一个内部 MongoDB 实例其端口是 Meteor 节点端口的下一个端口--port 4000则数据库为 4001。首先安装 MongoDB 3.2.x 的 shell 与工具按官方文档安装说明添加 repo 与 key 后sudo apt-get -y install mongodb-org-shell mongodb-org-tools然后连接数据库mongo --port 4001或者更简单地在wekan目录下直接使用 Meteor 提供的封装meteor mongo也可以使用 MongoDB GUI如 NoSQLBooster连接localhost:4001查看集合内容。这在验证 Sandstorm 特有数据模型如services.sandstorm字段、sandstorm 用户 ID 的存储时非常有用。7) 在 Sandstorm 中测试功能当你的功能在独立版 Wekan 上验证通过后就可以在 Sandstorm 中测试它。先构建 Wekancd ~/repos/wekan ./build.sh选择Setup - Build WeKan按1再按2。构建完成后运行 meteor-spk 的 dev 命令把当前目录打包成开发版并安装到本地 Sandstormmeteor-spk dev仓库中 releases/sandstorm-test-dev.sh 的内容正是这一条meteor-spk dev命令可用于验证打包环境是否就绪。8) 验证构建成功标志构建完成后终端最后一行文本应为App in now available from Sandstorm server. Ctrl-C to disconnect.然后用 Firefox/Chromium/Chrome/Edge含 Chromium Edge浏览器打开http://local.sandstorm.io:6080/使用 Sandstorm 预置的本地开发账号Alice登录。9) 进入 Apps / Wekan登录后进入 Sandstorm 的Apps / Wekan。此时 Wekan 带有灰色 dev mode 背景表示这是开发模式实例。点击 Wekan 进入。10) 点击 (Dev) 创建新看板在 Wekan 中点击 (Dev) Create new board创建新看板用于测试。11) 检查功能是否正常在 Sandstorm 实例中逐一验证你开发的功能。需要注意 Sandstorm 环境的特殊性见下文源码视角部分例如 SSO 登录、多看板、权限模型等行为可能与独立版略有不同。12) 功能验证通过后提交、推送、发起 Pull Requestgit add --all git commit -a -m Add Feature: ADD-YOUR-FEATURE-DESCRIPTION-HERE git push然后到你的 Wekan Fork 页面点击Create Pull Request等待维护者xet7的评论或合并。你可以在 Wekan 官网的 Stable ChangeLog 中查看自己的变更是否进入新版本。源码视角Wekan 的 Sandstorm 实现细节为了让开发调试更有针对性这里结合仓库源码说明 Sandstorm 分支的关键实现SSO 登录与权限映射Sandstorm 的登录由 packages/wekan-accounts-sandstorm 承载server.js当process.env.SANDSTORM被设置时把__meteor_runtime_config__.SANDSTORM true写入运行时配置并启用 Highlander Mode——禁用除 sandstorm 之外的所有登录方式validateLoginAttempt中attempt.type ! sandstorm直接拒绝。server.js每个连接记录_sandstormUser、_sandstormSessionId、_sandstormTabIdloginWithSandstorm(token)方法完成等待-交接rendezvous后调用setUserId()完成登录。server.js/.sandstorm-login原始 HTTP 处理器接收application/x-sandstorm-login-token的 POST从X-Sandstorm-*请求头X-Sandstorm-User-Id、X-Sandstorm-Username、X-Sandstorm-Permissions、X-Sandstorm-Preferred-Handle等中提取身份信息调用Accounts.updateOrCreateUserFromExternalService(sandstorm, ...)创建或更新 Meteor 账号。client.js客户端在SANDSTORM标志下自动调用loginWithSandstorm通过同一个随机 token 走 DDP 方法 XHR 双通道完成无密码自动登录。在 sandstorm.js 中Sandstorm 的 grain 权限被映射为 Wekan 的全局角色拥有configure权限grain 所有者/管理员的用户成为 Wekan admin其余为普通用户。单看板到多看板的演进历史上的 Sandstorm 版每个 grain 只有一个硬编码看板_id: sandstormsandstorm.js 中仍有该常量及其注释。当前代码已演进为多看板模型不再自动创建 libreboard/路由直接落到 Wekan 的 All Boards 页面用户在页面中自行创建和管理看板见 sandstorm.js 的说明。因此新功能开发时不需要假设单看板。ROOT_URL 与编码修正sandstorm.js 做了两个关键的运行时修正删除请求中的Accept-Encoding头避免 sandstorm-http-bridge 谎报 gzip 导致浏览器出现 Corrupted Content Error通过addRuntimeConfigHook把ROOT_URL重写为 grain 的真实 URL来自X-Sandstorm-Base-Path并重设SANDSTORM标志保证 DDP 连接与动态导入走同源。数据层FerretDB SQLite当前 Sandstorm .spk 在 grain 内运行 sandstorm-src/start.js由myCommand指向./start-memory.sh见 sandstorm-pkgdef.capnp。它负责启动 FerretDB v1SQLite 后端作为 MongoDB 协议兼容层并在首次启动时自动迁移旧 grain 的 MongoDB 3 数据甚至更老的 niscu/MongoDB 2.x 数据迁移期间由 sandstorm-src/migration-bridge.js 在应用端口上提供please wait页面避免浏览器报错。WRITABLE_PATH/var/files附件、头像与 SQLite 数据库目录也在 pkgdef 中定义。包定义文件sandstorm-pkgdef.capnp 是 meteor-spk 生成 .spk 的依据appVersion 1172、appMarketingVersion 11.72~2026-09-11每个版本递增actions定义 New board 新文档动作continueCommand用于冷启动恢复bridgeConfig.viewInfo定义了 Sandstorm 权限participate/configure、角色observer/member以及上报给 Sandstorm 的 eventTypes如createCard、addComment等environ是应用完整的环境变量其中SANDSTORM1触发 accounts-sandstorm 的登录逻辑DDP_TRANSPORTsockjs配合 releases/bundle-trim.mjs 精简包体积约 121 MB 的 uWebSockets 二进制被剔除。正式发布时维护者使用meteor-spk pack wekan-version.spk打包并spk publish发布见 releases/release-sandstorm.sh 与 releases/sandstorm-make-spk.sh开发调试只需meteor-spk dev。常见注意事项更新源Sandstorm 开发版请固定UPDATE_CHANNELdev避免自动更新干扰开发环境端口约定独立开发meteor --port 4000时MongoDB 在 4001 端口Sandstorm grain 内应用端口为 4000APP_PORT数据库端口为 4001权限模型差异Sandstorm 下看板分享由 Sandstorm 的 grain 权限系统管理因此看板可见性固定为 public对 grain 内授权的用户而言UI 中与之冲突的设置会被隐藏不要提交构建产物.build/、_build/、.meteor-spk/等均为生成物提交代码前git add --all时注意只提交源码与测试改动。遵循上述流程你就可以完成一次完整的独立版开发 → Sandstorm 验证 → Pull Request的贡献闭环。祝编码愉快感谢你的贡献【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表