<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>基本开发规范 on Macula</title><link>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/</link><description>Recent content in 基本开发规范 on Macula</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/index.xml" rel="self" type="application/rss+xml"/><item><title>环境管理</title><link>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/environment/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;&#10;&lt;p&gt;每套系统都需要经过开发、测试、预发等环节才能够上线，所以这里定义一套标准的环境命名规则。&lt;/p&gt;&#10;&lt;h2 id="环境命名"&gt;环境命名&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;环境名称&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;local&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本地环境，默认的开发人员本地的环境&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dev&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开发环境，用于开发阶段的部署&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;test&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测试环境，开发提测后测试人员进行测试的环境（有时会和dev公共，减少部署）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;stg&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;准生产环境，开发阶段测试完成后需要发版前的回归测试环境，代码与生产一致&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;压测环境，用于性能测试&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;prd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;生产环境&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;</description></item><item><title>分支管理</title><link>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/branchmng/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/branchmng/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;&#10;&lt;p&gt;在软件研发的过程中，代码分支管理模型至关重要，直接影响着软件研发交付的效率。行业里存在着多种不同的分支管理模型，如GitFlow、GitHubFlow、GitLabFlow、OneFlow以及AOneFlow(阿里)。&lt;/p&gt;&#10;&lt;p&gt;各模型存在不同的优缺点，需要根据研发团队的实际情况进行选择（甚至对分支模型进行适当的变种，以适应团队实际的需要）。以下针对几个常见的模型进行介绍。&lt;/p&gt;&#10;&lt;h2 id="分支模型介绍"&gt;分支模型介绍&lt;/h2&gt;&#10;&lt;h3 id="gitflow"&gt;GitFlow&lt;/h3&gt;&#10;&lt;p&gt;GitFlow是最早诞生并得到广泛应用的一种工作流程。&#10;该模型中存在两种长期分支：master和develop。master中存放对外发布的版本，只有稳定的发布版本才会合并到master中。develop用于日常开发，存放最新的开发版本。&#10;同时还存在三种临时分支：feature, hotfix, release:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;feature分支是为了开发某个特定功能，从develop分支中切出，开发完成后合并到develop分支中&lt;/li&gt;&#10;&lt;li&gt;hotfix分支是修复发布后发现的Bug的分支，从master分支中切出，修补完成后再合并到master和develop分支&lt;/li&gt;&#10;&lt;li&gt;release分支指发布稳定版本前使用的预发布分支，从develop分支中切出，预发布完成后，合并到develop和master分支中&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;整体分支模型，如下图所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;a data-fancybox="gallery" href="../images/gitflow.jpg"&gt;&#10; &lt;img src="../images/gitflow.jpg" alt="image" /&gt;&#10;&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;优点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;feature 分支使开发代码隔离，可以独立的完成开发、构建、测试&lt;/li&gt;&#10;&lt;li&gt;feature 分支开发周期长于release时，可避免未完成的feature进入生产环境&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;缺点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;无法支持持续发布&lt;/li&gt;&#10;&lt;li&gt;过于复杂的分支管理，加重了开发者的负担，使开发者不能专注开发&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="githubflow"&gt;GitHubFlow&lt;/h3&gt;&#10;&lt;p&gt;GitHubFlow分支模型只存在一个master主分支，日常开发都合并至master，永远保持其为最新的代码且随时可发布的。在需要添加或修改代码时，基于master创建分支，提交修改。&#10;创建Pull Request，所有人讨论和审查你的代码。然后部署到生产环境中进行验证。待验证通过后合并到master分支中。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Macula采用该分支管理模型。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;整体分支模型，如下图所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;a data-fancybox="gallery" href="../images/githubflow.jpg"&gt;&#10; &lt;img src="../images/githubflow.jpg" alt="image" /&gt;&#10;&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;优点：轻便快捷、简洁易理解，将master作为核心的分支，代码更新持续集成至master上&lt;/p&gt;&#10;&lt;p&gt;缺点：多版本并行的产品线不适用&lt;/p&gt;&#10;&lt;h3 id="gitlabflow"&gt;GitLabFlow&lt;/h3&gt;&#10;&lt;p&gt;GitLabFlow是GitFlow和GitHubFlow的结合体，吸取了两者的优点：既有适应不同开发环境的弹性，又有单一主分支的简单和便利。&#10;该模型采取上游优先的原则，即只存在一个master主分支，它是所有分支的上游。只有上游分支采纳的变动才能应用到其他分支。对于持续发布的项目，建议在master之外再建立对应的环境分支，如预生产环境pre-production，生产环境production。对于版本发布的项目，建议基于master创建稳定版本对应的分支，如stable-1，stable-2。&lt;/p&gt;&#10;&lt;p&gt;整体分支模型，如下图所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;a data-fancybox="gallery" href="../images/gitlabflow1.jpg"&gt;&#10; &lt;img src="../images/gitlabflow1.jpg" alt="image" /&gt;&#10;&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;优点：git提交历史更加清晰、简洁与易读&lt;/p&gt;&#10;&lt;p&gt;缺点：对开发人员的能力提出了更高的要求，当存在多产品线时，分支管理比较复杂&lt;/p&gt;&#10;&lt;h3 id="oneflow"&gt;OneFlow&lt;/h3&gt;&#10;&lt;p&gt;Adam Ruka 于2017年提出，可以简单的理解为 Git Flow 的简化版本，除了 develop 开发分支和最新发布 master 分支，其余皆是临时分支，一旦开发完成即可删除临时分支。&lt;/p&gt;&#10;&lt;p&gt;整体分支模型，如下图所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;a data-fancybox="gallery" href="../images/oneflow.jpg"&gt;&#10; &lt;img src="../images/oneflow.jpg" alt="image" /&gt;&#10;&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;优点：单一版本首选，git 提交历史简介清晰易读&lt;/p&gt;&#10;&lt;p&gt;缺点：不适合持续交付或持续部署的项目，也不适用多版本共存的项目&lt;/p&gt;&#10;&lt;h3 id="aoneflow"&gt;AOneflow&lt;/h3&gt;&#10;&lt;p&gt;由阿里巴巴技术专家林帆提出的一种改进模型，其主要分为三种分支类型：主干分支、特性分支以及发布分支，并且提出了三个基本准则：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;主干创建特性分支，且不允许合并回主干分支&lt;/li&gt;&#10;&lt;li&gt;合并特性分支，形成发布分支&lt;/li&gt;&#10;&lt;li&gt;发布到线上正式环境后，合并相应的发布分支到主干，在主干添加标签，同时删除该发布分支关联的特性分支&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;整体分支模型，如下图所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;a data-fancybox="gallery" href="../images/aoneflow.jpg"&gt;&#10; &lt;img src="../images/aoneflow.jpg" alt="image" /&gt;&#10;&lt;/a&gt;&#10;&lt;/p&gt;</description></item><item><title>版本管理</title><link>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/versionmng/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/5.x/03_devrules/%E5%9F%BA%E6%9C%AC%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/versionmng/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;&#10;&lt;p&gt;在软件管理的领域里存在着被称作“依赖地狱”的死亡之谷，系统规模越大，加入的包越多，你就越有可能在未来的某一天发现自己已深陷绝望之中。在依赖高的系统中发布新版本包可能很快会成为噩梦。如果依赖关系过高，可能面临版本控制被锁死的风险（必须对每一个依赖包改版才能完成某次升级）。而如果依赖关系过于松散，又将无法避免版本的混乱（假设兼容于未来的多个版本已超出了合理数量）。&lt;/p&gt;&#10;&lt;p&gt;当你项目的进展因为版本依赖被锁死或版本混乱变得不够简便和可靠，就意味着你正处于依赖地狱之中。作为这个问题的解决方案之一，我提议用一组简单的规则及条件来约束版本号的配置和增长。这些规则是根据（但不局限于）已经被各种封闭、开放源码软件所广泛使用的惯例所设计。&lt;/p&gt;&#10;&lt;p&gt;为了让这套理论运作，你必须先有定义好的公共 API。这可能包括文档或代码的强制要求。无论如何，这套 API 的清楚明了是十分重要的。一旦你定义了公共 API，你就可以透过修改相应的版本号来向大家说明你的修改。考虑使用这样的版本号格式：X.Y.Z（主版本号.次版本号.修订号）修复问题但不影响 API 时，递增修订号；API 保持向下兼容的新增及修改时，递增次版本号；进行不向下兼容的修改时，递增主版本号。&lt;/p&gt;&#10;&lt;p&gt;我称这套系统为“语义化的版本控制”，在这套约定下，版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。&lt;/p&gt;&#10;&lt;h3 id="版本格式"&gt;版本格式&lt;/h3&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;主版本号.次版本号.修订号&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h3 id="版本号递增规则"&gt;版本号递增规则&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;主版本号：当你做了不兼容的 API 修改&lt;/li&gt;&#10;&lt;li&gt;次版本号：当你做了向下兼容的功能性新增&lt;/li&gt;&#10;&lt;li&gt;修订号：当你做了向下兼容的问题修正&lt;/li&gt;&#10;&lt;li&gt;先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面，作为延伸&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="语义化版本控制规范"&gt;语义化版本控制规范&lt;/h2&gt;&#10;&lt;p&gt;以下关键词 MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照 RFC 2119 的叙述解读。&lt;/p&gt;&#10;&lt;p&gt;1）使用语义化版本控制的软件必须（MUST）定义公共 API。该 API 可以在代码中被定义或出现于严谨的文档内。无论何种形式都应该力求精确且完整。&lt;/p&gt;&#10;&lt;p&gt;2）标准的版本号必须（MUST）采用 X.Y.Z 的格式，其中 X、Y 和 Z 为非负的整数，且禁止（MUST NOT）在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须（MUST）以数值来递增。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt; 例如：1.9.1 -&amp;gt; 1.10.0 -&amp;gt; 1.11.0。&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;3）标记版本号的软件发行后，禁止（MUST NOT）改变该版本软件的内容。任何修改都必须（MUST）以新版本发行。&lt;/p&gt;&#10;&lt;p&gt;4）主版本号为零（0.y.z）的软件处于开发初始阶段，一切都可能随时被改变。这样的公共 API 不应该被视为稳定版。&lt;/p&gt;&#10;&lt;p&gt;5）1.0.0 的版本号用于界定公共 API 的形成。这一版本之后所有的版本号更新都基于公共 API 及其修改内容。&lt;/p&gt;&#10;&lt;p&gt;6）修订号 Z（x.y.Z | x &amp;gt; 0）必须（MUST）在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。&lt;/p&gt;</description></item></channel></rss>