Contrib 函式庫自述檔應包含
使用 Maven / Leiningen 將函式庫包含為相依項的說明
連結至 Jenkins 和 JIRA 上的函式庫頁面
連結至 Maven Central 和 oss.sonatype.org 上可用的版本
連結至產生的 API 文件(如果有的話)
一般使用說明(應說明要使用/需要哪個命名空間)
開發人員資訊:連結至 GitHub 專案、錯誤追蹤器、持續整合、相容性測試矩陣
所有版本的變更記錄(也可以在個別檔案中)
如果您是 Clojure Contrib 提交者,您應該做的事情
維護你的程式庫並回應出現的問題/議題
在 master 分支上執行你的工作,或(如果你正在處理一個重要的區塊,你想要暫時分開處理)在你建立的功能特定分支上
使用 GitHub 的「按需發布」動作來發布
在對他們的程式庫進行變更之前,與其他提交者協調
僅在其他人已簽署 CA時接受他們的貢獻
要避免的事情
請不要推送到發布分支(例如 1.2.x)
不要接受非貢獻者的修補程式
請不要接受貢獻者的拉取請求。僅接受修補程式。
不要變更 pom.xml 中的版本號碼 - 使用上述的 Maven 發布流程
以下是成為提交者的流程大綱
將你的CA歸檔
加入clojure-dev郵件清單
建立一個JIRA 帳戶
讓 Clojure 核心團隊知道你的 github 使用者名稱和 JIRA 使用者名稱,以便他們設定正確的權限
Clojure 核心團隊也需要在 build.clojure.org 上建立你的帳戶 - 詳見下方
將現有專案移至 contrib
所有過去的貢獻者都必須
提交 Clojure 貢獻者協議
寄送電子郵件至 clojure-dev 郵件清單,授予許可,例如:「我,(NAME),授予許可,根據 Clojure 貢獻者協議發布我對 (PROJECT) 的貢獻。」
設定新的 contrib 專案
寄送電子郵件至 clojure-dev 郵件清單,取得新專案的核准和 GitHub、Jira 和 Jenkins 的管理員權限。
在 clojure 組織下要求建立新的 GitHub 儲存庫
指定專案名稱(必須經 Clojure 核心核准)
指定描述
合作者 - 新增團隊:包含 Contrib Commit
clojure-build - 讓 Jenkins 標記發布、建立自動文件等
停用議題標籤(我們使用 JIRA)
專案結構(例如,請參閱現有專案)
/README.md - 說明檔,請參閱上方
/CHANGES.md - 變更日誌
/CONTRIBUTING.md - 範例
/epl.html - EPL 授權資訊
/pom.xml - 根據build.poms說明 - 用於建置/部署
/src/main/clojure - Clojure 原始碼
/src/test/clojure - Clojure 測試
/src/main/cljs - ClojureScript 來源
/src/test/cljs - ClojureScript 測試
/src/main/java - Java 來源(如果需要)
建立新的 JIRA 專案(需要 JIRA 管理員權限)
指定名稱(與 GitHub 專案名稱相同)
指定金鑰(由 Clojure 核心核准,衍生自專案名稱) - 通常應為第一個部分的第一個字元,加上第二個部分最多 5 個字元 - TBENCH、DJSON 等
指定專案負責人的 JIRA 帳戶
編輯專案以新增網址和說明(與 GitHub 專案相同)
設定通知機制 - 通常為「預設機制加上通知專案負責人」
設定組建(需要 Jenkins 管理員權限,第 2 步除外)
為作者建立 Jenkins 使用者帳戶
編輯 build.ci 儲存庫中的 ci_data.clj,新增新的專案 / 更新作者(讓他們可以執行組建 / 進行版本發布)
在 clojure-dev 郵件清單中提出要求,以執行 build.ci Jenkins 工作 - 這會重新建立所有 Jenkins 工作定義檔案!
強制 Jenkins 重新載入其組態檔案
自動文件
進行中
執行版本發布
快照版本會在每次工作組建時自動建立(由任何來源變更觸發)
若要使用快照,請參閱 Maven 設定和儲存庫
根據以下「如何進行版本發布」區段執行版本發布
準備
您的專案必須有一個具有 -SNAPSHOT 版本的 pom.xml 檔案
pom.xml 檔案必須指定父項,也就是 build.poms 中 pom.contrib 的最新已發布版本
如何建立 -SNAPSHOT 版本
您的專案必須有一個具有 -SNAPSHOT 版本的 pom.xml 檔案
推送到 GitHub 上的「master」分支
Jenkins 會輪詢 GitHub 並自動組建
或者,您可以在專案頁面上按一下「立即組建」
Jenkins 會組建並上傳一個編號唯一的 JAR 檔案到 Sonatype OSS 快照儲存庫
如何建立編號版本
GitHub 中的「master」分支必須有一個具有 -SNAPSHOT 版本的 pom.xml 檔案,而非單純的版本號碼
登入 Jenkins
導覽至專案的作業
按一下左側的「執行 Maven 發行」連結
在「執行 Maven 發行」頁面上
選取「為所有模組指定一個版本」
在「發行版本」欄位中,輸入專案此發行的版本號碼
這通常會是目前開發版本,移除「-SNAPSHOT」字尾
在「開發版本」欄位中,輸入專案後續開發版本的版本號碼
這會以「-SNAPSHOT」結尾
按一下「排程 Maven 發行建置」
建置順利完成後
在開發機器上執行 git pull
以取得新的發行標籤
發行 JAR 檔案將上傳至 Sonatype OSS 暫存存放庫
發行將會在 24 小時內自動複製至 Maven Central 存放庫(通常在 15 分鐘內)
如果專案 README 建議使用者使用某個版本,別忘了更新它。
貢獻發行編號政策
主要版本.次要版本.修補程式
如果可能,請遵循累積和修正的準則,而不是中斷。
免責聲明
規則是制定來打破的。了解標準,但不要將它們視為絕對的。
標準
取得正確的名稱和簽章。Rich 非常尊重 Java 對不中斷既有程式碼的承諾。實際上,這表示我們可以永遠調整實作,但一旦我們發布名稱和簽章,我們就需要堅持下去。(實際上,我認為這表示我們希望很多人檢閱名稱和簽章,即使他們不檢閱實作細節。)
對可能會出現在關鍵程式碼中的函數使用類型提示;否則,請保持程式碼簡單且無提示。
僅使用重要的類型提示。如果您不確定類型提示是否有幫助,請不要新增它。
使用良好的名稱,不要害怕與其他命名空間中的名稱衝突。這就是彈性命名空間支援存在的目的。
另一方面,使用具有不同簽章或語意的相同名稱會引發疑問,即其中一個是否不理想。
明確且簡潔地說明對其他套件的依賴關係。(偏好 :require :refer,而非 :use)
當函數可以執行作業時,請不要使用巨集。如果巨集對於易用性很重要,請也公開函數版本。
如果您確定在編譯時擁有所有資訊,請在會改善效能敏感程式碼的地方使用巨集。
提供函式庫層級文件字串。
提供自動化測試。
對謂詞使用「?」字尾,並傳回布林值。
對解構目標和程式碼中將忽略其值的正式引數名稱使用「_」。
包含文件字串。
有疑問時,公開效能版本。Clojure 會盡力在您需要時啟用效能,函式庫也應如此。(例如,這就是我們在核心沒有多重方法 + 的原因。)使用者可以自行建立更多多型 API,如果他們願意,可以劫持符號。
如果您採用與核心衝突的好名稱,請確保您的語意是平行的(可能減去惰性)。這方面的一個好例子是覆寫核心 seq 函式的字串函式。
使用 assert 以及前置和後置條件。
在可能的情況下保持惰性。
遵循 clojure.core 的範例,使用慣用的名稱,例如 pred 和 coll。
在函式中
f、g、h - 函式輸入
n - 整數輸入,通常是大小
index - 整數索引
x、y - 數字
s - 字串輸入
coll - 集合
pred - 謂詞封閉
& more - 可變參數輸入
在巨集中
expr - 表達式
body - 巨集主體
binding - 巨集繫結向量
請勿遵循 clojure.core 前導程式碼中的慣用語法。該程式碼在受限的環境中執行,因為 Clojure 尚未啟動。
分解部分。如果您不叫 Rich,請不要撰寫像 doseq 定義一樣長的表單。
使用關鍵字優先語法存取物件上的屬性:(:property object-like-map)
使用集合優先語法從集合中萃取值(或在集合可能是 nil 的情況下使用 get):(collection-like-map key)
或 (get collection-like-map key)
。請注意,並非所有集合都以關鍵字為鍵。
慣用語法大量使用解構。但是,只有當您想要將子結構傳達為呼叫方合約的一部分時,才應該在引數清單中解構。否則,在第一行 let 中解構。
優先更新而非設定。原因很多:統一的更新模型提供了一個簡單的標準方式來執行此操作。協助您發現可交換的運算。減少您對要更新物件所做的假設的表面積。
不支援對錯誤的集合類型進行運算。如果演算法僅在隨機存取時才具有效能,則需要一個具有隨機存取的引數。
僅對打算重新繫結的事物使用 *earmuffs*。不要對常數使用特殊符號;除非另有說明,否則一切都假設為常數。
僅對 STM 交易中不安全的項目使用驚嘆號!
優先使用序列函式庫組合而非明確的迴圈/遞迴。
可重新繫結的變數應與範圍巨集配對,例如 in 和 with-in-str。
延遲序列應公開為僅包含所需最小狀態的函式,又稱為「放手」。讓呼叫者決定要使用多少本地端記憶體。
使用 Klass/staticField、(Klass/staticMethod)、(Klass.) 和 (.method obj) 互操作樣式,唯一的例外是在產生程式碼的程式碼中,其中較舊的 (. obj method) 樣式可能更容易產生。
如果您提供一個透過動態繫結隱式傳遞參數的介面(例如 sql 中的 db),也請提供一個相同的介面,但參數是明確傳遞的。
在為 cond 提供預設情況時,請使用關鍵字 :else 作為條件,而不是 true
若要存取私有變數(例如用於測試),請使用 @#'some.ns/var 形式
通訊協定
只有在擁有類型或通訊協定時,才應將通訊協定擴充套件到類型。
如果有人違反前一條規則,他們應準備撤回,如果實作者的任一方提供定義
如果通訊協定附帶 Clojure 本身,請避免將其擴充套件到您不擁有的類型,特別是例如 java.lang.String 和其他核心 Java 介面。請放心,如果通訊協定應該擴充套件到它,它會這樣做,否則會遊說它。
正如 Rich Hickey 所述,動機是為了防止「人們將通訊協定擴充套件到它們沒有意義的類型,例如,通訊協定作者考慮過但由於語意不匹配而拒絕實作的類型」。「不會有擴充套件(根據設計),而理解/技能不足的人可能會用錯誤的想法填補空白。」