項(xiàng)目經(jīng)驗(yàn)分享|OpenAtom OpenHarmony 曹天恒:人人都能成為開源項(xiàng)目的貢獻(xiàn)者

開源之夏個人專訪與項(xiàng)目經(jīng)驗(yàn)分享持續(xù)開放中,歡迎已從開源之夏畢業(yè)或正在參與開源之夏活動的學(xué)生、導(dǎo)師一同加入專訪行動,掃描文末二維碼填寫專訪問卷,與大家分享你眼中的開源之夏!
本期項(xiàng)目經(jīng)驗(yàn)分享來自?OpenAtom OpenHarmony?社區(qū)中選學(xué)生——曹天恒,在開源之夏 2023 中承擔(dān)的項(xiàng)目是?三方庫移植——Fuse.js。

#?關(guān)于?OpenAtom OpenHarmony?社區(qū)
OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)孵化及運(yùn)營的開源項(xiàng)目,目標(biāo)是面向全場景、全連接、全智能時代、基于開源的方式,搭建一個智能終端設(shè)備操作系統(tǒng)的框架和平臺,促進(jìn)萬物互聯(lián)產(chǎn)業(yè)的繁榮發(fā)展。
官網(wǎng):https://www.openharmony.cn
# 項(xiàng)目基本信息
項(xiàng)目名稱:三方庫移植——Fuse.js
項(xiàng)目導(dǎo)師:林嘉誠
項(xiàng)目描述:Fuse.js是一款輕量級的JavaScript模糊搜索庫,提供了模糊搜索和搜索排序功能。本項(xiàng)目需要將該庫在移植到OpenHarmony上運(yùn)行,并通過XTS測試和演示demo開發(fā)。
項(xiàng)目鏈接:https://summer-ospp.ac.cn/org/prodetail/23db60280
# 項(xiàng)目開發(fā)經(jīng)驗(yàn)分享
組件移植總體方案

移植三方庫的主要開發(fā)步驟如下:
第一步:下載Fuse.js庫,搭建開發(fā)環(huán)境,在標(biāo)準(zhǔn)Web環(huán)境下引入Fuse.js模塊。閱讀用戶手冊,熟悉庫的結(jié)構(gòu)和使用方式,實(shí)際測試,驗(yàn)證庫的功能。
第二步:將Fuse.js庫源碼引入到OpenHarmony應(yīng)用程序開發(fā)工程中。根據(jù)實(shí)際情況,修改Fuse.js庫源碼內(nèi)容,編寫簡單的用例,排查運(yùn)行錯誤,并進(jìn)行相應(yīng)的兼容性適配,確保Fuse.js庫接口能在OpenHarmony應(yīng)用程序中正常調(diào)用。
第三步:編寫完備的XTS測試用例。需要覆蓋庫的所有接口,編寫完成后實(shí)機(jī)執(zhí)行測試用例,驗(yàn)證庫接口在OpenHarmony上實(shí)現(xiàn)的正確性,最后收集并總結(jié)XTS測試執(zhí)行報告。
第四步:開發(fā)典型接口調(diào)用的演示Demo應(yīng)用程序。其需要包含F(xiàn)use.js主要接口的調(diào)用,可視化展示該庫的實(shí)際應(yīng)用場景,作為使用示例方便給開發(fā)人員上手開發(fā)。
第五步:貢獻(xiàn)移植完成的三方庫,將庫上傳到OHPM和開源倉庫。對移植好的Fuse.js庫進(jìn)行編譯構(gòu)建,生成HAR包,使用OHPM CLI工具發(fā)布。整理代碼規(guī)范,將Demo工程源碼提交到OpenHarmony-TPC下的樣例倉庫。
開發(fā)經(jīng)歷描述
(1)原庫下載與驗(yàn)證
Fuse.js倉庫地址:https://github.com/krisk/Fuse。面向移植需求下載三方庫源碼時,優(yōu)先使用最新正式版,不去下載主分支(通常是master分支)。主分支上的代碼可能處于開發(fā)中,它可能包含尚未完全測試或者不穩(wěn)定的功能,而最新的正式版通常已經(jīng)經(jīng)過充分的測試,相對來說更加穩(wěn)定可靠。這里選擇Fuse.js最新的6.6.2版本進(jìn)行移植。

