Hugo 不完美教程 - III: Hugo Modules 模块

前言

shot.jpg

本静态站点用于演示之用,使用 Hugo 构建,以及 Markdown 供应内容。

流行的静态站点框架有以下几个:

演示站点有两个访问入口:

此站点提供了一篇关于 Hugo 静态站点生成框架的入门教程。

代码仓库地址如下,查看 hugo-project 分支是原文件,master 分支是发布的静态站点文件:


title: "III: Hugo Modules 模块"
description: "坚果的 Hugo 教程"
date: 2020-08-06T20:14:08-04:00
featured_image_: "/assets/IMG_20181101_233654_s.jpg"
thumb_image_: "/assets/micro_s.png"
summary: Hugo Modules 是基于 Go Modules 实现的,模块 Hugo 构建的核心块,一个模块可以一个 Hugo 工程,也可以是 Hugo 定义的 7 种小模块 static, content, layouts, data, assets, i18n, archetypes,可以按喜欢的方式组件使用模块,甚至从工程外部装入模块目录以构建一个大型的虚拟联合文件系统。
tags: ["hugo"]


目录:

[TOC]

Hugo Modules 模块

Hugo Modules 是基于 Go Modules 实现的,模块 Hugo 构建的核心块,一个模块可以一个 Hugo 工程,也可以是 Hugo 定义的 7 种小模块 static, content, layouts, data, assets, i18n, archetypes,可以按喜欢的方式组件使用模块,甚至从工程外部装入模块目录以构建一个大型的虚拟联合文件系统。

Go Modules 有哪些特点:

  • Go Modules 是官方正式推出的包依赖管理项目;
  • Go Modules 出现的目的之一就是为了解决 GOPATH 的问题,相当替换 GOPATH。旧项目必须在 $GOPATH/src 里进行,现在允许在任何目录下使用 go.mod 管理项目依赖。
  • 使用模块代理协议 Module proxy protocol,通过这个协议可以使用 Go 模块镜像,使用 github 获取依赖。
  • Tag 必须遵循语义化版本控制,如果没有将忽略 Tag,然后根据你的 Commit 时间和哈希值再为你生成一个假定的符合语义化版本控制的版本号。
  • Go Modules 默认认为,只要你的主版本号不变,那这个模块版本肯定就不包含 Breaking changes,因为语义化版本控制这么规定。
  • Global Caching 全局缓存数据,同一个模块版本的数据只缓存一份,共享使用,位于 GOPATH/pkg/mod** 和 **GOPATH/pkg/sum 目录下;
  • 使用 go clean -modcache 清理所有已缓存的模块版本数据。
  • 使用 go mod 命令管理模块。

另外在 Go1.11 之后 GOCACHE 已经不允许设置为 off 了,默认使用模块数据缓存。

Go Moduels 项目配置文件 go.mod 描述了当前项目,也可以看作是当前模块的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module 用于定义当前项目的模块路径。
  • go 用于设置预期的 Go 版本。
  • require 用于设置一个特定的模块版本。
  • exclude 用于从使用中排除一个特定的模块版本。
  • replace 用于将一个模块版本替换为另外一个模块版本。

这里的填写格式基本为包引用路径+版本号,另外比较特殊的是 go $version,目前从 Go1.13 的代码里来看,还只是个标识作用。

模块基本用法

在国内网络访问 proxy.golang.org 会有问题,使用 Go Modules 代理可以解决,使用 go env 设置 Go 使用环境变量:

go env -w GO111MODULE="on"
go env -w GOPROXY=https://goproxy.io,direct

goget 也是一个常用的模块安装工具,它可以从 github 获取安装 golang.org 上的模块:

go get github.com/leconio/goget
goget golang.org/x/xxx

使用 go mod 命令创建模块项目:

go mod init github.com/islishude/gomodtest

这时可看到目录内多了 go.mod 文件,内容很简单只有两行:

module github.com/islishude/gomodtest

go 1.12

首行为当前的模块名称,接下来是 go 的使用版本。这两行和 npm package.json 的 name 和 engine 字段的功能很类似。

创建一个 main.go 来测试模块的管理功能,引用 quote 模块作为测试:

package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}

后面就可以直接使用 go run、go build、go test 等命令,因为使用了 Go Module,它们能自动下载相关依赖包。

>go build
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
...

执行完成,go.mod 会自动更新一个依赖设置:

module github.com/islishude/gomodtest

go 1.14

require rsc.io/quote v1.5.2

Hugo 中的模块

将 Hugo 项目初始为一个模块:

hugo mod init github.com/gohugoio/myShortcodes

相应地会在模块配置文件上添加当前模块的名称定义:

module github.com/gohugoio/myShortcodes

在 Hugo 项目中,模块配置错误会出现以下信息:

Module "xxx" not found

这时,需要检查引用模块名是不是正确的,是否已经安装。比如引用主题目录下的 gohugo-theme-iris 模块,但在在配置文件中写成 hugo-theme-iris,就会导致模块找不到。

将主题模块导入,Hugo 文档使用的主题是模块方式导入的,见 config.toml 配置文件:

[module]
  [module.hugoVersion]
    min = "0.56.0"
  [[module.imports]]
    path = "github.com/gohugoio/gohugoioTheme"

模块导入可以设置 Hugo 版本要求 [module.hugoVersion]。

通常,以 Github 仓库创建主题的方式为常用,

hugo mod init github.com/<your_user>/<your_project>

设置 Module Imports 后会下载主题,可以使用 hugo mod get 来管理版本:

# Update All Modules 
hugo mod get -u

# Update All Modules Recursively New in v0.65.0
hugo mod get -u ./...

# Update One Module 
hugo mod get -u github.com/gohugoio/myShortcodes

# Get a Specific Version 
hugo mod get github.com/gohugoio/myShortcodes@v1.0.7

# Print Dependency Graph
hugo mod graph

使用专用的供应目录来存储 Modules,以下命令会将依赖模块放到 _vendor 目录下管理,对后面的构建生效:

hugo mod vendor 

注意:

  • 可以在 module tree 任意层级上使用此命令。
  • 供应化管理 Vendoring 不会保存 themes 目录下的模块。
  • 大多数命令接收 --ignoreVendor 选项来忽略 _vendor 目录。

管理命令参考

升级次级或补丁版本号:

go get -u rsc.io/quote

仅升级补丁版本号:

go get -u=patch rscio/quote

升降级版本号,可以使用比较运算符控制:

go get foo@'<v1.6.2'

移出所有代码中不需要的包:

go mod tidy

如果仅仅修改 go.mod 配置文件,比如要移出 crypto 包

go mod edit --droprequire=golang.org/x/crypto

对文件进行文本格式化。

go mod edit -fmt

模块发布包的新版本和其它包管理工具基本一致,可以直接打标签,不过打标签之前需要在 go.mod 中写入相应的版本号:

$ go mod edit --module=github.com/islishude/gomodtest/v2
$ cat go.mod
module github.com/islishude/gomodtest/v2

go 1.12

require (
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
    rsc.io/quote v1.5.2
)

官方推荐将上述过程在一个新分支来避免混淆,那么类如上述例子可以创建一个 v2 分支,但这个不是强制要求的。

还有一种方式发布新版本,那就是在主线版本种加入 v2 文件夹,相应的也需要内置 go.mod 这个文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352