最近在找一个将 html 转化为 md 的工具,后来发现 html2md 这个项目还不错,打算基于它做些改造。不过 html2md 是个 golang 项目,而我自己不想在电脑上安装 golang 环境,故便考虑通过 docker 来编译这个项目。以下对过程做些记录。
$go-lab
docker 中安装 golang 环境
下载镜像
docker pull golang
新建 gopath 目录及项目源码目录 projects,将在运行容器时做映射
# docker 中默认 /go 为 gopath mkdir $go-lab/go # 用于存放 golang 项目源码 mkdir $go-lab/projects
需要将项目源码目录与 gopath 目录分开,这是 go mod 的要求。
projects
cd $go-lab/projects git clone https://github.com/TruthHun/html2md
在 docker 容器中运行
运行容器并进入容器
cd $go-lab docker run --rm -it -v $PWD/go:/go -v $PWD/projects:/root --name html2md golang bash
在容器中设置环境变量
go env -w GOPROXY=https://goproxy.cn,direct
关键:GOPROXY 代理最好要设置,因为 golang 的许多依赖是被 GFW 给墙了,不设置带来会导致依赖无法下载。
编译 go mod 管理的项目
下载依赖
cd /root/html2md # 下载依赖包,内容会存放在容器内 /go/pkg/mod 目录中 go mod tidy
go mod init project_name
go mod tidy
go mod download
go clean -modcache
编写 golang 项目,引用 html2md 库
mkdir $go-lab/demo # 创建 html2md.go 文件 vi $go-lab/demo/html2md.go
html2md.go
package main import ( "fmt" "os" "io/ioutil" "github.com/TruthHun/html2md" ) func main() { args := os.Args if args == nil || len(args) < 2 { Usage() return } input := args[1] output := args[2] fmt.Println("input file is: ", input, "\noutput file is: ", output) b, _ := ioutil.ReadFile(input) md := html2md.Convert(string(b)) ioutil.WriteFile(output, []byte(md), 0777) } var Usage = func() { fmt.Println("Usagge: ---") }
编译项目
go build html2md.go
编译完成后,在目录下生成 html2md 可执行文件。
测试 html2md 工具
html2md code.html code.md
查看是否正确生成 code.md
交叉编译
go build
# 编译 mac 可用的可执行文件,生成 html2md CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build html2md.go # 编译 windows 下的可执行文件,生成 html2md.exe CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build html2md.go