最近在找一个将 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