閱讀Fuse.js官方文檔,了解源碼的結(jié)構(gòu)和使用方式。本次移植主要關(guān)注倉庫的“src”文件夾和“test”文件夾。src文件夾包含項(xiàng)目的主要功能源代碼,是項(xiàng)目的核心部分。test文件夾包含項(xiàng)目的測試用例代碼,測試用例幫助開發(fā)者確保項(xiàng)目的各個部分都按照預(yù)期工作,針對OpenHarmony移植時,同樣要完成測試用例,測試用例的通過是庫移植成功的重要標(biāo)準(zhǔn)。

通過閱讀使用文檔,了解Fuse.js庫搜索接口的簡單使用,為后續(xù)功能移植做準(zhǔn)備。

(2)三方庫源碼引入
新建OpenHarmony API 10 eTS工程,作為Demo的工程;然后建立fusejs模塊,作為被移植三方庫的模塊,將Fuse.js核心代碼(src文件夾)拷貝至庫文件夾目錄,然后根據(jù)庫的實(shí)際情況配置oh-package.json5文件,在Fuse.js中,“/src/entry.js”為庫的入口文件,所以指定加載的入口文件“main”為“./src/entry.js”。配置其余的庫模塊信息。

代碼引入成功后,在工程主頁Index頁面編寫簡單的代碼,使用Fuse庫。然后測試運(yùn)行,發(fā)現(xiàn)應(yīng)用程序主頁不能正常顯示,出現(xiàn)白屏,通過DecEco Studio的Log頁面查看機(jī)器的運(yùn)行日志,發(fā)現(xiàn)運(yùn)行工程中找不到process.env.NODE_ENV和process.env.EXTENDED_SEARCH_ENABLED變量。

為了盡量減少對源庫代碼的侵入式修改,采用定義全局變量的方式進(jìn)行適配。

適配完成后再次排查,確定庫基本功能正常使用。

(3)XTS測試用例編寫
測試用例的編寫可參考原庫的測試用例進(jìn)行移植。原庫的測試用例存在于test文件夾中,其使用了Jest測試框架,Jest是JavaScript項(xiàng)目流行的測試框架。
將Jest測試用例移植到OpenHarmony操作系統(tǒng)需要將原測試用例轉(zhuǎn)換成OpenHarmony自動化測試框架arkXtest的測試用例。庫的測試用例存放至工程項(xiàng)目的ohosTest文件夾下。

在本次移植中,Jest測試框架斷言與OpenHarmony XTS框架對應(yīng)的實(shí)現(xiàn)方式如下表:

將測試用例全部移植完成,本次移植涉及7個測試文件、全部功能接口和搜索選項(xiàng)、近3000行代碼,針對實(shí)機(jī)進(jìn)行單元測試,發(fā)現(xiàn)其中的不符合預(yù)期的功能接口,針對性進(jìn)行調(diào)試適配,確保功能可用。最后整理測試報告TESE.md文件,列明測試用例涉及的接口和實(shí)機(jī)測試結(jié)果。

(4)Demo演示程序開發(fā)
Demo應(yīng)用程序包含了該庫使用的范例,是開發(fā)者快速上手使用三方庫的基礎(chǔ)。在本次移植中設(shè)計了一個通過書名和作者名稱搜索書籍的Demo應(yīng)用程序,應(yīng)用程序的主頁(Index.ets)結(jié)構(gòu)設(shè)計為NavigationMenus、NavigationTitle、Search、List組件的結(jié)合,List組件綁定搜索結(jié)果變量,當(dāng)用戶在Search組件輸入相關(guān)內(nèi)容時,通過onChange函數(shù)執(zhí)行Fuse對象的搜索方法,更新搜索結(jié)果至result變量,更新搜索的展示列表。

再為Demo程序添加一個添加設(shè)置(settings.ets)頁面,因Fuse.js庫支持豐富的搜索配置選項(xiàng),開發(fā)人員可以根據(jù)實(shí)際業(yè)務(wù)設(shè)定搜索選項(xiàng),對海量數(shù)據(jù)進(jìn)行搜索。

