尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
OpenProject 版本管理(Versions)完全指南:创建、共享、生命周期与 Roadmap 联动
OpenProject 版本管理Versions完全指南创建、共享、生命周期与 Roadmap 联动【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject版本Versions是 OpenProject 中用于对发布Releases、里程碑Milestones或其他交付目标进行结构化管理与进度追踪的核心机制。本文将基于官方用户指南与仓库源码系统讲解如何在项目设置中创建、编辑、关闭与删除版本深入剖析五种共享范围Sharing的精确语义并对比 open / locked / closed 三种状态在 Backlogs、Roadmap 等模块中的行为差异。读完本文你将掌握 OpenProject 版本管理的全部操作路径并理解其底层模型约束与实现原理。版本是什么为交付目标建立可追踪的容器在 OpenProject 中版本用于把工作包Work Packages组织到一个可规划的交付目标下。你可以把工作包指派给某个版本然后在 Roadmap路线图 中统一规划、监控这些工作包的进展。典型的使用场景包括一次产品发布Release的缺陷修复与功能交付清单一个 Sprint 迭代的范围锁定一个阶段性里程碑Milestone的交付检查点。版本的配置入口位于项目菜单的Project settings → Versions项目设置 → 版本。打开后可以看到当前项目的全部版本列表。默认情况下版本按Name名称列排序表头旁会显示排序箭头点击任意列的表头即可切换为该列的排序方式。从源码层面看版本是一个独立的 ActiveRecord 模型app/models/version.rb 中定义了class Version ApplicationRecord它belongs_to :project并通过work_package_versions关联到工作包分为targeted_work_packages目标工作包与observed_in_work_packages观察工作包两类同时acts_as_customizable支持自定义字段扩展。模型中还硬编码了两组关键枚举常量VERSION_STATUSES %w(open locked closed).freeze VERSION_SHARINGS %w(none descendants hierarchy tree system).freeze这两组常量分别对应本文将要展开的状态机与共享范围后续小节会逐一说明。创建新版本字段详解与表单实操在版本总览页面点击绿色 Version按钮即可进入新建版本表单。表单中可配置的字段如下Name名称为版本设置名称必填。Description描述添加描述以说明版本的用途与目标。Status状态选择版本状态默认状态为open。Wiki pageWiki 页面选择一个 Wiki 页面使其可以从 Roadmap 中的该版本处直接链接跳转。Start and finish date开始与结束日期设置计划的开始日期与结束日期。Sharing共享范围选择版本要共享给哪些项目。根据所选选项版本可以仅对当前项目可见也可以对相关项目可见。填写完成后点击Create按钮保存。字段背后的模型校验规则这些表单字段并非随意设计其约束在 app/models/version.rb 中都有对应的校验逻辑validates :name, presence: true, uniqueness: { scope: [:project_id], case_sensitive: false } validates :effective_date, format: { with: /\A\d{4}-\d{2}-\d{2}\z/, message: :not_a_date, allow_nil: true } validates :start_date, format: { with: /\A\d{4}-\d{2}-\d{2}\z/, message: :not_a_date, allow_nil: true } validates :status, inclusion: { in: VERSION_STATUSES } validate :validate_start_date_before_effective_date版本名称在同一项目内必须唯一且不区分大小写case_sensitive: false开始日期与结束日期必须符合YYYY-MM-DD格式允许为空状态必须属于VERSION_STATUSESopen / locked / closed自定义校验validate_start_date_before_effective_date保证结束日期不能早于开始日期否则会抛出:greater_than_start_date错误。前端路由方面新建与保存操作由 app/controllers/versions_controller.rb 中的new/create动作承接create动作将表单参数与当前项目 ID 合并后交给Versions::CreateService执行成功后重定向回版本设置页失败则渲染new模板并返回422 Unprocessable Entity。版本共享Sharing五种范围的精确语义Sharing是版本配置中最关键、也最容易混淆的字段它决定了版本在项目层级结构中到底对哪些项目可见。为了解释清楚原文档给出了如下项目层级示例Parent project ├── Project A │ ├── Project A1 │ │ └── Project A1a │ └── Project A2 └── Project B ├── Project B1 ← 当前项目 │ ├── Project B1a │ │ └── Project B1a-i │ └── Project B1b └── Project B2下面假设正在创建/编辑的版本属于Project B1逐一说明五种共享选项的实际效果。Not shared不共享版本仅对当前项目可见Project B1 ✓ ← 当前项目With subprojects包含子项目版本对当前项目及其所有层级的子项目可见包括嵌套在更深层的子项目Project B1 ✓ ← 当前项目 ├── Project B1a ✓ │ └── Project B1a-i ✓ └── Project B1b ✓With project hierarchy包含项目层级版本对当前项目、其所有父项目以及所有子项目可见。同一父项目下的其他兄弟项目不被包含Parent project ✓ └── Project B ✓ ├── Project B1 ✓ ← 当前项目 │ ├── B1a ✓ │ └── B1b ✓ └── Project B2 ✗With project tree包含整个项目树版本对属于同一项目树的所有项目可见。这里的项目树指拥有同一个顶级父项目的全部项目及其子项目。在本例中Project A与Project B共享同一个顶级父项目Parent project因此它们及其子项目都属于同一棵项目树Parent project ✓ ← 共同父项目 ├── Project A ✓ │ ├── Project A1 ✓ │ │ └── Project A1a ✓ │ └── Project A2 ✓ └── Project B ✓ ├── Project B1 ✓ ← 当前项目 │ ├── Project B1a ✓ │ └── Project B1b ✓ └── Project B2 ✓With all projects所有项目版本对整个 OpenProject 实例中的所有项目可见无论这些项目在项目层级结构中处于什么位置。源码视角共享范围如何落地为 SQL五种共享范围在模型中对应VERSION_SHARINGS %w(none descendants hierarchy tree system)其底层实现位于 app/models/versions/project_sharing.rb。该模块通过project_sharing_join_condition把共享语义翻译成基于项目嵌套集lft/rgt左右值的 Arel 连接条件nonesharing_table[:id].eq(projects_table[:id])仅匹配版本所属项目本身descendantsWith subprojects匹配自身id相等或满足lft/rgt均位于版本项目区间之内即其子项目包含任意深度hierarchyWith project hierarchy在descendants基础上追加lft 自身 lft 且 rgt 自身 rgt的条件即所有祖先项目treeWith project tree先从根节点parent_id IS NULL出发找出整棵树的lft–rgt区间再匹配区间内的所有项目systemWith all projects条件恒为真Arel::Nodes::True即所有项目都可见。这正是共享选项能做到精确到任意深度的机制项目表维护了嵌套集区间共享判定完全由区间运算完成无需递归遍历。此外app/models/version.rb 中的scope :systemwidesharing system与Version.visible可见性判断也复用了这一共享模型确保用户只能看到自己有权访问的版本。编辑版本在版本总览中点击每行右侧的edit编辑图标即可修改该版本。[!NOTE] 你只能编辑在原始创建项目内的版本。在版本被共享到的其他项目中编辑选项不可用。从控制器实现看编辑流程对应 app/controllers/versions_controller.rb 中的update动作它通过Version.visible.find(params[:id])定位版本确保用户有查看权限再调用Versions::UpdateService应用属性变更成功后重定向回版本设置页。由于模型层对名称唯一性、日期格式与先后关系均有校验编辑时若违反约束会在表单页直接呈现错误。关闭版本要关闭某个版本打开其详情后将Status状态设置为Closed即可。关闭操作的本质就是把版本的状态字段从open更新为closed模型层以closed?方法判断status closed。关闭后的版本将退出 Backlogs 与 Roadmap 的默认视图详见下文状态对比。批量关闭已完成版本如果项目中的多个版本已经完成可以一键批量关闭点击页面右上角的More三个点图标再点击Close completed versions。该功能对应控制器中的close_completed动作def close_completed project.close_completed_versions redirect_to project_settings_versions_path(project), status: :see_other end它直接调用Project#close_completed_versions关闭所有已完成的版本。而已完成的判定逻辑定义在 app/models/version.rb 的completed?方法中——一个版本被认定为已完成需要同时满足两个条件结束日期已到effective_date Date.today且没有任何未关闭的工作包open_issues_count.zero?。也就是说Close completed versions 只作用于那些到期且无未完成任务在身的版本。前端层面该菜单项在 app/views/projects/settings/versions/show.html.erb 中通过 kebab三个点菜单渲染且仅在project.versions.any?时才出现点击时带有turbo_confirm二次确认提示。删除版本要移除某个版本在版本总览中点击对应行末尾的delete删除按钮即可。删除动作对应控制器destroy动作内部交由Versions::DeleteService执行。若删除失败例如版本仍被已归档项目中的工作包使用页面会给出相应的错误提示删除成功后则显示成功通知并重定向回版本设置页。状态对比Open、Locked 与 Closed 的行为差异三个状态对应源码中的VERSION_STATUSES %w(open locked closed)在使用行为上有显著区别状态是否可增删工作包Backlogs 模块Roadmap 模块典型场景Open开放可以可见可见版本处于正常规划与执行阶段Locked锁定不可以不可见仍可见Sprint 或发布范围已定稿执行期间防止改动Closed关闭不可以不可见不可见除非显式过滤发布或 Sprint 已完成进入下一阶段具体说明Open 版本可在系统各处使用。工作包可以随时加入或移出版本版本在Backlogs与Roadmap两个模块中都可见。Locked 版本工作包不能再被添加或移除。版本不会出现在 Backlogs 模块中但仍会显示在 Roadmap 模块里。适用场景一个 Sprint 或发布的范围已经定稿希望在执行过程中防止任何变更。Closed 版本工作包不能再被添加或移除。版本默认不再出现在 Backlogs 或 Roadmap 模块中除非你显式过滤出已关闭的版本。适用场景发布或 Sprint 已经完成团队已转入下一个迭代。从实现上看锁定的约束主要体现在模型的关联层Version#targeted_work_packages等关联基于work_package_versions中间表状态的增删限制由工作包侧的校验逻辑保障而 Roadmap 过滤逻辑在控制器index动作中可见——versions.reject! { |version| version.closed? || version.completed? } unless completed即默认视图会剔除已关闭与已完成版本只有显式传入completed参数时才会展示它们。版本进度数据Roadmap 上的完成度从哪来Roadmap 页面会为每个版本展示完成度与工时统计这些数据同样来自 app/models/version.rb 的模型方法理解它们有助于你正确解读版本视图completed?结束日期已到且无未关闭工作包overdue?结束日期已过且仍有未关闭工作包closed_percent已标记为已关闭的工作包占比completed_percent综合考虑工作包的开闭比例与估计工时得出的完成百分比estimated_hours/spent_hours版本目标工作包的估计工时合计与实际登记工时合计。这些方法共同支撑了 Roadmap 中每个版本的进度条、逾期标识与工时汇总让你在规划层面对齐到版本粒度的工作包进展。小结版本是 OpenProject 中连接工作包执行与发布/里程碑规划的桥梁。通过Project settings → Versions可以完成版本的创建、编辑、关闭与删除五种共享范围不共享 / 子项目 / 项目层级 / 项目树 / 全部项目依托嵌套集区间实现了精确到任意层级的可见性控制open / locked / closed 三种状态则分别对应版本生命周期的规划、冻结与收尾阶段。结合 app/models/version.rb 的模型约束、app/models/versions/project_sharing.rb 的共享实现与 app/controllers/versions_controller.rb 的控制器逻辑你可以依据团队的实际项目结构设计出既灵活又可控的版本管理体系。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

