本章意在介绍 DADK ——— 一个用于开发 DragonOS 应用的工具包,同时通过学习使用 dadk 控制台来创建配置文件。
DADK 是一个用于开发DragonOS应用的工具包,设计目的是为了让开发者能够更加方便的开发DragonOS应用。
DADK 使用(任务名,任务版本)来标识每个构建目标。当使用 DADK 构建 DragonOS 应用时,DADK 会根据用户的配置文件,自动完成以下工作:
解析配置文件,生成 DADK 任务列表 根据 DADK 任务列表,进行拓扑排序。这一步会自动处理软件库的依赖关系。 收集环境变量信息,并根据 DADK 任务列表,设置全局环境变量、任务环境变量。 根据拓扑排序后的 DADK 任务列表,自动执行任务。 DADK 与环境变量 环境变量的设置是 DADK 能正常工作的关键因素之一,您可以在您的编译脚本中,通过引用环境变量,来获得其他软件库的编译信息。 这是使得您的应用能够自动依赖其他软件库的关键一步。
只要您的编译脚本能够正确地引用环境变量,DADK就能够自动处理软件库的依赖关系。
DADK会设置以下全局环境变量:
DADK_CACHE_ROOT:DADK
的缓存根目录。您可以在编译脚本中,通过引用该环境变量,来获得 DADK 的缓存根目录。
DADK_BUILD_CACHE_DIR_任务名_任务版本
:DADK 的任务构建结果缓存目录。当您要引用其他软件库的构建结果时,可以通过该环境变量来获得。 同时,您也要在构建您的app时,把构建结果放到您的软件库的构建结果缓存目录(通过对应的环境变量获得)中。
DADK_SOURCE_CACHE_DIR_任务名_任务版本
:DADK 的某个任务的源码目录。当您要引用其他软件库的源码目录时,可以通过该环境变量来获得。
同时,DADK会为每个任务设置其自身在配置文件中指定的环境变量。
全局环境变量命名格式 全局环境变量中的任务名和任务版本,都会被转换为大写字母,并对特殊字符进行替换。替换表如下:
举例:对于任务libc-0.1.0,其构建结果的全局环境变量名为DADK_BUILD_CACHE_DIR_LIBC_0_1_0。
DADK 的最新版本为 v0.1.2,可前往 https://github.com/DragonOS-Community/DADK 中下载。
DADK 的基本组件位于 /DADK-0.1.2/src/console/elements.rs 中,在运行控制台之前,需要对其基本组件进行补全,实现相关功能,实现过程中请参考已实现函数的相关代码和注释。
练习1:实现位于/DADK-0.1.2/src/console/elements.rs中列表选择器的 choose。
/// # 读取用户的选择
/// ## 返回值
/// * `Ok(String)` - 用户选择的选项的 ID
/// * `Err(ConsoleError)` - 用户输入的不是一个数字,或者数字不在选项列表的范围内
pub fn choose(&self) -> Result<String, ConsoleError> {
println!("");
if let Some(first_line_tips) = &self.first_line_tips {
println!("{}", first_line_tips);
}
for item in self.items.iter().enumerate() {
println!("\t{}. {}", item.0 + 1, item.1.description);
}
println!("");
let input_tips = format!("Please input your choice:");
let post_tips = format!("(1-{})", self.items.len());
// 读取输出
// LAB TODO BEGIN
// LAB TODO END
return self.parse_input(input);
}
练习2:实现位于/DADK-0.1.2/src/console/elements.rs中的 parse_input。
/// # 解析用户的输入
/// 用户的输入必须是一个数字,且在选项列表的范围内.
/// ## 参数
/// * `input` - 用户的输入
/// ## 返回值
/// * `Ok(String)` - 用户选择的选项的 ID
/// * `Err(ConsoleError::InvalidInput(e))` - 用户的输入不合法
fn parse_input(&self, input: String) -> Result<String, ConsoleError> {
// 解析输入
// LAB TODO BEGIN
// LAB TODO END
if input < 1 || input > self.items.len() {
return Err(ConsoleError::InvalidInput(format!(
"Invalid input: {}, please input a number between 1 and {}",
input,
self.items.len()
)));
}
Ok(self.items[input - 1].id.clone())
}
当补充完相关代码后,我们便可以运行DADK。
cargo run
会显示如下内容:
这样,DADK就可以启动了
dadk new
在我们开发应用程序的时候,可以手动创建编写 dadk 配置文件,也可以直接使用 DADK控制台。
使用命令dadk new
启动控制台
按照提示输入任务的名称、版本号、描述
Please input the [name] of the task: >> my_test
Please input the [version] of the task: >> 0.1.0
Please input the [description] of the task: >> testing dadk console
接着会提示你选择任务类型,可以选择新建和从预构建安装,这里我们选择 1
Please choose the [type] of the task:
1. Build from source
2. Install from prebuilt
Please input your choice: >> (1-2):
提示选择代码来源,可以根据开发选择
Please choose the [code source] of the task:
1. Build from git repository
2. Build from local directory
3. Build from archive file
Please input your choice: >> (1-3)
设置软件库依赖,若没有可输入no
Please input the [dependencies] of the task:
Please one or more items.
Input more? >> (yes/no)
因为我们是使用 DADK 构建 DragonOS应用,依赖于 relibc 开发,版本号 0.1.0
Please input the [dependencies] of the task:
Please input the [name] of the dependency: >> relibc
Please input the [version] of the dependency: >> 0.1.0
最后,按照以下输入
Note:
1. The command will be executed in the root directory of the source code.
2. After the command is executed, all files need to install to DragonOS should be placed in: [DADK_BUILD_CACHE_DIR_TASKNAME_VERSION]
Build Command: >> make
Please input the [install_config] of the task:
Please input the [dir to install in DragonOS] of the task: >> /bin
Please configure the [clean_config] of the task:
Please input the [clean command] of the task: >> make clean
这样,我们就完成了应用程序的配置文件