我想把自己寫的程序開源,需要對源碼做哪些處理?

我不是想問使用github和選擇開源協議這方面的問題,而是想問我需要對目前的代碼做哪些修改和整理工作。

我的理解,開源並不僅僅是把代碼上傳到公共空間這麼簡單,還需要有詳細的文檔說明等等。我沒有這方面的經驗,不了解相關的流程,希望有做過開源項目的朋友幫忙解答。

比如,是不是需要在每個源文件里寫清作者信息和開源協議信息,是不是要把程序用到的其他庫的版權信息列出,如果要列出,應該寫在什麼地方之類的。感謝您的幫助!


呃。。。

提問者說了不問github、開源協議方面的問題。。

我也沒打算回這方面的東西

我說幾點一定要注意、就算是很多「大牛」也做得很不好的地方(一、二)吧。。。

一、成品

  1. 一定要能一鍵構建
  2. 如果做不到1,請一定寫清楚構建步驟,詳細的命令,需要提前安裝的庫(和安裝方法)
  3. 如果跨平台,一定要在支持的平台測試一下再聲稱可以一鍵構建

二、用法

  1. 一定要配demo,demo一定要簡單直接
  2. 務必對主要介面進行文檔描述,md即可,plain text亦可。內容為用法和注意事項
  3. 附錄給了一個宇宙終極渣開源項目的例子

三、代碼

  1. 盡量(盡你所能)乾淨一點,做好縮進等格式化
  2. 如果代碼很臟,最好能重構二一
  3. 介面要統一、正交

三、雜項

  1. 如果可以,請配上gif / apng效果圖
  2. 確保沒有違反使用的第三方庫協議(這個自己翻翻別人的協議怎麼說的就好了)
  3. 如果不是特別喜歡刷存在感,減少或刪除貼在文件頭上的大段廢話

四、總結

  1. 原則就是要讓用戶爽,越爽越好。不能讓用戶煩心,不能讓用戶用不來
  2. 文檔你按這個格式寫,用戶就會很開心了
  3. 請贊

附錄:

這是一本python入門書的第一個例子

並且

全書都是這德行!!!!!!!!

&,dive你大爺,看了這書新手也別想浮上來了

def buildConnectionString(params):
"""Build a connection string from a dictionary of parameters.

Returns string."""
return ";".join(["%s=%s" % (k, v) for k, v in params.items()])

if __name__ == "__main__":
myParams = {"server":"mpilgrim",
"database":"master",
"uid":"sa",
"pwd":"secret"
}
print buildConnectionString(myParams)


首先你要選擇你準備採用的發布協議。例如 gpl 啊 bsd 啊 apache 啊 mit 啊等等。

然後,你可以參考該協議中給你的建議。

一般而言協議中會建議你在每個源文件頭都加上版權信息,這個信息對於每個不同的協議不同。你可以打開一個對應協議的開源項目,查看裡面的代碼頭,一般這個頭是協議的簡化版。

把每個文件都加上版權信息,然後在你的項目的主目錄中存放你使用的協議的「完整全文」,這個文件一般可以取名為 COPYING ,當然你也可以取名為用戶可以理解的任何名字。

源代碼倉庫中包含版權協議的完整全文,並且每個源代碼頭都包含版權聲明簡化版。然後這個代碼要「發布」出去(發布的方式與場所你可以任意選擇)。這就滿足了開源的基本要素。就開源本身來說,以某個開源的協議發布,就算作開源。

至於其他的事情都是「可選」的,你做了更多,可以更好的宣傳你的項目,但並不是強制的。


一般慣例:

1. 代碼頭部通過注釋的方式添加授權協議,網站,版權信息等簡要信息。比如我們的代碼頭:

2. 代碼根目錄增加一個README文檔,提供軟體的基本介紹。

3. 代碼建立一個doc目錄,相關協議文件,幫助等可以放在doc目錄下面。

4. 如果有國外用戶的話,盡量用英文寫注釋。

5. 目錄命名可以盡量遵循慣例,比如Linux下面常用bin, lib, doc, 這樣的目錄。

其他的我覺得就是代碼的格式啊,注釋啊可能要整理下,方便第三方的用戶閱讀理解。

我們的代碼實例:https://github.com/easysoft/zentaopms


在README中寫明API,不一定要全部寫出來,把常用的,已經確保穩定的寫出來就好了,對於不穩定的API,自己心裡有點B數就好,先保留著,等維護穩定了再發布。

其次,Quick Start,README中附帶一些demo,即範例代碼,讓開發者對用法一目了然。

然後,構建以及測試的方法,比如構建環境,配置,命令等。

最後,如果項目還在迭代中,且有不穩定的地點,把這些坑註明一下吧。


嘗試一件新事物的時候,不要搞得太複雜,否則連動手的勇氣的都沒有了,建議你把代碼里不能公開的信息去掉,然後發布到github或者bitbucket上,按照網站的提示上傳代碼基本就OK了,Readme.md可以先寫一個簡單的,日後再完善,至於License什麼之類的等你明白了是幹什麼的再加也不遲,總之先把第一步邁出去。


竟然沒人提到單元測試?!如果你的項目足夠火,那會有好多Pull Request,到時候你都Pull進來,最後發現程序崩潰了。所以啊,你得有一些能迅速發現問題的單元測試,最起碼保證每個版本都是可以運行的,同時你也要要求Contributor的代碼能通過單元測試,並且要求他們在加入新Feature的時候用TDD。


確信別人可以通過幾個固定的步驟(而不是這裡改改那裡改改)

來編譯運行你的代碼

比如:

* 按照INSTALL所說裝一堆包

* ./autogen.sh

* make

* make test


除了協議

其他的不需要,你可以直接開源,別人想不想fork就是另外一回事了


Github上多數項目貌似根目錄下方基本都有三個文件,學著他們做就好了吧..

  • README:項目介紹
  • LICENCE:項目版權協議
  • CHANGELOG:各版本的更新記錄

  1. 對於依賴庫,如果項目使用Maven或者Ant等項目構建,通過上傳對應的的xml構建文件,到時候build一下就能自動獲取依賴庫了,否則建立一個lib目錄放需要用到的依賴庫,最後在readme裡面說一下就好.

  2. 一般庫項目我會在項目目錄下建一個bin目錄,然後放這個項目編譯好的庫,方便一些人直接使用.

  3. 把提交記錄寫清楚,每個功能一次提交.這樣能通過版本管理日誌知道項目的功能變化.

  4. 代碼注釋之類的一般在功能定型之後慢慢給每個文件加的吧,頻繁變動期間加了也沒意義.


記得把諸如資料庫密碼等內容刪除。。


添加版權,添加readme,添加工整的注釋


推薦閱讀:

非大公司支持的開源或自由軟體感覺大部分都很死腦筋,為什麼不在用戶體驗上多花點心思呢?
ShopEx 和 ECSHOP 的区别在哪?都是上海商派的产品,为啥一个开源一个非开源呢?
假如 ISIS 開發了有價值的開源軟體並用於作惡,我們使用有道德問題嗎?
Ubuntu上哪些地方做的比Windows好?
有哪些霸氣側漏的開源軟體License?

TAG:開源軟體 | 開源 |