前言
本文章純粹是個人對於一個新手如何在有一定基礎的情況下開始看自己的第一個開源專案做一定的解析。所以選用的是技術架構並不難的專案,對於新手來說也更加友好,純屬分享希望對於已經有一定程式碼基礎的小夥伴們有用!
1.理解開源
1.1.什麼是開源?
一般來說,如果提及開源,人們首先想到的是,把程式碼公開出去,例如放到GitHub
上。以下詳細來聊聊開源這個概念的內含和外延,來快速的瞭解關於開源的概念以及延伸,關於開源的最權威解釋可以參考 https://opensource.org ,這個網站是開源思想誕生的地方。而在國內也同樣有 開源中國這樣的開源網站
國內外開源社群推薦:開源中國、ChinaUnix、GitHub、Apache、SourceForge、
1.2.開源的定義
先來給開源一個定義,一個軟體是開源的,最基本的含義是程式碼是公開的,任何人都可以去檢視,修改以及使用。
首先,開原始碼和閉原始碼非常不同。閉原始碼就是普通的商業版權軟體,程式碼是封閉的,只有作者才能看到,出了問題也只有他能修改。而開原始碼,任何人都可以檢視和修改。關於開源思想的誕生,有一個很有意思的故事。Richard Stallman
是有史以來最偉大的幾名黑客之一,也是世界上寫程式碼最多的人之一,他曾經買過一個商業軟體,結果有一點小問題,於是他去找軟體公司,問他們能不能幫忙修復一下,軟體公司說不行,Richard 於是說,那能不能把程式碼給我,我來修復一下,公司也說不行。於是 Richard Stallman 很生氣,創立了自由軟體基金會,釋出了大名鼎鼎的 GPL 協議,GPL 至今為止依然是最著名的開源協議。
第二點需要特別注意的是,開源不等於免費。軟體程式碼雖然可以免費給別人,但是軟體相關的服務,例如編譯維護升級等,一樣可以賺錢,例如 Redhat 就是家開源軟體公司,不僅僅賺錢,而且很賺錢。同時,很多公司有把越來越多的開發者投入到公司的開源專案中,這些軟體可以有力的支撐起公司的生態,所以如果你是一個開源軟體開發者,也不用擔心找不到工作。
1.2.1.開源軟體優點
優點 | 說明 |
---|---|
低風險 | 使用閉源軟體無疑是把命運交給他人,一旦封閉的原始碼沒有人來維護,你將進退維谷;而且相較於商業軟體公司,開源社群很少存在倒閉的問題。 |
高品質 | 相較於閉源軟體產品,開源專案通常是由開源社群來研發及維護的,參與編寫、維護、測試的使用者量眾多,一般的 bug 還沒有等爆發就已經被修補。 |
低成本 | 開源工作者都是在幕後默默且無償地付出勞動成果,為美好的世界貢獻一份力量,因此使用開源社群推動的軟體專案可以節省大量的人力、物力和財力。 |
更透明 | 沒有哪個笨蛋會把木馬、後門等放到開放的原始碼中,這樣無疑是把自己的罪行暴露在陽光之下。 |
1.2.2.經典開源軟體案例
軟體 | 說明 |
---|---|
Linux | Linux 是一款開源的作業系統,它的核心由多名極客共同維護。Linux 是開源軟體的經典之作、代表之作、巔峰之作。 |
Apache | 世界使用排名第一的 Web 伺服器軟體。 |
MySQL | 世界上最流行的關係型資料庫,適合中小型網站。 |
Firefox | 火狐瀏覽器。在 Chrome 推出之前,Firefox 幾乎是最快速的瀏覽器,直到現在也是 Web 開發人員的除錯利器。 |
OpenOffice | 套跨平臺的辦公軟體套件,類似 Microsoft Office。 |
GCC | C語言/C++編譯器。 |
Java、PHP、 Python | 開源的程式語言。 |
1.3.關於開源協議
開源軟體在追求“自由”的同時,不能犧牲程式設計師的利益,否則將會影響程式設計師的創造激情,因此世界上現在有 60 多種被開源促進組織(Open Source Initiative)認可的開源許可協議來保證開源工作者的權益。
開源協議規定了你在使用開源軟體時的權利和責任,也就是規定了你可以做什麼,不可以做什麼。
1.3.1.如何選擇開源協議
世界上的開源協議有上百種,很少有人能徹底搞清它們之間的區別,即使在最流行的六種開源協議——GPL、BSD、MIT、Mozilla、Apache 和 LGPL——之中做選擇,也很複雜。
烏克蘭程式設計師 Paul Bagwell 畫了一張分析圖,說明應該怎麼選擇開源協議,大家看了一目瞭然,真是清爽。
2.如何查詢開源專案
首先關於開源專案的查詢要介紹的網站有兩個,一個是 GitHub眾所周知全球最大的同性交友平臺,第二個則是國內近幾年火熱的程式碼管理平臺 碼雲。想要尋找比較好的開源專案通常在這兩個平臺上面搜尋即可,當然搜尋也是需要技巧的。
程式碼管理平臺常見關鍵字解析
watch
:會持續收到專案的動態fork
:複製某個專案到自己的倉庫star
:點贊數,表示對該專案表示認可,點贊數越多的專案一般越火clone
:將專案下載到本地follow
:關注你感興趣的作者,會收到他們的動態
2.1.一個倉庫專案的基本解析
一些關鍵性資訊分析
Issues(問題單)
:用於對專案進行跟蹤、增強和排錯。它們就像電子郵件一樣 —— 除了它們可以與團隊的其他成員進行分享和討論- 越火的專案
start
和fork
就會越多 commit
:一般比較好的專案,維護會比較頻繁,更新也會頻繁,提交數就會多README.md
檔案是一個專案的入門手冊,裡面介紹了整個專案的使用、功能等等。所以README檔案寫得好不好,關係到這個專案能不能更容易的被其他人瞭解和使用- 也可以根據專案的最後更新時間來檢驗自己是否下載了遠古專案
2.2.關於開源專案高階搜尋
GitHub有高階搜尋功能,search/advanced可以輸入關鍵字
、程式碼庫大小
、包含作者
、程式碼語
、程式碼包含字尾檔名
等
注意:搜尋公式可以結合使用。每個公式之間用空格隔開即可!
2.3.根據倉庫標題、描述搜尋
in關鍵詞限制搜尋範圍
in:name xxx
專案名包含xxxin:description xxx
專案描述包含xxxin:readme xxx
專案介紹文件裡含有xxx
以in:限制 搜尋的具體內容
為主導進行更加精準的搜尋
2.4.按照地區和語言進行搜尋
很多時候我們的專案是要用我們會的語言,你找到了一個Python
寫的好專案,但是沒學過Python
,下載了也看不懂,同時,為了更好的閱讀README.md幫助文件以及專案註釋
,我想很多同學都會想要下載中文的專案,當然英語頂呱呱的請忽略。這個時候就可以用地區和語言進行搜尋。
location
:地區language
:語言
#語言為javaScript
language:javaScript
#地區為china
location: China
#可以進行聯合搜尋 如下:
language:javascript location:china
2.5.根據倉庫屬性條件搜尋
可以根據個人需求,可能想要找的專案並不是那麼大的專案只是一些小專案就可以對專案大小進行限制。
size:>= 數字
注意:100代表100Kb 單位為Kb
如果想要尋找一些比較新穎的專案,不想要比較遠古的專案則可以根據專案的更新時間來搜尋
pushed:> YYYY-MM-DD
最後上傳日期大於YYYY-MM-DDcreated:> YYYY-MM-DD
建立日期大於YYYY-MM-DD
#比如我們想要尋找2020年最新更新的專案,可以如下
pushed:>2020-01-03 Spring Boot
#這樣子就可以找到2020年1月之後更新的最新專案
2.6.根據個人或某組織進行搜尋
如果你想在GitHub 上找一下某個大神是不是提交了新的專案,可以對他們進行精準搜尋
user: name
查詢某個使用者org: name
查詢某個組織followers:>=xxx
查詢關注者數量超過xxx的開發者
2.7.根據倉庫的LICENSE搜尋
開源專案的License(專案授權協議) 有的開源專案作者明確禁止商用了,但是你不知情下載了,並且使用了,這就會很麻煩,所以如果有搜尋需要專案的時候就需要按照對應的開源協議來搜尋專案。
license:對應協議
#例如我們們要找協議是最為寬鬆的 Apache License 2 的程式碼,如下
license:apache-2.0 Spring Boot
awesome加強搜尋
Awesome 似乎已經成為不少 GitHub 專案喜愛的命名之一,Awesome 往往整合了大量的同一領域的資料,讓大家可以更好的學習
awesome 關鍵字
awesome 系列一般是用來收集學習、工具、書籍類相關的專案
比如搜尋優秀的Java
相關的專案,包括框架、教程等可以輸入:awesome Java
2.8.熱門
GitHub Trend 頁面總結了每天/每週/每月週期的熱門Repositories 和 Developers,你可以看到在某個週期處於熱門狀態的開發專案和開發者。
GitHub Topic 展示了最新和最流行的討論主題,在這裡你不僅能夠看到開發專案,還能看到更多非開發技術的討論主題
3.開源專案解析
3.1.查詢相關開源專案
根據使用者使用情況不同(中文Gitee,全球性GitHub),可以先從國內的開源網站來尋找開源專案,以下開源專案案例來自於 Gitee,在Gitee中可以根據首頁的開源軟體對最有價值的專案進行檢視和搜尋。或者可以根據推薦專案進行觀察和選擇專案學習
3.1.1.開源專案
本次開源專案來源於Gitee上的一個自動化OA辦公系統。感謝大佬的開源,如果大家喜歡也可以給大佬一個start哦。辦公自動化(OA)是面向組織的日常運作和管理,員工及管理者使用頻率最高的應用系統,極大提高公司的辦公效率。
3.2.如何分析一個開源專案
3.2.1.觀察開源專案
首先針對於一個開源專案,要做的第一件事情應該是先觀察這個開源專案的大致結構(如使用說明文件、sql檔案、專案目錄結構maven
或者gradle
等),以及所使用的語言等基本資訊。
3.2.2.專案技術分析
檢視說明文件-匹配技術棧與執行環境
根據開源專案的使用說明文件可以知道當前專案使用的是哪些技術棧,根據這些技術棧來分析是否符合自己的需求。並且檢視當前專案的執行環境要求,以便進行下一步將專案執行起來。
以當前開源案例為說明技術棧如下:
前端技術
技術 | 名稱 | 版本 | 官網 |
---|---|---|---|
freemarker | 模板引擎 | springboot1.5.6.RELEASE整合版本 | https://freemarker.apache.org/ |
Bootstrap | 前端UI框架 | 3.3.7 | http://www.bootcss.com/ |
Jquery | 快速的JavaScript框架 | 1.11.3 | https://jquery.com/ |
kindeditor | HTML視覺化編輯器 | 4.1.10 | http://kindeditor.net |
My97 DatePicker | 時間選擇器 | 4.8 Beta4 | http://www.my97.net/ |
後端技術
技術 | 名稱 | 版本 | 官網 |
---|---|---|---|
SpringBoot | SpringBoot框架 | 1.5.6.RELEASE | https://spring.io/projects/spring-boot |
JPA | spring-data-jpa | 1.5.6.RELEASE | https://projects.spring.io/spring-data-jpa |
Mybatis | Mybatis框架 | 1.3.0 | http://www.mybatis.org/mybatis-3 |
fastjson | json解析包 | 1.2.36 | https://github.com/alibaba/fastjson |
pagehelper | Mybatis分頁外掛 | 1.0.0 | https://pagehelper.github.io |
部署注意事項
- 下載專案、把oasys.sql匯入本地資料庫
- 修改application.properties
- 修改資料來源,oasys——>自己本地的庫名,使用者名稱和密碼修改成自己的
- 修改相關路徑,配置圖片路徑、檔案路徑、附件路徑。(static/image/oasys.jpg 拷貝到配置的圖片路徑下,不然會報 FileNotFoundException )
- OasysApplication.java中的main方法執行,控制檯沒有報錯資訊,資料啟動時間多久即執行成功
- 在瀏覽器中輸入localhost:8088/login
3.2.3.安裝環境匯入專案
通過第一輪觀察可以發現和找到相關的專案跑起來所需要的檔案,那麼接下去的第二步就是將這個專案匯入到我們的IDE編譯工具中去,並且嘗試性的將這個專案執行起來,進行檢視。
1.匯入相關的sql檔案
通常開源專案的作者會將專案的sql檔案一起打包放入到開源專案中,在首頁目錄下一般都能看到相關的xxx.sql
的檔案,如果沒有可以檢視一下有沒有相關叫sql的資料夾。
找到相關資料庫檔案後,新建相關資料庫,並且將SQL檔案進行執行。
2.將專案用IDE工具開啟
準備好相關的IDE工具,通常放在程式碼託管平臺上面的專案是不會根據指定的編譯器的,而是保留了Maven的核心檔案即可。
通常則將IDE編譯工具開啟然後將對應路徑上的專案進行匯入即可
3.分析目錄結構
在專案成功匯入後可以對專案的目錄結構進行一下簡單的檢視,看自己是否能夠看懂其大概的佈局再開始下一步深入的專案分析
從上圖中是可以看到,就算是開源專案的目錄結構也是按照平時學習過程中的標準來的,也是按層級,按功能,按資源來劃分的
3.2.4.關於package-info.java
在檢視開源專案的過程中可以看到很多包底下有package-info.java
這個類,package-info.java
是一個Java
檔案,可以放到任意Java
原始碼包執行。不過裡面的內容有特定的要求,其主要目的是為了提供包級別相關的操作,比如包級別的註解、註釋及公共變數。
1.提供包級別的註解
在對應的原始碼包提供包級別的註解,簡單案例如下:
// 建立包註解
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestPkg {
}
//在package-info.java中新增註解
@TestPkg
package com.exercise.data_collection_error_info_transformation.component;
// 可以檢視相關注解
public class Client {
public static void main(String[] args) throws ClassNotFoundException {
// 檢視包註解
String pkgName = "com.exercise.data_collection_error_info_transformation.component";
Package pkg = Package.getPackage(pkgName);
Annotation[] annotations = pkg.getAnnotations();
for(Annotation an:annotations){
if(an instanceof TestPkg){
System.out.println("Hi,I'm the TestPkg");
}
}
// 檢視包下面對應的類的註解
Class test = Class.forName("com.exercise.data_collection_error_info_transformation.component.Test");
Annotation[] annotations2 = test.getAnnotations();
for(Annotation an:annotations2){
if(an instanceof TestPkg){
System.out.println("Hi,I'm the Class TestPkg");
}
}
}
}
/**
得到最終結果如下:
Hi,I'm the TestPkg
*/
如果一整個包都是過時的話,可以直接在package-info.java
下面,新增註解@Deprecated
,表示該原始碼包已過時
2.提供包級別的變數
如果想在包裡面使用對應的變數,而不想讓其他包使用,就可以將變數放到package-info.java
下面,實現分包自用
的理念。
/**
在package-info.java類中新增如下內容
* 包類
*/
class PACKAGE_CLASS{
public void test(){
}
}
/**
* 包常量
*/
class PACKAGE_CONST{
public static final String TEST_01="TEST";
}
// 在同級別包中進行任意呼叫不會報錯
public class Client {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(PACKAGE_CONST.TEST_01);
}
}
3.方便JavaDoc文件輸出
使用JavaDoc
的時候,通過在package-info.java
新增註釋,生成JavaDoc
實現對應包的註釋說明。
3.3.Debug對專案進行分析
我們可以通過對程式專案進行斷點除錯,來對專案的原始碼功能進行分析。比如可以在最常見的登陸部分進行debug測試。
根據斷點一步一步的去感受作者在寫這些程式碼的每一步用意,看開源的意義就在於此,思考、借鑑非常的重要!
總結
所以個人總結下來有基礎的情況下一開始看開源專案的流程並不是很複雜,歸納如下:
- 瞭解什麼是開源
- 學會去找一個適合自己想看技術架構的開源專案
- 觀察開源專案(就是看readme.md文件)以及下載開源專案
- 將下載下來的開源專案的目錄結構先進行分析,並且用IDE工具開啟此開源專案
- 將開源專案執行起來
- 通過打斷點(Debug)執行專案的方式來思考作者的思路如果覺得好就可以成為自己的借鑑程式碼