feat+docs:tag 安裝支援(#38)——version 讀 build info、README 安裝章節改以 go install 為主

This commit is contained in:
ceo
2026-09-13 00:09:56 +08:00
parent 36a50b95ed
commit 5a48fdd590
3 changed files with 68 additions and 7 deletions
+16 -1
View File
@@ -15,6 +15,7 @@ import (
"flag"
"fmt"
"io"
"runtime/debug"
"sort"
"strings"
"time"
@@ -23,8 +24,22 @@ import (
)
// Version 是目前開發中的版本號。採用語意化版本;正式發佈前以 0 開頭。
// 僅作為 fallback:以 `go install module@version` 或納入其他 module 建置時,
// buildVersion 會改用 build info 內的 module 版本(見 runVersion)。
var Version = "0.1.0-dev"
// buildVersion 回傳應顯示的版本字串。go install pkg@tag 建置的二元檔
// 會在 Main.Version 帶入 tag(如 v0.1.0);本機 go build 則為 "(devel)" 或空,
// 此時退回開發版本號 Version。
func buildVersion() string {
if info, ok := debug.ReadBuildInfo(); ok {
if v := info.Main.Version; v != "" && v != "(devel)" {
return v
}
}
return Version
}
// ExitCode 是 Run 回傳的行程結束碼。
type ExitCode int
@@ -437,7 +452,7 @@ func runVersion(env *Env, args []string) error {
if len(args) > 0 {
return &ErrUsage{Msg: "version 不接受參數"}
}
fmt.Fprintf(env.Out, "teai version %s\n", Version)
fmt.Fprintf(env.Out, "teai version %s\n", buildVersion())
return nil
}
+32
View File
@@ -0,0 +1,32 @@
// version_test.go 驗證版本字串解析:go test 環境 Main.Version 為 "(devel)"
// 時應退回開發版本號;-ldflags 覆寫測試 tag 行為則由建置驗證涵蓋。
package cli
import (
"strings"
"testing"
)
// TestBuildVersionFallsBackToDev 確認本地測試環境(Main.Version == "(devel)")
// 退回 Version;同時確保輸出是可讀版本字串(非空、無括號)。
func TestBuildVersionFallsBackToDev(t *testing.T) {
v := buildVersion()
if v == "" {
t.Fatalf("buildVersion 不應為空")
}
if strings.ContainsAny(v, "()") {
t.Errorf("buildVersion 不應含內部佔位(括號),得到:%q", v)
}
}
// TestRunVersionUsesBuildVersion 確認 version 命令輸出 buildVersion 的結果。
func TestRunVersionUsesBuildVersion(t *testing.T) {
stdout, _, code := run("version")
if code != 0 {
t.Fatalf("version 應回 0,得到 %d", code)
}
want := "teai version " + buildVersion()
if !strings.Contains(stdout, want) {
t.Errorf("version 輸出應含 %q,得到:%q", want, stdout)
}
}