欢迎光临散文网 会员登陆 & 注册

项目经验分享|OpenAtom OpenHarmony 曹天恒:人人都能成为开源项目的贡献者

2023-10-09 16:43 作者:开源之夏  | 我要投稿


开源之夏个人专访与项目经验分享持续开放中,欢迎已从开源之夏毕业或正在参与开源之夏活动的学生、导师一同加入专访行动,扫描文末二维码填写专访问卷,与大家分享你眼中的开源之夏!

本期项目经验分享来自 OpenAtom OpenHarmony 社区中选学生——曹天恒,在开源之夏 2023 中承担的项目是 三方库移植——Fuse.js。

# 关于 OpenAtom OpenHarmony 社区

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。

官网:https://www.openharmony.cn


# 项目基本信息

项目名称:三方库移植——Fuse.js

项目导师:林嘉诚

项目描述:Fuse.js是一款轻量级的JavaScript模糊搜索库,提供了模糊搜索和搜索排序功能。本项目需要将该库在移植到OpenHarmony上运行,并通过XTS测试和演示demo开发。

项目链接:https://summer-ospp.ac.cn/org/prodetail/23db60280


# 项目开发经验分享

组件移植总体方案

移植三方库的主要开发步骤如下:

第一步:下载Fuse.js库,搭建开发环境,在标准Web环境下引入Fuse.js模块。阅读用户手册,熟悉库的结构和使用方式,实际测试,验证库的功能。

第二步:将Fuse.js库源码引入到OpenHarmony应用程序开发工程中。根据实际情况,修改Fuse.js库源码内容,编写简单的用例,排查运行错误,并进行相应的兼容性适配,确保Fuse.js库接口能在OpenHarmony应用程序中正常调用。

第三步:编写完备的XTS测试用例。需要覆盖库的所有接口,编写完成后实机执行测试用例,验证库接口在OpenHarmony上实现的正确性,最后收集并总结XTS测试执行报告。

第四步:开发典型接口调用的演示Demo应用程序。其需要包含Fuse.js主要接口的调用,可视化展示该库的实际应用场景,作为使用示例方便给开发人员上手开发。

第五步:贡献移植完成的三方库,将库上传到OHPM和开源仓库。对移植好的Fuse.js库进行编译构建,生成HAR包,使用OHPM CLI工具发布。整理代码规范,将Demo工程源码提交到OpenHarmony-TPC下的样例仓库。

开发经历描述

(1)原库下载与验证

Fuse.js仓库地址:https://github.com/krisk/Fuse。面向移植需求下载三方库源码时,优先使用最新正式版,不去下载主分支(通常是master分支)。主分支上的代码可能处于开发中,它可能包含尚未完全测试或者不稳定的功能,而最新的正式版通常已经经过充分的测试,相对来说更加稳定可靠。这里选择Fuse.js最新的6.6.2版本进行移植。

阅读Fuse.js官方文档,了解源码的结构和使用方式。本次移植主要关注仓库的“src”文件夹和“test”文件夹。src文件夹包含项目的主要功能源代码,是项目的核心部分。test文件夹包含项目的测试用例代码,测试用例帮助开发者确保项目的各个部分都按照预期工作,针对OpenHarmony移植时,同样要完成测试用例,测试用例的通过是库移植成功的重要标准。

通过阅读使用文档,了解Fuse.js库搜索接口的简单使用,为后续功能移植做准备。

(2)三方库源码引入

新建OpenHarmony API 10 eTS工程,作为Demo的工程;然后建立fusejs模块,作为被移植三方库的模块,将Fuse.js核心代码(src文件夹)拷贝至库文件夹目录,然后根据库的实际情况配置oh-package.json5文件,在Fuse.js中,“/src/entry.js”为库的入口文件,所以指定加载的入口文件“main”为“./src/entry.js”。配置其余的库模块信息。

