基础
开始制作
基础要求
要编写交互式实验和挑战,你必须具备以下基本技能:
- 使用 Linux 的命令行界面,LabEx 的实验和挑战都是基于 Linux 系统。
- Git 和 GitHub 用于内容的提交和版本控制。
- Markdown 基本语法用于文档的编写。
- JSON 文件格式用于管理配置文件。
- 基本的英文读写能力。
- 如果你在中国大陆地区,需要一个稳定的本地代理,以便于顺利访问 GitHub 和 LabEx 网站。请不要询问我们使用什么代理,我们不会回答这个问题。
当然,也同时需要你具备期望制作实验和挑战相关的专业技能知识。
认领任务
接下来,介绍作者如何在 LabEx 平台上认领任务。
认领 Issue
在开始编写实验和挑战之前,你需要先认领一个 Issue:https://github.com/labex-labs/scenarios/issues
一般情况下,Issue 会有 3 个基本 Labels:
- 难度:例如
Beginner
,Intermediate
,Advanced
; - 类型:例如
Lab
,Challenge
; - 方向:例如
linux
,python
,docker
;
请充分利用好 GitHub Issue 提供的筛选功能。
如上图所示:
- 新手可以通过 ❶ 标记的筛选项进行筛选。例如你选中 Assignees 中的 Assigned to nobody,就可以看到所有未被别人分配认领的 Issue,再通过 Label 进一步筛选方向和难度等;还可以通过 Sort 进行 Issue 的排序,例如按照最新更新时间排序;
- 如果你对 GitHub 足够熟悉,也可以通过 ❷ 处的筛选条件进行筛选;
每个 Issue 对应一个实验或挑战。一般情况下,我们会在 Issue 中提供:
- 相应 Lab 的制作素材和基本信息;
- 补充的要求和注意事项;
请仔细阅读 Issue 的内容,然后按要求将 Issue 分配给自己(右上角点击 assign yourself),避免被其他作者重复认领。
认领后,你就可以开始编写实验和挑战了。
组织结构
我们的实验和挑战都是基于 GitHub 仓库进行组织的,每个仓库包含一个或多个实验和挑战。了解文件的组织结构对你正确提交内容非常重要。
我们会提前创建好一个 GitHub 仓库,其中包含多个文件夹,每个实验和挑战都在一个独立的文件夹内。
文档存放结构如下:
repo-name
└── linux
├── lab-name-1
├── lab-name-2
├── challenge-name-3
├── ……
其中:
linux
:是一个 Skill Tree 文件夹;lab-name-1
:是一个示例 Lab 文件夹;challenge-name-3
:是一个示例 Challenge 文件夹;
- 格式:只能出现小写字母和短横线,空格以短横线代替,不能出现空格、下划线、大写字母、特殊字符;
- 名称:Lab 以
lab-
开头,Challenge 以challenge-
开头,后续和 Lab Title 一致,不能单独定义;
内容规范
以下是单个实验/挑战的完整内容规范。请仔细阅读,然后按照要求提交内容,我们会对内容进行 Review。
{
"type": "lab",
"title": "Basic Template",
"description": "The description of basic template",
"difficulty": "Beginner",
"time": 5,
"hidden": false,
"fee_type": "pro",
"contributors": []
}
index.json
中存在 5 个基础配置项:
type
: 必须为lab
或者challenge
. 关于实验和挑战title
: 实验/挑战的标题,采用 Title Case 格式。通常情况下,标题与文件夹名称完全一致。description
: 简介,通常为 1 ~ 2 句话,10 ~ 100 个单词,为intro.md
更精简的版本。time
: 预估完成时间,单位为分钟,通常为 5 的倍数,可以按每个步骤 5 分钟计算。difficulty
: 难度,必须为Beginner
,Intermediate
或者Advanced
。hidden
: 是否隐藏,默认为 False,管理员配置项,作者无需处理。fee_type
: 收费类型,默认为 Pro,管理员配置项,作者无需处理。contributors
: 贡献者列表,系统通过 GitHub 提交记录自动补充,作者无需处理。
Lab 的难度根据包含 Skills 的范围来定义,以下是:
Beginner
:实验/挑战只包含同一技能组(Skill Group)中的单个或多个技能,技能很简单。Intermediate
:实验/挑战包含同一技能树(Skill Tree)中的不同技能组的多种技能,技能难度不大。Advanced
:实验/挑战包含来自不同技能树(Skill Tree)的多种技能,而且技能难度较大。
其中,Skill Tree 层级为三级结构: Skill
→ Skill Group
→ Project
。例如:cd
→ Directory Operations
→ Linux
。
下面是一个完整的配置文件示例:
index.json
{
"type": "lab",
"title": "Basic Template",
"description": "The description of basic template",
"difficulty": "Beginner",
"time": 5,
"hidden": false,
"fee_type": "pro",
"details": {
"steps": [
{
"title": "Bananas",
"text": "step1.md",
"verify": [
{
"name": "Check if bananas.txt exists",
"file": "verify1-1.sh",
"hint": "Please create file bananas.txt in /home/labex",
"timeout": 0,
"showstderr": true
},
{
"name": "Check if apples.txt exists",
"file": "verify1-2.sh",
"hint": "Please create apples.txt in /home/labex",
"timeout": 10,
"showstderr": true
}
],
"skills": ["linux/ls", "linux/cd"],
"solutions": ["step1-solution.md", "solution2.py"]
},
{
"title": "Oranges",
"text": "step2.md",
"verify": [
{
"name": "Check if oranges.txt exists",
"file": "verify2.sh",
"hint": "Please create file test.txt in /home/labex",
"timeout": 0,
"showstderr": true
}
],
"skills": ["linux/ls", "linux/cd"],
"solutions": ["step2-solution.md"]
}
],
"intro": {
"text": "intro.md",
"background": "setup.sh"
},
"finish": {
"text": "finish.md"
},
"assets": {
"host01": [
{
"file": "*.txt",
"target": "~/"
}
]
}
},
"backend": {
"imageid": "webide-ubuntu:2004"
},
"contributors": []
}
Was this page helpful?