新增第一個練習


每個軌道上的第一個練習,都是非常簡單的「Hello, World!」練習。

這個練習的重點,在於快速確認所有環節是否正確接在一起。它會確認使用者是否正確安裝了程式設計環境、知道怎麼執行測試,並且能讓測試通過。除此之外,對於 Exercism 命令列客戶端(CLI)來說,它也能確保使用者已安裝並正確設定 CLI,並且網站能為這個練習提供正確的檔案,不會附帶任何不必要的產物。最後,它確保使用者熟悉整個循環:用 CLI 下載練習、在自己的本機開發環境中解題,再把解答提交回網站。

換句話說,這其實還不是要學語言本身的什麼東西。我們的目標就是做到極度簡單。

這大概也會是把軌道儲存庫設定正確的過程中,最困難的一部分,因為實作一個練習牽涉到許多互相牽動的環節。

實作練習

「Hello, World!」練習有一些特別的規則:

  • 它永遠是軌道中的第一個練習
  • 每個軌道都必須實作它
  • 測試檔只有一個測試
  • 虛設檔案包含一個幾乎可用的實作,但用的不是「Hello, World!」,而是「Goodbye, Mars!」
  • 它沒有 prerequisites
  • 它沒有 practices

決定檔案路徑

「Hello, World!」練習(其實 Exercism 上的所有練習都一樣)需要一組特定的檔案:

  • 說明文件:向學習者說明他們需要做什麼(可自動產生)。
  • 中繼資料:提供 Exercism 一些關於這個練習的中繼資料(大部分可自動產生)。
  • 測試套件:驗證解答是否正確(依軌道而定)。
  • 虛設實作:提供學習者一個起點(依軌道而定)。
  • 範例實作:提供一個能通過所有測試的範例實作(依軌道而定)。
  • 其他檔案:確保測試可以執行(依軌道而定,選用)。

在建立「Hello, World!」練習之前,你需要先決定一些依軌道而定的檔名與檔案路徑(測試套件、虛設實作、範例實作,以及任何其他檔案)。

經驗法則是使用對該語言而言道地的名稱。如果沒有特別強烈的偏好,就優先選擇較淺的目錄結構。範例實作必須能被 CI 腳本辨識,因此建議挑一個所有練習都能使用的通用基底名稱,例如example、sample或reference-solution。

設定檔案路徑

決定好依軌道而定的檔案路徑後,你應該在根目錄的config.json檔案中的files鍵設定它們。files鍵會作為所有練習的範本,讓任何工具(等一下我們會用到一些)知道要到哪裡找檔案。你可以使用各種佔位符,輕鬆設定練習的 slug(這裡是hello-world)。

範例

如果你的軌道檔案使用 PascalCase,files鍵可能長這樣:

"files": {
  "solution": [
    "%{pascal_slug}.cs"
  ],
  "test": [
    "%{pascal_slug}Tests.cs"
  ],
  "example": [
    ".meta/Example.cs"
  ]
}
Note

範例檔案應該存放在.meta目錄中。

更多資訊請參閱 files 鍵的文件。

建立檔案

指定好檔案路徑範本後,你就可以在軌道的根目錄執行以下命令,快速產生「Hello, World!」練習的檔案:

bin/fetch-configlet
bin/configlet create --practice-exercise hello-world

設定作者

想讓網站把你列為這個練習的作者,請依照以下步驟:

在練習的.meta/config.json檔案中:

  • 把你的 GitHub 使用者名稱加到authors鍵

要做到這點,你需要把 Exercism 帳號連結到 GitHub。你可以在網站上的設定頁面的整合區塊這麼做。

Note

練習作者也會獲得聲譽。

使用腳本

較新的軌道儲存庫可以使用bin/add-practice-exercise腳本(原始碼)來新增練習:

bin/add-exercise -a <github_username> two-fer
Note

如果你正在處理的軌道儲存庫沒有這個檔案,歡迎透過上面的原始碼連結把它複製到你的儲存庫。

實作練習

樣板檔案建立好之後,接著你必須:

  • 在測試檔中加入測試
  • 加入範例實作
  • 定義虛設檔案的內容

加入測試

新增練習的關鍵之一就是加入測試。大致說來,實作上述練習時有兩個選擇:

  1. 使用練習的canonical-data.json 中的測試案例,從零開始實作測試
  2. 從其他軌道的實作移植測試(小提示:前往https://exercism.org/exercises/hello-world就能概覽哪些軌道實作了某個特定練習)。

對於「Hello, World!」練習,只會有一個測試案例,所以兩種做法應該都可以。

加入範例實作

範例實作檔案應該包含通過測試所需的程式碼。

定義虛設檔案

虛設檔案裡的解答應該幾乎能通過測試,但要把「Hello, World!」這段文字換成「Goodbye, Mars!」。小提示:你可以直接複製、貼上再修改範例解答。

更新練習的作者

完成練習後,請把你的 GitHub 使用者名稱加到練習的.meta/config.json檔案裡的"authors"陣列。這樣我們才能正確標註你是這個練習的建立者。

Lint 檢查

要驗證練習是否設定正確,你可以使用 configlet 工具內建的 lint 功能。

第一步是取得configlet工具,我們為此建立了兩個腳本:

  • bin/fetch-configlet:在 *nix 或 macOS 上執行這個
  • bin/fetch-configlet.ps1:在 Windows 上執行這個

從軌道儲存庫的根目錄執行其中一個腳本,就會下載bin/configlet或bin/configlet.exe執行檔。

接著你可以執行 bin/configlet lint 來檢查練習是否正確。

Note

configlet很可能會回報以下錯誤:

The `tags` array is empty:
/path/to/track/config.json

這個錯誤會在準備上線步驟中修正,所以你可以:

  • (暫時)忽略這個錯誤,或
  • 加入 tags 來修正這個錯誤
Note

每當有東西被推送到main或開啟 pull request 時,configlet工作流都會自動執行configlet lint。