代码引入成功后,在工程主页Index页面编写简单的代码,使用Fuse库。然后测试运行,发现应用程序主页不能正常显示,出现白屏,通过DecEco Studio的Log页面查看机器的运行日志,发现运行工程中找不到process.env.NODE_ENV和process.env.EXTENDED_SEARCH_ENABLED变量。

为了尽量减少对源库代码的侵入式修改,采用定义全局变量的方式进行适配。

适配完成后再次排查,确定库基本功能正常使用。

(3)XTS测试用例编写

测试用例的编写可参考原库的测试用例进行移植。原库的测试用例存在于test文件夹中,其使用了Jest测试框架,Jest是JavaScript项目流行的测试框架。

将Jest测试用例移植到OpenHarmony操作系统需要将原测试用例转换成OpenHarmony自动化测试框架arkXtest的测试用例。库的测试用例存放至工程项目的ohosTest文件夹下。

在本次移植中,Jest测试框架断言与OpenHarmony XTS框架对应的实现方式如下表:

将测试用例全部移植完成,本次移植涉及7个测试文件、全部功能接口和搜索选项、近3000行代码,针对实机进行单元测试,发现其中的不符合预期的功能接口,针对性进行调试适配,确保功能可用。最后整理测试报告TESE.md文件,列明测试用例涉及的接口和实机测试结果。

(4)Demo演示程序开发

Demo应用程序包含了该库使用的范例,是开发者快速上手使用三方库的基础。在本次移植中设计了一个通过书名和作者名称搜索书籍的Demo应用程序,应用程序的主页(Index.ets)结构设计为NavigationMenus、NavigationTitle、Search、List组件的结合,List组件绑定搜索结果变量,当用户在Search组件输入相关内容时,通过onChange函数执行Fuse对象的搜索方法,更新搜索结果至result变量,更新搜索的展示列表。


再为Demo程序添加一个添加设置(settings.ets)页面,因Fuse.js库支持丰富的搜索配置选项,开发人员可以根据实际业务设定搜索选项,对海量数据进行搜索。

(5)三方库与Demo示例源码上传

三方库移植成功之后,需要将三方库贡献到OpenHarmony中心仓,方便开发人员引用并直接使用;也可以将移植后的库代码和Demo样例贡献到开源仓库,给其他开发人员提供明确易读的使用文档和使用样例,并吸引开发人员积极参与到开源项目中,促进应用生态发展。

贡献三方库之前首先要准备好代码,确保移植后的代码遵守OpenHarmony社区代码规范[1]

OHPM(OpenHarmony Package Manager)是OpenHarmony三方库的管理工具和仓库。

贡献前需要组织好源代码的项目结构,符合三方库的贡献规范,代码目录结构示例如下:

贡献前需要组织好源代码的项目结构,符合三方库的贡献规范,代码目录结构示例如下:

然后将fusejs模块编译成har包,使用OHPM-CLI工具包将三方库贡献到OpenHarmony三方库中心仓。中心仓贡献的具体步骤可参考OHPM官方文档[2]

之后将移植好的三方库源码和Demo样例源码贡献到自己的私有仓库[3],然后向OpenHarmony-TPC仓库[4]提交Pull Request,收录移植好的组件源码。其中提交PR的流程可参考三方库提交官方文档[5]

成果展示

三方库核心测试用例全部通过:

根据原库移植了大量单元测试用例,目前通过了59个核心测试用例,涵盖了库的所有接口,保证了库接口可用。

将移植后的Fuse.js库上架OHPM仓库:

根据三方库上架规范整理三方库的文档和目录规范,经过开放原子基金会专家审核,成功上架OHPM仓库[6]

Demo程序开发:

演示GIF如下。

移植库源代码开源:

将移植后库的源代码及Demo程序开源,贡献到OpenHarmony-TPC索引仓库[4]

实机运行验证:

在DAYU200开发板上成功验证运行Demo程序。 

OpenHarmony开发工具问题反馈: 

