返回

Go 开发自动拉取 git 的 vitepress 文档并编译部署的简单脚本

后端

前言

在软件开发过程中,文档是必不可少的。文档可以帮助开发人员和用户了解软件的功能、用法和注意事项,也可以帮助维护人员更好地维护软件。

传统的文档通常是以 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 流程中实现文档的自动构建和部署。

该脚本可以帮助开发人员快速、轻松地创建和更新文档,同时可以确保文档始终与最新的代码保持一致。