Golang静态文件嵌入库 - Airfreight的使用与实践

Golang静态文件嵌入库 - Airfreight的使用与实践 问候。这类库已经有很多了。不管好坏,我又造了一个轮子 🙂

GitHub: https://github.com/lassik/airfreight

使用示例: https://github.com/lassik/airfreight/tree/master/example

这个库是专为 go.mod 项目从头构建的。你可以在项目中添加一个简单的辅助程序,例如 staticgen/main.go。这个辅助程序会调用 airfreight 的打包 API,将你的静态资源打包成一个或多个自动生成的 .go 文件。你项目真正的主程序通过 //go:generate go run staticgen/main.go 来引用这个辅助程序。之后你只需要运行 go generate && go build 即可构建项目。得益于 Go 的新模块系统,你无需担心如何下载或安装 airfreight,也不用考虑 go generate 如何找到其打包器可执行文件——这一切都能直接运行。

其他主要特性:

  • 极其轻量(因此得名)
  • 设计上尽可能可组合(例如生成的文件本质上只包含字符串映射,你可以随意组织静态文件和 Go 文件)
  • 没有配置选项。你在 staticgen/main.go 中描述静态映射并将该文件提交到版本控制;之后只需运行 go generate,总能获得相同的行为。例如,没有用于代码实时重载的"开发者模式"。

开发这个库的动机是,我使用过其他一些库,它们复杂的行为总是妨碍应用程序的编写和发布。而这个库尽可能不干扰你的工作流程。缺点在于它没有那么多功能。


更多关于Golang静态文件嵌入库 - Airfreight的使用与实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang静态文件嵌入库 - Airfreight的使用与实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Airfreight 是一个设计简洁的 Go 静态文件嵌入库,它通过生成 Go 代码文件来嵌入静态资源,避免了运行时依赖或复杂配置。以下是一个基本的使用示例,展示如何集成到你的项目中。

首先,在项目中创建一个辅助程序文件 staticgen/main.go,用于调用 Airfreight 的打包 API:

package main

import (
    "github.com/lassik/airfreight"
    "log"
)

func main() {
    err := airfreight.Pack(airfreight.Config{
        InputDir:  "./static",   // 静态文件目录
        OutputDir: "./packaged", // 生成的 Go 文件输出目录
        Package:   "packaged",   // 生成的 Go 文件包名
    })
    if err != nil {
        log.Fatal(err)
    }
}

在项目根目录的 Go 文件中,添加 go:generate 指令来触发静态文件生成:

//go:generate go run staticgen/main.go

package main

import (
    "embed"
    "net/http"
)

// 通过 embed.FS 引用生成的静态文件
//go:embed packaged/*
var staticFiles embed.FS

func main() {
    // 使用 embed.FS 提供静态文件服务
    http.Handle("/", http.FileServer(http.FS(staticFiles)))
    http.ListenAndServe(":8080", nil)
}

运行以下命令生成静态文件并构建项目:

go generate
go build

这个示例演示了 Airfreight 的核心用法:通过辅助程序生成包含静态资源的 Go 文件,然后在主程序中使用 embed.FS 嵌入这些文件。由于 Airfreight 设计轻量且无配置选项,它确保了构建过程的一致性和可重复性。对于需要简单、可控的静态文件嵌入场景,这是一个有效的解决方案。

回到顶部