(5)三方庫與Demo示例源碼上傳
三方庫移植成功之后,需要將三方庫貢獻(xiàn)到OpenHarmony中心倉,方便開發(fā)人員引用并直接使用;也可以將移植后的庫代碼和Demo樣例貢獻(xiàn)到開源倉庫,給其他開發(fā)人員提供明確易讀的使用文檔和使用樣例,并吸引開發(fā)人員積極參與到開源項(xiàng)目中,促進(jìn)應(yīng)用生態(tài)發(fā)展。
貢獻(xiàn)三方庫之前首先要準(zhǔn)備好代碼,確保移植后的代碼遵守OpenHarmony社區(qū)代碼規(guī)范[1]。
OHPM(OpenHarmony Package Manager)是OpenHarmony三方庫的管理工具和倉庫。

貢獻(xiàn)前需要組織好源代碼的項(xiàng)目結(jié)構(gòu),符合三方庫的貢獻(xiàn)規(guī)范,代碼目錄結(jié)構(gòu)示例如下:

貢獻(xiàn)前需要組織好源代碼的項(xiàng)目結(jié)構(gòu),符合三方庫的貢獻(xiàn)規(guī)范,代碼目錄結(jié)構(gòu)示例如下:
然后將fusejs模塊編譯成har包,使用OHPM-CLI工具包將三方庫貢獻(xiàn)到OpenHarmony三方庫中心倉。中心倉貢獻(xiàn)的具體步驟可參考OHPM官方文檔[2]。
之后將移植好的三方庫源碼和Demo樣例源碼貢獻(xiàn)到自己的私有倉庫[3],然后向OpenHarmony-TPC倉庫[4]提交Pull Request,收錄移植好的組件源碼。其中提交PR的流程可參考三方庫提交官方文檔[5]。
成果展示
三方庫核心測試用例全部通過:
根據(jù)原庫移植了大量單元測試用例,目前通過了59個核心測試用例,涵蓋了庫的所有接口,保證了庫接口可用。

將移植后的Fuse.js庫上架OHPM倉庫:
根據(jù)三方庫上架規(guī)范整理三方庫的文檔和目錄規(guī)范,經(jīng)過開放原子基金會專家審核,成功上架OHPM倉庫[6]。

Demo程序開發(fā):
演示GIF如下。

移植庫源代碼開源:
將移植后庫的源代碼及Demo程序開源,貢獻(xiàn)到OpenHarmony-TPC索引倉庫[4]。

實(shí)機(jī)運(yùn)行驗(yàn)證:
在DAYU200開發(fā)板上成功驗(yàn)證運(yùn)行Demo程序。?

OpenHarmony開發(fā)工具問題反饋:?
由于原庫測試用例中包含大量的嵌套(describe)測試,但是在移植過程中發(fā)現(xiàn)DevEco Studio并不能正確執(zhí)行,將此問題提交工單提交反饋給華為官方,協(xié)助定位問題,收到回復(fù)預(yù)計在830版本修復(fù)支持。