由于原库测试用例中包含大量的嵌套(describe)测试,但是在移植过程中发现DevEco Studio并不能正确执行,将此问题提交工单提交反馈给华为官方,协助定位问题,收到回复预计在830版本修复支持。

后续工作安排

截至DevEco Studio 4.0 Beta2:Build Version: 4.0.0.400, built on August 2, 2023,DevEco Studio并未完美支持测试中嵌套describe的情况,但原库测试用例中包含大量的嵌套测试,所以先暂时选取典型的核心用例进行移植并展开,以进行接口测试,保证接口可用性,其余嵌套会自动忽略执行,后续待DevEco Studio嵌套测试问题修复完成,完善移植原库的所有嵌套测试用例。


# 开源之夏个人随访

--参与开源之夏和开源--

OSPP请简单介绍一下自己。

曹天恒我叫曹天恒,是中国科学院大学一名软件工程专业在读学生,目前在中国科学院软件研究所智能软件研究中心OSIT团队实习。

OSPP你最开始是如何了解到并决定参与开源之夏活动的?

曹天恒我首先是在研二实习期间参与了一个OpenHarmony即时通讯软件项目的开发,以此为机会,初步对OpenHarmony操作系统和其应用开发相关知识有了一些了解。在开发过程中,我发现OpenHarmony是一个发展迅速的操作系统,现在它已经发行了4.0的Beta2版本,但因其是一个新兴的生态,相较于市面上已经很成熟的其他操作系统(例如Android、iOS),OpenHarmony仍然面临第三方生态薄弱的问题。后来在软件研究所老师的一次活动分享中了解到了开源之夏活动,发现OpenHarmony社区也在其中发布了任务,是多个三方库组件的移植的需求,因此我选择参与其中,希望能够锻炼自己的工程能力,并为OpenHarmony操作系统移植一些优秀的三方库,让更多开发者更方便地参与到OpenHarmony应用开发中来。

OSPP参与开源之夏有为你带来哪些提升与帮助么?

曹天恒开源之夏活动极大地丰富了我的经历,通过这次机会,我第一次与华为公司的开发人员有了技术上的交流,甚至获得了内推简历的机会。我也从零开始学习了向OpenHarmony移植组件的整个过程,了解了被大量开发者使用的三方库组件是如何开发的,同时也学到了开源项目的贡献流程。此外,本次活动我选择移植的组件是Fuse.js,它是一个拥有16.6k Star的一个流行JavaScript项目,特点是轻巧、强大且零依赖,移植过程中我也对这类流行项目的结构有了一些了解,惊叹于作者良好的编程规范,这些都是我获得的宝贵经验。

--参与开源社区--

OSPP请分享一下你眼中的 OpenAtom OpenHarmony 社区吧

曹天恒OpenHarmony是一个非常开放且活跃的社区,Gitee上的代码有华为、深开鸿、润和软件等公司的开发人员参与贡献,每个月都有新的功能特性合入主干分支,也有经常有设备通过OpenHarmony设备兼容性测评;OpenHarmony社区经常举办活动和演讲,有很多在线的直播技术分享、比赛活动和SIG兴趣小组,为各界的开发人员提供了良好的交流机会,我在实习期间也参与过其中。在我移植开发的三方库的过程中,开放原子开源基金会和华为的工作人员都非常热情,问题交流和工作执行效率都很高,期间我们有一个群组交流移植、审核的各种问题,即使我是个学生小白,各位老师也会很耐心地帮助我解决问题,我很喜欢这样的氛围,在这里我也要感谢各位老师的付出,老师们的帮助和指导是我顺利完成本次活动的强大后盾。

OSPP参与开源之夏活动以后让你对开源或开源社区有什么新的理解与认识么?

