新增套件管理器¶
這份指南逐步說明如何為新的程式語言或套件管理器加上支援。
開始之前¶
新增語言或套件管理器之前,請先確認以下幾點。
- cdxgen 支援情況:查看 cdxgen 支援的專案類型。如果已經有官方的 cdxgen 語言映像檔,只要把它加到路由表就夠了。
- syft 支援情況:需要分析二進位檔案或映像檔時,查看 syft 支援的生態系。
- 是否需要自訂分析器:只有在兩個工具都不支援該生態系時,才考慮自訂分析指令碼。
原始碼掃描採用兩階段設計,會路由到各語言的官方 cdxgen 映像檔,而不是共用單一映像檔。完整脈絡請看架構。
步驟¶
1. 新增語言偵測與映像檔路由¶
docker/lib/source-detect.sh 是 CLI 與網頁介面共用的偵測邏輯。要修改兩個函式。
detect_lang()—— 加上一條規則,從專案的 manifest 檔案判斷語言(例如 Kotlin 會檢查build.gradle.kts—— Kotlin 已經涵蓋在java分支裡)。img_for_lang()—— 加上對應該語言的官方 cdxgen 映像檔。
# img_for_lang() 範例 —— 新增一個語言項目
newlang) echo "ghcr.io/cyclonedx/cdxgen-debian-newlang:$CDXGEN_TAG" ;;
2. 需要準備相依項目時,修改 build-prep.sh¶
如果該生態系在沒有鎖定檔案的情況下,cdxgen 無法解析間接相依,就把準備邏輯加到 docker/lib/build-prep.sh——它會在 cdxgen 執行前建立鎖定檔案。Rust (cargo generate-lockfile) 與 Go (go mod download) 是既有的先例。這段準備要寫成盡力而為 (best-effort) 的形式,絕對不能讓掃描因此失敗。
3. 新增範例專案¶
在 examples/ 目錄底下加入範例專案。
examples/kotlin/
├── README.md # 範例說明
├── build.gradle.kts # 建置檔案
├── gradle.lockfile # 鎖定檔案(必要!)
└── src/main/kotlin/
└── Main.kt
為什麼鎖定檔案很重要:cdxgen 會從鎖定檔案取出精確的版本資訊。沒有鎖定檔案,相依項目的偵測就不完整。
4. 新增測試¶
建立 tests/cases/test-{語言}.sh 檔案。撰寫方式的細節請看測試指南。
#!/usr/bin/env bash
set -euo pipefail
source "$(dirname "$0")/../helpers/assert.sh"
source "$(dirname "$0")/../helpers/setup.sh"
TEST_NAME="Kotlin Gradle 原始碼分析"
EXAMPLE_DIR="examples/kotlin"
setup_test "$TEST_NAME"
run_scan \
--project "KotlinExample" \
--version "1.0.0" \
--target "$EXAMPLE_DIR" \
--generate-only
assert_file_exists "KotlinExample_1.0.0_bom.json"
assert_json_field ".bomFormat" "CycloneDX"
assert_json_field ".specVersion" "1.6"
assert_components_count_gte 1
assert_purl_prefix "pkg:maven/"
teardown_test
接著在 tests/test-scan.sh 註冊這個新測試。
5. 更新文件¶
新增語言之後,要更新下列文件。
6. 送出 PR¶
依照貢獻指南送出 PR,並在 PR 說明中包含以下內容。
- 你新增的語言或套件管理器名稱
- 測試執行結果(螢幕截圖或日誌)
- 產出的 SBOM 輸出範例
範例:新增 Kotlin 支援¶
Kotlin 使用 Gradle 建置系統,執行在 JVM 上,因此直接沿用 detect_lang() 的 java 分支(它會偵測 *.gradle.kts)與 cdxgen-temurin-java21 映像檔。
如何產生 Gradle 鎖定檔案¶
cd examples/kotlin
# 在 build.gradle.kts 加上相依項目鎖定設定
cat >> build.gradle.kts << 'EOF'
dependencyLocking {
lockAllConfigurations()
}
EOF
# 產生鎖定檔案
./gradlew dependencies --write-locks
預期的 SBOM 輸出(components 的一部分)¶
{
"components": [
{
"type": "library",
"name": "kotlin-stdlib",
"version": "1.9.21",
"purl": "pkg:maven/org.jetbrains.kotlin/kotlin-stdlib@1.9.21"
}
]
}
Kotlin 與 Maven 共用同一個生態系,所以它的 PURL 使用 pkg:maven/ 前綴。
檢查清單¶
送出新增語言的 PR 之前,請逐項確認。
- [ ] 偵測規則與映像檔路由已加到
docker/lib/source-detect.sh。 - [ ] 如果需要準備間接相依,已反映在
docker/lib/build-prep.sh。 - [ ]
examples/{語言}/底下有範例專案。 - [ ] 範例專案包含鎖定檔案。
- [ ] 已撰寫
tests/cases/test-{語言}.sh測試。 - [ ] 測試已在
tests/test-scan.sh註冊。 - [ ]
./tests/test-scan.sh全部執行通過。 - [ ]
README.md的支援語言清單已更新。 - [ ] 範例指南已加上範例章節。
- [ ] 使用指南的疑難排解表格已更新。