介绍

距离上次 切换到 Hugo 主题 Even - 狂飙 已经过去两年了,使用的 Even 主题也没有什么大问题,一些想要的改动自己也就定制了。

但是最近突然发现 Even 主题的 diff 代码语法高亮有问题,全是一个颜色,无法区分出哪变化的部分。另外 Even 新版本不再使用 webpack 工具链而是改用 Hugo Pipes 来修改样式表,所以后续修改样式表更容易了。

重要: 本主题用到了 Hugo Pipes 功能。如需修改 assets 目录下的文件,请安装 extended 版。

原则

博客最重要的不是主题,而是内容。必须保证内容链接的有效性,因此要检查升级后生成的目录结构与升级前是否完全一致。

一定要负责任,放到互联网上的东西,没人希望链接突然失效,因此我们应该尽可能地保证自己的东西都是稳定可用的。

环境

  • macOS 10.14.6

版本变化

版本变化 旧版本 新版本
Hugo v0.54.0 v0.84.0
Even 主题 v4.0.0 v4.1.0

结果比较方法

在开始前先明确验证输出内容是否相同的方法。

构建概要比较

比较新旧版本 Hugo 构建之后的概要输出,比较结果看看是否有差异。

目录结构比较

使用 Beyond Compare 比较新旧版本的目录结构,在 规则 中取消勾选 比较文件大小比较时间戳,这样可以只比较文件名。

过程

Hugo

Hugo 下载指定版本,hugo_0.84.0_macOS-64bit.tar.gz,暂时解压到临时目录使用,不替换现有安装的版本。

Even 主题

主题是使用子仓库的形式管理,因此可以将改动放到单独的网站分支上。

1
2
3
4
$ git fetch upstream
$ git branch --move networm.me networm.me_hugo-v0.54.0_even-v4.0.0
$ git checkout -b networm.me_hugo-v0.84.0_even-v4.1.0
$ git rebase v4.1.0

构建网站

更新到新版本需要将自定义的改动变基到最新版本,在处理冲突后同步使用新版本 Hugo 构建,查看是否存在异常。

由于自定义修改了主页显示方式为存档,使用了旧版本的语法,因此构建时报错:

1
2
3
4
$ ~/Downloads/hugo_0.84.0_macOS-64bit/hugo server
Start building sites …
Built in 281 ms
Error: Error building site: failed to render pages: render of "home" failed: "~/networm.me/themes/even/layouts/index.html:2:29": execute of template failed: template: index.html:2:29: executing "content" at <(where .Site.RegularPages "Type" "post") .Site.RegularPages.ByDate.Reverse>: can't give argument to non-function where .Site.RegularPages "Type" "post"

修复方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
diff --git a/layouts/index.html b/layouts/index.html
index de0dba7..f20c32c 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -1,10 +1,10 @@
 {{- define "content" }}
-{{- $paginator := .Paginate ((where .Site.RegularPages "Type" "post") .Site.RegularPages.ByDate.Reverse) .Site.Params.archivePaginate }}
+{{- $paginator := .Paginate ((where .Site.RegularPages "Type" "post").ByDate.Reverse) .Site.Params.archivePaginate }}
 <section id="archive" class="archive">
   {{- if and (not $paginator.HasPrev) .Site.Params.showArchiveCount }}
   <div class="archive-title">
     <span class="archive-post-counter">
-      {{ T "archiveCounter" (len .Site.RegularPages) }}
+      {{ T "archiveCounter" (len (where .Site.RegularPages  "Type" "post")) }}
     </span>
   </div>
   {{- end -}}

alias 修复

在进行结果比较时,发现新版本 Hugo 会将 alias 生成到 url 相同的路径下,例如

就会将 find-merge-conflict-files.html 生成到 /2014/05/07/ 目录下。

修复起来也很简单,只需要在首部增加 / 表示绝对路径即可。

1
2
3
4
5
 ---
 aliases:
-  - find-merge-conflict-files.html
+  - /find-merge-conflict-files.html
 url: /2014/05/07/find-merge-conflict-files/

在 Visual Studio Code 中使用正则表达式进行批量文件查找替换:aliases:\n - ([^/]) 替换为 aliases:\n - /$1,这里注意查找时使用了 [^/] 来防止替换到以 / 开头的正确 alias。

编译警告

1
WARN 2021/06/12 22:34:09 Page.URL is deprecated and will be removed in a future release. Use .Permalink or .RelPermalink. If what you want is the front matter URL value, use .Params.url

全局搜索 .URL 然后一点一点替换,找到产生问题的地方。经过实际查找替换,只有两个文件存在问题。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
diff --git a/layouts/index.html b/layouts/index.html
index f20c32c..f1f242f 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -23,7 +23,7 @@
       {{ $element.Date.Format "2006-01-02 Mon" }}
     </span>
     <span class="archive-post-title">
-      <a href="{{ $element.URL }}" class="archive-post-link">
+      <a href="{{ $element.Permalink }}" class="archive-post-link">
         {{ .Title }}
       </a>
     </span>
diff --git a/layouts/share/single.html b/layouts/share/single.html
index fcda0dd..54e95e9 100644
--- a/layouts/share/single.html
+++ b/layouts/share/single.html
@@ -53,14 +53,14 @@
       <!-- Post Pagination -->
       <nav class="post-nav">
         {{ with .NextInSection -}}
-          <a class="prev" href="{{ .URL }}">
+          <a class="prev" href="{{ .Permalink }}">
             <i class="iconfont icon-left"></i>
             <span class="prev-text nav-default">{{ .Title }}</span>
             <span class="prev-text nav-mobile">{{ T "prevPost" }}</span>
           </a>
         {{- end }}
         {{ with .PrevInSection -}}
-          <a class="next" href="{{ .URL }}">
+          <a class="next" href="{{ .Permalink }}">
             <span class="next-text nav-default">{{ .Title }}</span>
             <span class="next-text nav-mobile">{{ T "nextPost" }}</span>
             <i class="iconfont icon-right"></i>

结果比较

上面的每一步都需要进行结果比较,尽可能早地发现问题。

所有提交处理后,再次进行比较,目录结构没有差异,但是概要显示页面数量减少了 2 页。既然最终生成的目录结构完全一致,就不去查找为什么页面数量差 2 页了。

结果

打开现在的博客的源代码,即可以看到如下字样,证明升级成功:

1
<meta name="generator" content="Hugo 0.84.0 with theme even">

已经将修改结果提交到 Fork 后的仓库 networm.me_hugo-v0.84.0_even-v4.1.0 默认分支中:

之前的旧版本放在 networm.me_hugo-v0.54.0_even-v4.0.0 分支中。