共用方式為


設計指引

下列各節提供設計 CLI 的指引。 想想您的應用程式在命令行上預期的內容,就像 REST API 伺服器在 URL 中預期的情況一樣。 REST API 的一致規則可供用戶端應用程式開發人員使用。 同樣地,如果 CLI 設計遵循常見模式,命令行應用程式的使用者將有較佳的體驗。

建立 CLI 之後,很難加以變更,特別是如果您的使用者已在預期持續執行的腳本中使用您的 CLI。

符號

命令和子命令

如果命令有子命令,則命令應該做為子命令的區域或群組標識碼,而不是指定動作。 當您叫用應用程式時,您可以指定群組命令及其其中一個子命令。 例如,嘗試執行 dotnet tool,而且您會收到錯誤訊息,因為 tool 命令只會識別一組與工具相關的子命令,例如 installlist。 您可以執行 dotnet tool install,但 dotnet tool 本身會不完整。

定義區域有助於協助使用者整理說明輸出。

在 CLI 中,通常會有隱含區域。 例如,在 .NET CLI 中,隱含區域是專案,而 Docker CLI 則是映像。 因此,您可以使用 dotnet build 而不包含區域。 請考慮您的 CLI 是否有隱含區域。 如果符合條件,請考慮是否允許使用者選擇性地包含或省略它,如在 docker builddocker image build 中。 如果您選擇性地允許使用者輸入默認區域,您將自動為此命令組提供說明指南和自動完成功能。 藉由定義執行相同作業的兩個命令,提供隱含群組的選擇性用法。

選項做為參數

選項應該為命令提供參數,而不是自行指定動作。 這是建議的設計原則,雖然 System.CommandLine 並不總是被遵循(--help 顯示協助資訊)。

命名

簡短格式別名

一般而言,我們建議您將您所定義的簡短格式選項別名數目降到最低。

特別是,請避免使用與 .NET CLI 和其他 .NET 命令行應用程式中的常見用法不同的下列任何別名:

  • -i--interactive

    此選項會向使用者發出訊號,指出他們可能會收到輸入給命令需要回答的問題。 例如,提示輸入用戶名稱。 您的 CLI 可能會用於文稿,因此在提示尚未指定此參數的使用者時請小心。

  • -o--output

    某些命令執行後會產生檔案作為結果。 此選項應該用來協助判斷這些檔案應位於何處。 在建立單一檔案的情況下,此選項應該是檔案路徑。 在建立許多檔案的情況下,此選項應該是目錄路徑。

  • -v--verbosity

    命令通常會在控制臺上向使用者提供輸出;這個選項可用來指定使用者要求的輸出數量。 如需詳細資訊,請參閱--verbosity本文稍後的選項。

也有一些別名,一般使用方式僅限於 .NET CLI。 您可以將這些別名用於應用程式中的其他選項,但請注意混淆的可能性。

  • -c 使用的 --configuration

    這個選項通常是指具名的組建組態,例如 DebugRelease。 您可以使用任何您想要的組態名稱,但大部分工具都預期其中之一。 此設定通常用來以對該組態有意義的方式設定其他屬性,例如,在建 Debug 置組態時執行較少的程式碼優化。 如果您的命令有不同的作業模式,請考慮此選項。

  • -f 使用的 --framework

    此選項可用來選取要執行的單一 目標 Framework Moniker (TFM), 因此,如果您的 CLI 應用程式根據所選 TFM 有不同的行為,您應該支援此旗標。

  • -p 使用的 --property

    如果您的應用程式最終會叫用 MSBuild,使用者通常需要以某種方式自定義該呼叫。 此選項可讓 MSBuild 屬性在命令行上提供,並傳遞至基礎 MSBuild 呼叫。 如果您的應用程式不使用 MSBuild,但需要一組鍵-值對,請考慮使用這個相同的選項名稱以符合使用者的期待。

  • -r 使用的 --runtime

    如果您的應用程式可以在不同的運行時間上執行,或具有運行時間特定的邏輯,請考慮使用此選項來指定 運行時間識別符。 如果應用程式支援 --runtime,請考慮支援 --os--arch 。 這些選項可讓您只指定 OS 或 RID 的架構元件,讓未指定元件從目前的平台判斷。 如需詳細資訊,請參閱 dotnet publish

簡短名稱

盡可能讓命令、選項和自變數的名稱變得簡短且容易拼字。 例如,如果 class 已足夠清楚,請勿將 命令 classification設為 。

