Clojure

Contrib 如何操作

自述檔

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 所述,動機是為了防止「人們將通訊協定擴充套件到它們沒有意義的類型,例如,通訊協定作者考慮過但由於語意不匹配而拒絕實作的類型」。「不會有擴充套件(根據設計),而理解/技能不足的人可能會用錯誤的想法填補空白。」