仿生蝴蝶扑翼无人机:低雷诺数气动优化与FOC驱动动态调参

仿生蝴蝶扑翼无人机:低雷诺数气动优化与FOC驱动动态调参

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/18 16:35:50
BabelDOC:PDF文档翻译3分钟上手,公式和版式都能保住

BabelDOC:PDF文档翻译3分钟上手,公式和版式都能保住

BabelDOC:PDF文档翻译3分钟上手,公式和版式都能保住 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 拿到一份带公式、双栏排版的英文论文,粘进网页翻译工具常…

📅 2026/9/18 16:35:50
蓝屏代码0xc000021a与UNEXPECTED_STORE_EXCEPTION排查指南

蓝屏代码0xc000021a与UNEXPECTED_STORE_EXCEPTION排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/18 16:35:50
MORE NEWS

更多资讯

📰

长按开关机芯片选型指南:五大参数与常见问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

WPF UI 主题测试一张表:IThemeService 7 个方法 + 最小注册示例

WPF UI 主题测试一张表:IThemeService 7 个方法 最小注册示例 【免费下载链接】wpfui WPF UI provides the Fluent experience in your known and loved WPF framework. Intuitive design, themes, navigation and new immersive controls. All natively and effor…

📰

douyin-downloader 无水印批量下载指南:从安装到定时任务

douyin-downloader 无水印批量下载指南:从安装到定时任务 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…

📰

使用 Jest 与 MongoDB 集成测试:jest-mongodb Preset 完整指南

使用 Jest 与 MongoDB 集成测试:jest-mongodb Preset 完整指南 【免费下载链接】jest Delightful JavaScript Testing. 项目地址: https://gitcode.com/gh_mirrors/je/jest 本篇指南讲解如何在 Jest 测试中平滑接入真实 MongoDB:从 Jest 的 Globa…

📰

paperxie分环节深度测评:8大环节逐个打分,看看每个环节到底好不好用

市面上测评paperxie的文章很多,但大多数都是整体优缺点分析,很少有人按毕设的每个环节逐个测评。今天就换一种写法,按毕设的8大环节——智能选题与开题报告、文献服务、AI学术写作、查重降重、格式排版、AI答辩PPT、科研绘图、AI润色与内容优…

📰

OpenProject 版本管理(Versions)完全指南:创建、共享、生命周期与 Roadmap 联动

OpenProject 版本管理(Versions)完全指南:创建、共享、生命周期与 Roadmap 联动 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powe…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