1# README.OpenSource 设计规范文档和使用指南
2
3## 引言
4
5为了更好地追溯第三方开源软件的原始上游信息,OpenHarmony社区在 [《第三方开源软件引入指导》](第三方开源软件引入指导.md) 中要求:
6
7> 新引入的开源软件必须在其根目录中提供 `README.OpenSource` 文件,该文件应准确描述以下内容:软件名称、许可证类型、许可文件位置、软件版本、对应版本的上游社区地址、软件维护者(Owner)、功能描述及依赖关系。
8
9然而,在实际编写 `README.OpenSource` 文件时,社区开发者常常因规范定义和填写要求不够明确,尤其是在处理多许可证和多开源软件等复杂场景时,导致文件内容不规范。因此,本文档旨在为OpenHarmony项目中的 `README.OpenSource` 文件提供一套更清晰、更易理解的设计规范与使用指南。在**保持原有元数据字段结构**的基础上,我们将解决多个许可证可能共享同一许可证文件的问题,以满足工程化解析的需求,同时确保不影响现有 `README.OpenSource` 文件的使用。
10
11## 范围
12
13本指南适用于所有参与 OpenHarmony 社区的贡献者,特别是当引入第三方开源软件到 OpenHarmony 项目中时。
14
15
16## 配置文件总体结构
17
18`README.OpenSource` 文件采用 JSON 格式,包含一个数组,数组中的每个元素是一个开源软件的元数据对象。**保持原有字段逻辑,不增删字段**。
19
20### 字段结构
21
22```
23[
24    {
25        "Name": "softwarename",              // 上游开源软件名全称
26        "License": "SPDX-License-Identifier",// 许可证信息,可能包含多个,用分号分隔
27        "License File": "path/to/license",   // 许可证文件路径,可能包含多个,用分号分隔
28        "Version Number": "1.0.0",           // 软件版本号
29        "Owner": "zhangsan@xyz.com",         // 维护人及邮箱
30        "Upstream URL": "https://example.com", // 上游软件地址
31        "Description": "软件功能简介",         // 软件描述
32        // "Dependencies": ["dependency1", "dependency2"] // 可选,存在依赖时填写
33    }
34]
35```
36
37## 字段定义和填写指南
38
39### 1. Name
40
41- **说明**:上游开源软件的全称。
42- **要求**:准确填写软件的正式名称,与上游发布的名称一致。
43
44### 2. License
45
46- **说明**:开源软件的许可证信息。
47
48- 要求  :
49  - 使用 [SPDX License Identifier](https://spdx.org/licenses/) 标准化填写。
50  - 多个许可证:用分号分隔。
51
52    ```
53    ";"
54    ```
55    - 示例:`"MIT;BSD-3-Clause"`
56
57  - **许可证顺序**:与 `License File` 字段中的许可证文件路径一一对应。
58
59### 3. License File
60
61- **说明**:许可证文件的路径。
62
63- 要求:
64
65  - **多个许可证文件**:用分号 `";"` 分隔,顺序与 `License` 字段中的许可证一致。
66
67  - 当多个许可证对应同一个许可证文件时: 在字段中重复该许可证文件路径。
68
69    ```
70    License File
71    ```
72
73    - 示例:`"LICENSE;LICENSE"`
74
75  - 单个许可证对应多个许可证文件:在对应的许可证文件路径中,用冒号
76
77    ```
78    ":"
79    ```
80
81     分隔多个文件。
82    - 示例:`"COPYING:LICENSE"`
83
84### 4. Version Number
85
86- **说明**:引入的开源软件版本号。
87- **要求**:填写上游发布的正式版本号,确保与实际使用的版本一致。
88
89### 5. Owner
90
91- **说明**:开源软件在 OpenHarmony 组织下的维护人及其邮箱。
92- **要求**:填写负责该软件维护的人员邮箱。
93
94### 6. Upstream URL
95
96- **说明**:上游开源软件的源代码仓库或发布页面链接。
97- **要求**:提供有效的上游软件源码或发行版链接。
98
99### 7. Description
100
101- **说明**:开源软件的功能简介。
102- **要求**:用简洁的语言描述软件的主要功能和用途。
103
104### 8. Dependencies(可选)
105
106- **说明**:该软件直接依赖的其他开源软件列表。
107
108- 要求:
109  - **仅当**软件存在被动依赖时,才需要填写此字段。
110  - 以数组形式列出依赖的软件名称,与依赖软件的 `Name` 字段一致。
111  - 示例:`"Dependencies": ["dependency1", "dependency2"]`
112
113## 使用指南
114
115### 1. 引入新开源软件
116
117- 步骤:
118  1. 为引入的软件创建独立的代码仓库。
119  2. 在仓库根目录下创建 `README.OpenSource` 文件。
120  3. 按照上述字段定义填写 `README.OpenSource` 文件。
121  4. 如果软件存在被动依赖,确保所有依赖的软件也已主动引入,并有对应的 `README.OpenSource` 文件。
122
123### 2. 处理多许可证情况
124
125- **多个许可证对应同一个许可证文件**:
126  - 在 `License` 字段中列出所有许可证,用分号 `";"` 分隔。
127  - 在 `License File` 字段中重复该许可证文件路径,与 `License` 字段中的许可证顺序对应。
128  - 示例:
129    ```
130    "License": "MIT;BSD-3-Clause",
131    "License File": "LICENSE;LICENSE"
132    ```
133
134- **单个许可证对应多个许可证文件**:
135  - 在 `License` 字段中填写对应的许可证。
136  - 在 `License File` 字段中,用冒号 `":"` 分隔多个许可证文件路径。
137  - 示例:
138    ```
139    "License": "GPL-2.0+",
140    "License File": "COPYING:LICENSE"
141    ```
142
143- **多个许可证对应多个许可证文件**:
144
145  - 在 `License` 字段和 `License File` 字段中,分别用分号 `";"` 分隔,顺序对应。
146  - 示例:
147    ```
148    "License": "MIT;Apache-2.0",
149    "License File": "LICENSE-MIT;LICENSE-APACHE"
150    ```
151
152### 3. 维护依赖关系
153
154- **说明**:在主软件的 `README.OpenSource` 文件中,通过 `Dependencies` 字段列出其所有直接依赖的软件。
155
156- 要求  :
157  - **仅当**软件存在被动依赖时,才需要填写 `Dependencies` 字段。
158  - 仅列出直接依赖,不列出间接依赖,间接依赖通过直接依赖呈现。
159  - 确保依赖的软件已在 OpenHarmony 中主动引入,并有对应的 `README.OpenSource` 文件。
160
161### 4. 更新开源软件
162
163- 步骤  :
164  1. 当需要更新开源软件版本时,修改 `Version Number` 字段,确保与实际使用的版本一致。
165  2. 检查许可证信息是否有变化,若有,更新 `License` 和 `License File` 字段。
166  3. 检查依赖关系是否有变化,更新 `Dependencies` 字段。
167
168### 5. 特殊情况处理
169
170- **异常场景报备**:如需在同一个 `README.OpenSource` 文件中管理多个开源软件,OpenHarmony主线组织下的项目必须提前向社区架构SIG报备申请。
171
172## 工程化解析指导
173
174- **解析器逻辑**:
175  1. 读取 `License` 和 `License File` 字段,使用分号 `";"` 分隔,得到许可证列表和许可证文件列表。
176  2. 通过索引对应,建立许可证与许可证文件的映射关系。
177  3. 当许可证文件路径中包含多个文件时,使用冒号 `":"` 分隔,再次拆分。
178
179- **解析示例**:
180  ```
181  "License": "MIT;BSD-3-Clause",
182  "License File": "LICENSE;LICENSE"
183  ```
184
185  - 解析结果:
186    - 许可证列表:`["MIT", "BSD-3-Clause"]`
187    - 许可证文件列表:`["LICENSE", "LICENSE"]`
188    - 映射关系:
189      - `"MIT"` 对应 `"LICENSE"`
190      - `"BSD-3-Clause"` 对应 `"LICENSE"`
191
192## 示例
193
194### 示例 1:多个许可证对应同一许可证文件
195
196```
197[
198    {
199        "Name": "examplelib",
200        "License": "MIT;BSD-3-Clause",
201        "License File": "LICENSE;LICENSE",
202        "Version Number": "1.2.3",
203        "Owner": "developer@openharmony.io",
204        "Upstream URL": "https://github.com/example/examplelib",
205        "Description": "一个示例库,具有多个许可证对应同一许可证文件。"
206    }
207]
208```
209
210### 示例 2:单个许可证对应多个许可证文件
211
212```
213[
214    {
215        "Name": "complexlib",
216        "License": "GPL-2.0+",
217        "License File": "COPYING:LICENSE",
218        "Version Number": "3.0.0",
219        "Owner": "maintainer@openharmony.io",
220        "Upstream URL": "https://github.com/example/complexlib",
221        "Description": "一个复杂库,单个许可证对应多个许可证文件。"
222    }
223]
224```
225
226### 示例 3:具有依赖关系的软件
227
228```
229[
230    {
231        "Name": "bindgen",
232        "License": "BSD-3-Clause",
233        "License File": "LICENSE",
234        "Version Number": "0.59.1",
235        "Owner": "lihua@openharmony.io",
236        "Upstream URL": "https://github.com/rust-lang/rust-bindgen",
237        "Description": "用于生成 Rust FFI 绑定到 C/C++ 库的工具。",
238        "Dependencies": ["shlex", "once_cell"]
239    }
240]
241```
242
243### 示例 4:无依赖的软件
244
245```
246[
247    {
248        "Name": "simplelib",
249        "License": "Apache-2.0",
250        "License File": "LICENSE",
251        "Version Number": "0.1.0",
252        "Owner": "zhaoliu@openharmony.io",
253        "Upstream URL": "https://github.com/example/simplelib",
254        "Description": "提供简单功能的库。"
255        // 无需填写 Dependencies 字段
256    }
257]
258```
259
260## 注意事项
261
2621. **字段完整性**:
263   - 保持原有字段结构,不增删字段。
264   - 除非明确说明可选,所有字段均为必填项。
265   - `Dependencies` 字段为可选,仅在存在依赖时填写。
2662. **许可证与许可证文件的对应关系**:
267   - `License` 和 `License File` 字段中的元素数量和顺序必须一致。
268   - 当多个许可证对应同一个许可证文件时,重复许可证文件路径。
269   - 当许可证文件对应多个文件时,使用冒号 `":"` 分隔。
2703. **解析规则一致性**:
271   - 解析器应按照约定的分隔符和顺序解析,实现许可证与许可证文件的正确映射。
272   - 确保解析逻辑与填写规范一致,避免误解。
2734. **避免对存量文件的影响**:
274   - 由于保持了原有字段结构,现有的 `README.OpenSource` 文件无需修改即可兼容新的解析规则。
2755. **字段格式要求**:
276   - `License` 字段中的许可证顺序应与 `License File` 中的许可证文件顺序一致。
277   - 使用标准的 SPDX 许可证标识符,避免使用非标准或简写形式。
2786. **合规性检查**:
279   - 确保填写的信息与上游开源软件的实际情况一致。
280   - 定期检查许可证和版本信息,确保及时更新。
281
282## 开源义务履行
283- **依据映射关系**,确保每个许可证的义务得到正确履行。
284- **处理流程**:
285  1. 解析 `License` 和 `License File` 字段,建立许可证与许可证文件的映射。
286  2. 收集并审阅每个许可证文件,理解其要求。
287  3. 根据每个许可证的要求,执行相应的合规措施,如版权声明、源代码披露等。
288
289## 本文的改进和修订说明
2901. 本文档由 OpenHarmony 合规 SIG 主导起草和维护。本文档的最新版本可在 [这里](第三方开源软件上游软件元数据READMEOpenSource文件设计规范和使用指南.md) 获取。
2912. 任何对于本文中涉及的规则的增加、修改、删除都必须被追踪,请进入该追踪系统。
2923. 最终规则经过社区充分的讨论后,由 PMC 评审定稿。
293