后續(xù)工作安排
截至DevEco Studio 4.0 Beta2:Build Version: 4.0.0.400, built on August 2, 2023,DevEco Studio并未完美支持測試中嵌套describe的情況,但原庫測試用例中包含大量的嵌套測試,所以先暫時選取典型的核心用例進(jìn)行移植并展開,以進(jìn)行接口測試,保證接口可用性,其余嵌套會自動忽略執(zhí)行,后續(xù)待DevEco Studio嵌套測試問題修復(fù)完成,完善移植原庫的所有嵌套測試用例。
# 開源之夏個人隨訪
--參與開源之夏和開源--
OSPP:請簡單介紹一下自己。
曹天恒:我叫曹天恒,是中國科學(xué)院大學(xué)一名軟件工程專業(yè)在讀學(xué)生,目前在中國科學(xué)院軟件研究所智能軟件研究中心OSIT團(tuán)隊(duì)實(shí)習(xí)。
OSPP:你最開始是如何了解到并決定參與開源之夏活動的?
曹天恒:我首先是在研二實(shí)習(xí)期間參與了一個OpenHarmony即時通訊軟件項(xiàng)目的開發(fā),以此為機(jī)會,初步對OpenHarmony操作系統(tǒng)和其應(yīng)用開發(fā)相關(guān)知識有了一些了解。在開發(fā)過程中,我發(fā)現(xiàn)OpenHarmony是一個發(fā)展迅速的操作系統(tǒng),現(xiàn)在它已經(jīng)發(fā)行了4.0的Beta2版本,但因其是一個新興的生態(tài),相較于市面上已經(jīng)很成熟的其他操作系統(tǒng)(例如Android、iOS),OpenHarmony仍然面臨第三方生態(tài)薄弱的問題。后來在軟件研究所老師的一次活動分享中了解到了開源之夏活動,發(fā)現(xiàn)OpenHarmony社區(qū)也在其中發(fā)布了任務(wù),是多個三方庫組件的移植的需求,因此我選擇參與其中,希望能夠鍛煉自己的工程能力,并為OpenHarmony操作系統(tǒng)移植一些優(yōu)秀的三方庫,讓更多開發(fā)者更方便地參與到OpenHarmony應(yīng)用開發(fā)中來。
OSPP:參與開源之夏有為你帶來哪些提升與幫助么?
曹天恒:開源之夏活動極大地豐富了我的經(jīng)歷,通過這次機(jī)會,我第一次與華為公司的開發(fā)人員有了技術(shù)上的交流,甚至獲得了內(nèi)推簡歷的機(jī)會。我也從零開始學(xué)習(xí)了向OpenHarmony移植組件的整個過程,了解了被大量開發(fā)者使用的三方庫組件是如何開發(fā)的,同時也學(xué)到了開源項(xiàng)目的貢獻(xiàn)流程。此外,本次活動我選擇移植的組件是Fuse.js,它是一個擁有16.6k Star的一個流行JavaScript項(xiàng)目,特點(diǎn)是輕巧、強(qiáng)大且零依賴,移植過程中我也對這類流行項(xiàng)目的結(jié)構(gòu)有了一些了解,驚嘆于作者良好的編程規(guī)范,這些都是我獲得的寶貴經(jīng)驗(yàn)。
--參與開源社區(qū)--
OSPP:請分享一下你眼中的 OpenAtom OpenHarmony 社區(qū)吧
曹天恒:OpenHarmony是一個非常開放且活躍的社區(qū),Gitee上的代碼有華為、深開鴻、潤和軟件等公司的開發(fā)人員參與貢獻(xiàn),每個月都有新的功能特性合入主干分支,也有經(jīng)常有設(shè)備通過OpenHarmony設(shè)備兼容性測評;OpenHarmony社區(qū)經(jīng)常舉辦活動和演講,有很多在線的直播技術(shù)分享、比賽活動和SIG興趣小組,為各界的開發(fā)人員提供了良好的交流機(jī)會,我在實(shí)習(xí)期間也參與過其中。在我移植開發(fā)的三方庫的過程中,開放原子開源基金會和華為的工作人員都非常熱情,問題交流和工作執(zhí)行效率都很高,期間我們有一個群組交流移植、審核的各種問題,即使我是個學(xué)生小白,各位老師也會很耐心地幫助我解決問題,我很喜歡這樣的氛圍,在這里我也要感謝各位老師的付出,老師們的幫助和指導(dǎo)是我順利完成本次活動的強(qiáng)大后盾。
OSPP:參與開源之夏活動以后讓你對開源或開源社區(qū)有什么新的理解與認(rèn)識么?
曹天恒:在參與開源之夏活動之前,我一直認(rèn)為參與開源項(xiàng)目和普通開發(fā)者相距遙遠(yuǎn),龐大且專業(yè)的項(xiàng)目會限制開發(fā)人員參與的門檻,但當(dāng)我真正參與到其中,開始認(rèn)真了解一個開源項(xiàng)目的結(jié)構(gòu)和貢獻(xiàn)方式,發(fā)現(xiàn)其實(shí)任何項(xiàng)目的代碼都是在一點(diǎn)一滴完善的過程中的,項(xiàng)目的Issues列表可能包含了許多用戶和開發(fā)者對項(xiàng)目的期望,項(xiàng)目貢獻(xiàn)者其實(shí)也忙的不可開交,他們是非常希望能有更多的人參與到項(xiàng)目貢獻(xiàn)中來的。“開源”本身就代表著平等開放意識和勇敢的精神,只要開發(fā)人員明確項(xiàng)目需求、認(rèn)真了解相關(guān)代碼、遵守開源規(guī)范,人人都有機(jī)會成為開源項(xiàng)目的貢獻(xiàn)者。
OSPP:你覺得高校學(xué)生或者開源新手如何有效尋找適合自己的開源項(xiàng)目、參與開源社區(qū)呢?
曹天恒:尋找開源項(xiàng)目時,我認(rèn)為可以根據(jù)自身興趣、熟悉的技能或者個人發(fā)展方向來做出選擇。例如,可以利用開源之夏項(xiàng)目申請頁面的篩選功能,篩選自己熟悉的語言,申請與自己技術(shù)棧相關(guān)的項(xiàng)目,使自己在申請中更有優(yōu)勢;或者選擇自己所感興趣的領(lǐng)域或社區(qū),查看相關(guān)的項(xiàng)目,順應(yīng)自己的興趣,我就是直接搜索了OpenHarmony,發(fā)現(xiàn)了社區(qū)公布的任務(wù);也可以根據(jù)自已的成長規(guī)劃,搜尋相關(guān)的開源項(xiàng)目,在實(shí)踐中增長技能,督促自己進(jìn)步。
--寄語--
OSPP:你會推薦高校學(xué)生參與開源與相關(guān)的開源活動么?為什么?
曹天恒:我非常推薦高校學(xué)生參與開源與開源相關(guān)的活動,因?yàn)樗且粋€難得的機(jī)會。通過開源活動,不僅能獲得技術(shù)上的提升,還能夠獲得與大廠或頂級開源社區(qū)開發(fā)人員交流的機(jī)會,獲得開源經(jīng)歷,為簡歷增色。
OSPP:有什么話想對打算參加開源之夏活動的學(xué)弟學(xué)妹們說?
曹天恒:首先是要提早準(zhǔn)備,抓住機(jī)會。開源之夏活動提供的項(xiàng)目涵蓋范圍很廣,參與的頂級社區(qū)非常多,涉及的項(xiàng)目也很有挑戰(zhàn)性,每年有不少名校或技術(shù)很強(qiáng)的學(xué)生參與申請,因此項(xiàng)目的申請很激烈。申請項(xiàng)目前需要對需求有明確的了解,并且盡量找機(jī)會向?qū)熃涣髯约旱膶?shí)現(xiàn)方案,展示出自己完成項(xiàng)目的決心和技術(shù)能力,更好地在項(xiàng)目申請的環(huán)節(jié)脫穎而出。其次是敢于交流,不恥下問。參與開源之夏活動的群體目前還都是學(xué)生,開發(fā)經(jīng)驗(yàn)相對較少,對實(shí)際問題的了解可能沒有那么深刻,開源之夏活動性質(zhì)本身就是給學(xué)生們一個參與開源的機(jī)會,項(xiàng)目的導(dǎo)師也了解這一點(diǎn),因此只要不是低級的問題,導(dǎo)師一定會認(rèn)真解答。在開放、包容的氛圍中,學(xué)弟學(xué)妹們可以大膽地提出問題,積極參與討論,共同進(jìn)步,從而更好地融入開源社區(qū),提升自己的技術(shù)能力和團(tuán)隊(duì)合作能力。
END
專欄編輯:大夢
校對:校大山、曹天恒
制圖:GoodWhite

[1] OpenHarmony社區(qū)代碼規(guī)范: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

專欄投稿請聯(lián)系開源小助手:kaiyuanzhixia 或?qū)诰庉嫞篐ungryfish34(備注“專欄投稿”加速通過),或填寫下方專訪信息收集問卷。