曹天恒在参与开源之夏活动之前,我一直认为参与开源项目和普通开发者相距遥远,庞大且专业的项目会限制开发人员参与的门槛,但当我真正参与到其中,开始认真了解一个开源项目的结构和贡献方式,发现其实任何项目的代码都是在一点一滴完善的过程中的,项目的Issues列表可能包含了许多用户和开发者对项目的期望,项目贡献者其实也忙的不可开交,他们是非常希望能有更多的人参与到项目贡献中来的。“开源”本身就代表着平等开放意识和勇敢的精神,只要开发人员明确项目需求、认真了解相关代码、遵守开源规范,人人都有机会成为开源项目的贡献者

OSPP你觉得高校学生或者开源新手如何有效寻找适合自己的开源项目、参与开源社区呢?

曹天恒寻找开源项目时,我认为可以根据自身兴趣、熟悉的技能或者个人发展方向来做出选择。例如,可以利用开源之夏项目申请页面的筛选功能,筛选自己熟悉的语言,申请与自己技术栈相关的项目,使自己在申请中更有优势;或者选择自己所感兴趣的领域或社区,查看相关的项目,顺应自己的兴趣,我就是直接搜索了OpenHarmony,发现了社区公布的任务;也可以根据自已的成长规划,搜寻相关的开源项目,在实践中增长技能,督促自己进步。

--寄语--

OSPP你会推荐高校学生参与开源与相关的开源活动么?为什么?

曹天恒我非常推荐高校学生参与开源与开源相关的活动,因为它是一个难得的机会。通过开源活动,不仅能获得技术上的提升,还能够获得与大厂或顶级开源社区开发人员交流的机会,获得开源经历,为简历增色。

OSPP有什么话想对打算参加开源之夏活动的学弟学妹们说?

曹天恒首先是要提早准备,抓住机会。开源之夏活动提供的项目涵盖范围很广,参与的顶级社区非常多,涉及的项目也很有挑战性,每年有不少名校或技术很强的学生参与申请,因此项目的申请很激烈。申请项目前需要对需求有明确的了解,并且尽量找机会向导师交流自己的实现方案,展示出自己完成项目的决心和技术能力,更好地在项目申请的环节脱颖而出。其次是敢于交流,不耻下问。参与开源之夏活动的群体目前还都是学生,开发经验相对较少,对实际问题的了解可能没有那么深刻,开源之夏活动性质本身就是给学生们一个参与开源的机会,项目的导师也了解这一点,因此只要不是低级的问题,导师一定会认真解答。在开放、包容的氛围中,学弟学妹们可以大胆地提出问题,积极参与讨论,共同进步,从而更好地融入开源社区,提升自己的技术能力和团队合作能力。

END

专栏编辑:大梦

校对:校大山、曹天恒

制图:GoodWhite

[1] OpenHarmony社区代码规范:https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81.md

[2] OHPM官方文档:https://ohpm.openharmony.cn/#/cn/help/createfile

[3] 本例移植的源码仓库:https://gitee.com/pommejason/isrc_fuse.js

[4] OpenHarmony-TPC仓库:https://gitee.com/openharmony-tpc/tpc_resource

[5] 三方库提交官方文档:https://gitee.com/openharmony-tpc/tpc_resource/blob/master/OpenHarmony%E4%B8%89%E6%96%B9%E5%BA%93gitee%E6%8F%90%E4%BA%A4PR%E6%8C%87%E5%AF%BC-%E7%AE%80%E6%98%93%E7%89%88.md#openharmony%E4%B8%89%E6%96%B9%E5%BA%93gitee%E6%8F%90%E4%BA%A4pr%E6%8C%87%E5%AF%BC

[6] OHPM仓库地址:https://ohpm.openharmony.cn/#/cn/detail/@isrc%2Ffuse.js

专栏投稿请联系开源小助手:kaiyuanzhixia 或专栏编辑:Hungryfish34(备注“专栏投稿”加速通过),或填写下方专访信息收集问卷。



项目经验分享|OpenAtom OpenHarmony 曹天恒:人人都能成为开源项目的贡献者的评论 (共 条)

分享到微博请遵守国家法律