小寫名稱

僅以小寫定義名稱,但您可以建立大寫別名,讓命令或選項不區分大小寫。

Kebab 命名規則

使用 烤肉串大小寫 來區分單字。 例如: --additional-probing-path

多元化

在應用程式中,保持複數形式的一致性。 例如,對於可以具有多個值的選項(最大基數大於一),請勿混用複數和單數的名稱:

選項名稱 一致性
--additional-probing-paths--sources ✔️
--additional-probing-path--source ✔️
--additional-probing-paths--source
--additional-probing-path--sources

動詞與名詞

針對那些代表動作的命令,應使用動詞而非名詞來表示。舉例來說:dotnet workload remove,而不是dotnet workload removal。 使用名詞而非動詞選項,例如: --configuration,而非 --configure

選項 --verbosity

System.CommandLine 應用程式通常會提供 --verbosity 選項,指定傳送至主控台的輸出量。 以下是標準五個設定:

  • Q[uiet]
  • M[inimal]
  • N[ormal]
  • D[etailed]
  • Diag[nostic]

這些是標準名稱,但現有的應用程式有時會以 Silent 取代 Quiet,並以 TraceDebugVerbose 取代 Diagnostic

每個應用程式都會定義自己的準則,以判斷每個層級所顯示的內容。 一般而言,應用程式只需要三個層級:

  • 安靜
  • 正常
  • 診斷

如果應用程式不需要五個不同的層級,此選項仍應定義相同的五個設定。 在此情況下, MinimalNormal 會產生相同的輸出,而且 DetailedDiagnostic 同樣也會相同。 這可讓使用者只輸入他們熟悉的內容,而且會使用最適合的內容。

預期Quiet將不會在控制台上顯示任何輸出。 不過,如果應用程式提供互動式模式,應用程式應該執行下列其中一項動作:

  • 當指定--interactive時,顯示輸入提示,即使--verbosityQuiet
  • 不允許使用 --verbosity Quiet--interactive 一起使用。

否則,應用程式會等候輸入,而不告知使用者正在等候的內容。 您的應用程式似乎凍結了,而且使用者不知道應用程式正在等候輸入。

如果您定義別名,請使用 -v 來取代 --verbosity,並將沒有參數的 -v 作為 --verbosity Diagnostic 的別名。 請使用 -q 用於 --verbosity Quiet

.NET CLI 和 POSIX 慣例

.NET CLI 不會一致地遵循所有 POSIX 慣例。

雙虛線

.NET CLI 中的一些命令具有雙破折號符號的特殊實現。 在 dotnet rundotnet watchdotnet tool run 的情況下,跟隨 -- 的令牌會傳遞至命令所執行的應用程式。 例如:

dotnet run --project ./myapp.csproj -- --message "Hello world!"
                                    ^^

在此範例中 --project ,選項會傳遞至 dotnet run 命令,且 --message 其自變數的選項會在執行時當做命令行選項傳遞至 myapp

不一定需要令牌即可將選項傳遞至您使用 -- 執行的應用程式。 如果沒有雙破折號,dotnet run 命令會自動將任何無法辨識為適用於dotnet run本身或 MSBuild 的選項,傳遞至正在運行的應用程式。 因此,下列命令行是相等的,因為 dotnet run 無法辨識自變數和選項:

dotnet run -- quotes read --delay 0 --fg-color red
dotnet run quotes read --delay 0 --fg-color red

省略選項與參數之間的分隔符號

.NET CLI 不支援 POSIX 慣例,可讓您在指定單一字元選項別名時省略分隔符。

多個參數不需要重複選項名稱

.NET CLI 不接受一個選項的多個自變數,而不重複選項名稱。

布爾值選項

在 .NET CLI 中,某些布爾值選項在傳遞 falsetrue 時會產生相同的行為。 當實作 選項的 .NET CLI 程式代碼只會檢查選項是否存在或缺少選項時,就會發生此行為,而忽略值。 範例是--no-restore,用於dotnet build命令。 指定 --no-restore false 時,還原作業將會略過,這與您指定 --no-restore true--no-restore 的情況相同。

Kebab 案例

在某些情況下,.NET CLI 不會針對命令、選項或自變數名稱使用kebab案例。 例如,有一個名為--additionalprobingpath而非--additional-probing-path的 .NET CLI 選項。

另請參閱