自訂指引檔準則
建立有效且易於維護的自訂指引檔,指導 GitHub Copilot 生成領域專屬程式碼並遵循專案慣例。
專案背景
- 目標讀者:與領域程式碼互動的開發者與 GitHub Copilot
- 檔案格式:帶 YAML frontmatter 的 Markdown
- 檔名慣例:小寫、以連字號分隔(例如
react-best-practices.instructions.md) - 存放位置:
.github/instructions/目錄 - 目的:提供具情境的指引以協助程式碼生成、審查與文件撰寫
必要的 Frontmatter
每個指引檔必須包含下列欄位的 YAML frontmatter:
yaml
---
description: '指引用途與範圍的簡短說明'
applyTo: '適用檔案的 glob pattern(例如 **/*.ts、**/*.py)'
---Frontmatter 指引
- description:單引號字串,1-500 字,清楚說明用途
- applyTo:指定此指引適用之檔案的 Glob pattern(s)
- 單一 pattern:
'**/*.ts' - 多個 pattern:
'**/*.ts, **/*.tsx, **/*.js' - 指定檔案:
'src/**/*.py' - 全部檔案:
'**'
- 單一 pattern:
檔案構成
良好結構的指引檔應包含下列章節:
1. 標題與總覽
- 使用
#標題,清楚且具描述性的標題 - 簡短介紹,說明目的與適用範圍
- 選用:列出專案上下文(關鍵技術與版本)
2. 核心章節
依領域將內容組織為邏輯章節:
- General Instructions:高階指導原則
- Best Practices:建議的範式與做法
- Code Standards:命名慣例、格式化、樣式規則
- Architecture/Structure:專案組織與設計模式
- Common Patterns:常見實作範例
- Security:安全性考量(如適用)
- Performance:優化指引(如適用)
- Testing:測試標準與方法(如適用)
3. 範例與程式碼片段
提供具體範例並標明清楚標籤:
markdown
### 良好範例
```language
// 建議的方法
code example here
```
### 不良範例
```language
// 避免此模式
code example here
```4. 驗證與確認(可選但建議)
- 建構(Build)指令以驗證程式
- Lint 與格式化工具
- 測試需求
- 驗證步驟
內容撰寫指引
撰寫風格
- 使用清晰且扼要的語句
- 以祈使句撰寫("Use", "Implement", "Avoid")
- 具體且可執行
- 避免模糊用語,如 "should"、"might"、"possibly"
- 使用清單與要點以提高可讀性
- 保持章節重點明確且易於掃描
最佳實務
- Be Specific:提供具體範例,避免抽象說明
- Show Why:當能增加價值時解釋建議的理由
- Use Tables:比較選項或列規則時使用表格
- Include Examples:真實程式碼範例比純文字描述更有效
- Stay Current:參考當前版本與實務
- Link Resources:引用官方文件與權威資源
建議包含的常見模式
- 命名慣例:變數、函式、類別、檔案的命名方式
- 程式碼組織:檔案結構、模組組織、import 順序
- 錯誤處理:偏好的錯誤處理模式
- 相依性管理:如何管理與記錄相依性
- 註解與文件:何時以及如何撰寫註解或文件
- 版本資訊:目標語言/框架版本資訊
推薦範式
要點與清單
markdown
## 安全性最佳實務
- 始終在處理前驗證使用者輸入
- 使用參數化查詢以防止 SQL 注入
- 將機密儲存在環境變數中,切勿寫在程式碼中
- 實作適當的認證與授權機制
- 在生產環境啟用 HTTPS用於結構化資訊的表格
markdown
## 常見問題
| Issue | Solution | Example |
| ---------------- | ------------------- | ----------------------------- |
| Magic numbers | Use named constants | `const MAX_RETRIES = 3` |
| Deep nesting | Extract functions | Refactor nested if statements |
| Hardcoded values | Use configuration | Store API URLs in config |程式碼比較示例
markdown
### 良好範例 - 使用 TypeScript 介面
```typescript
interface User {
id: string
name: string
email: string
}
function getUser(id: string): User {
// 實作內容
}
```
### 不良範例 - 使用 any 類型
```typescript
function getUser(id: any): any {
// 失去型別安全
}
```條件式建議
markdown
## 框架選擇
- 小型專案:使用 Minimal API 方法
- 大型專案:採用 controller-based 架構,並明確分層
- 微服務:考慮採用領域驅動設計(DDD)應避免的模式
- 過度冗長的說明:保持簡潔且易於掃描
- 過時資訊:務必參考最新版本與實務
- 模糊不清的指引:明確指出應做或應避免的事項
- 缺乏範例:避免僅有抽象規則而無具體程式範例
- 互相矛盾的建議:確保檔案內部一致性
- 直接複製官方文件:透過整理與在地化提供額外價值
測試指引檔
在完成指引檔前:
- 在 Copilot 測試:在 VS Code 中使用實際 prompt 驗證指引效果
- 驗證範例:確認程式範例正確且可執行
- 檢查 Glob pattern:驗證
applyTo的 glob pattern 是否匹配預期檔案
範例結構
下方為建立新指引檔的最小範例結構:
markdown
---
description: '用途的簡短說明'
applyTo: '**/*.ext'
---
# 技術名稱 開發指南
簡短介紹與背景。
## General Instructions
- 高階指導要點 1
- 高階指導要點 2
## Best Practices
- 具體做法 1
- 具體做法 2
## Code Standards
### 命名慣例
- 規則 1
- 規則 2
### 檔案組織
- 結構 1
- 結構 2
## 常見模式
### Pattern 1
描述與範例
```language
code example
```
### Pattern 2
描述與範例
## 驗證
- 建構指令:`command to verify`
- Lint 指令:`command to lint`
- 測試指令:`command to test`Maintenance
- 在相依性或框架更新時檢視並更新指引
- 更新範例以反映當前最佳實務
- 移除過時的模式或已棄用的功能
- 隨社群新興模式新增相關內容
- 隨專案結構演進維護 glob pattern 的正確性