Go 开发自动拉取 git 的 vitepress 文档并编译部署的简单脚本
2024-01-20 06:14:26
前言
在软件开发过程中,文档是必不可少的。文档可以帮助开发人员和用户了解软件的功能、用法和注意事项,也可以帮助维护人员更好地维护软件。
传统的文档通常是以 Word、PDF 或 HTML 等格式存储的。这些文档通常是静态的,无法及时反映软件的最新状态。此外,这些文档通常需要手动更新,更新过程繁琐且容易出错。
为了解决这些问题,近年来出现了许多新的文档工具,这些工具可以帮助开发人员快速、轻松地创建和更新文档。这些工具通常使用 Markdown 作为文档的格式,Markdown 是一种轻量级的标记语言,易于学习和使用。
Vitepress 是一个基于 Vue 的文档生成器,它可以帮助开发人员快速创建和更新文档。Vitepress 文档可以编译成静态站点,静态站点可以部署到任何地方,例如 GitHub Pages、Vercel 或 Netlify。
本文介绍了使用 Go 语言编写的脚本,该脚本可以自动拉取 git 仓库中的 vitepress 文档,并将其编译成静态站点,最后将其部署到指定的位置。该脚本可以用于在 CI/CD 流程中实现文档的自动构建和部署。
脚本实现
该脚本使用 Go 语言编写,它依赖于以下库:
import (
"context"
"fmt"
"io"
"os"
"os/exec"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/go-git/go-git/v5/plumbing/transport"
"github.com/go-git/go-git/v5/plumbing/transport/http"
)
该脚本首先从 git 仓库中克隆文档项目:
func cloneRepo(repoURL string, targetDir string) error {
ctx := context.Background()
auth := http.BasicAuth{
Username: "username",
Password: "password",
}
opts := &git.CloneOptions{
Auth: &auth,
URL: repoURL,
}
_, err := git.PlainClone(targetDir, false, opts)
return err
}
克隆完成后,该脚本切换到最新的分支:
func checkoutBranch(repoDir string, branchName string) error {
repo, err := git.PlainOpen(repoDir)
if err != nil {
return err
}
headRef, err := repo.Head()
if err != nil {
return err
}
_, err = repo.Checkout(&git.CheckoutOptions{
Branch: plumbing.ReferenceName(fmt.Sprintf("refs/heads/%s", branchName)),
Force: true,
})
if err != nil {
return err
}
if headRef.Name() == plumbing.ReferenceName(fmt.Sprintf("refs/heads/%s", branchName)) {
return nil
}
return fmt.Errorf("failed to checkout branch %s", branchName)
}
切换到最新的分支后,该脚本拉取最新的代码:
func pullRepo(repoDir string) error {
repo, err := git.PlainOpen(repoDir)
if err != nil {
return err
}
err = repo.FetchContext(context.Background(), &git.FetchOptions{})
if err != nil {
return err
}
return nil
}
拉取最新的代码后,该脚本编译 vitepress 文档:
func buildVitepress(repoDir string, outputDir string) error {
cmd := exec.Command("pnpm", "build")
cmd.Dir = repoDir
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
return err
}
return nil
}
编译完成后,该脚本将编译后的静态站点复制到指定的位置:
func copyStaticSite(sourceDir string, targetDir string) error {
err := os.RemoveAll(targetDir)
if err != nil {
return err
}
err = os.MkdirAll(targetDir, 0755)
if err != nil {
return err
}
err = copyDir(sourceDir, targetDir)
if err != nil {
return err
}
return nil
}
脚本使用
该脚本可以通过以下方式使用:
func main() {
repoURL := "https://github.com/username/repo.git"
repoDir := "/tmp/repo"
branchName := "master"
outputDir := "/tmp/output"
targetDir := "/tmp/target"
err := cloneRepo(repoURL, repoDir)
if err != nil {
fmt.Println(err)
return
}
err = checkoutBranch(repoDir, branchName)
if err != nil {
fmt.Println(err)
return
}
err = pullRepo(repoDir)
if err != nil {
fmt.Println(err)
return
}
err = buildVitepress(repoDir, outputDir)
if err != nil {
fmt.Println(err)
return
}
err = copyStaticSite(outputDir, targetDir)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Successfully built and deployed vitepress documentation")
}
总结
本文介绍了使用 Go 语言编写的脚本,该脚本可以自动拉取 git 仓库中的 vitepress 文档,并将其编译成静态站点,最后将其部署到指定的位置。该脚本可以用于在 CI/CD 流程中实现文档的自动构建和部署。
该脚本可以帮助开发人员快速、轻松地创建和更新文档,同时可以确保文档始终与最新的代码保持一致。