大年初五,GitHub给我送来了迟到的新年礼物:Copilot技术预览版的测试资格——而距离我提交申请,已经过去了近三个月的时间。Copilot开发团队称Copilot可以帮助开发者快速使用一门不熟悉的编程语言进行功能实现,而作为一名半吊子程序员,在博客迁移的过程中我正面临着自动化文章发布流程的问题。此前还在担心对于SHELL SCRIPT比较陌生,自动化脚本的编写会比较困难。刚好趁此机会,感受一下Copilot的功能。虽然在此前已经在官方的demo中见识到了Copilot的强大,但实际使用的过程中还是被惊到——它不仅仅是在GitHub庞大的代码库中进行检索和匹配,还能预测到我下一步想要进行的操作。而我自己,在很多时候,只需要一直按tab就够了。

在本篇文章中,我将结合自动化发布脚本的实现,对Copilot的使用感受进行介绍。然后再简单介绍一下访问分析工具的部署和域名映射的过程。

博文自动化发布

新年新家系列的第二篇文章中,我总结了文章从完成写作到发布的四个步骤:

  1. 从Hugo模板新建博文.md文件;
  2. 导入Obsidian中的写好的内容,并调整图片等markdown语法格式以能够被Hugo识别;
  3. 网站编译;
  4. 上传到托管平台。

而实现博文的自动化发布,就是希望通过编写SHELL脚本,通过一行命令完成以上四个步骤。

我将脚本的实现分为以下几个模块:初始化、meta-data(Front Matter)调整、格式调整以及编译发布,下面依次进行介绍。

初始化

在初始化模块,主要涉及参数传递和路径设置。 值得一提的是,在.sh脚本文件头部,通过注释写完功能简介之后,Copilot竟然自己通过文件名推断出了Author信息,并帮我添加到了后续的注视中。比较奇怪的是,Copilot联想出来的时间信息不是当天,而是2008年的一天,不知是何原因。

参数传递

发布文章时需要指定用于生成博文路径(url)的Hugo目录中的文件名filename、Obsidian中对应的文件名article_name.md、标签tags以及发布标识符auto_publish1

# filename is used to define the url of the post
filename=$1

# article_name is used to identify the file in obisidian workspace
article_name=$2

# tags are used to define the tags of the post
tags=$3

# auto_publish is used to define whether the post should be published automatically
auto_publish=$4

在编写参数说明的过程中,基本上只需要键入参数名,Copilot就可以补全后续的说明本文,比如

@王北洛

@王北洛

工作路径

需要分别设定Hugo ProjectObsidian Workspace的工作路径,并将Obsidian Workspace下的图片复制到Hugo Project中:cp -r "$obsidian_workspace_path"/images/. "$hugo_project_path"/static/images

在完成参数和工作路径的设置之后,便可以通过cd $hugo_project_path & hugo new posts/$filename.md命令创建新博文。

Front Matter调整

在创建好的新博文$filename.mdFront Matter中,title默认的是$filenametags是模版中设定的初始值,需要分别对其进行修改,即找到$filename.md文件中对应titletags行进行内容替换。作为一个并不熟悉SHELL命令的人,我的想法是写一个for循环逐行查找。就在我键入相关注释文本之后,奇迹发生了:

@王北洛

@王北洛

Copilot不但给我提供了实现功能的脚本代码,还准确地预测到了我将要进行tags信息的替换!

至此,我已经拜倒于Copilot的强大功能之下,并开始喜不自胜——再也不用读函数文档啦——虽然我不了解sed,但一点也不妨碍Copilot帮我调用!当然,现实并没有这么美好,此时的沾沾自喜为我后面的踩坑埋下了伏笔。

调整完Front Matter,还需要进行博文主体内容的合并,简单的cat命令就可以实现:cat "$article_path" >> $filename.md

格式调整

由于Hugo不支持在$filename.md中直接调用html语句,要想实现图片居中和添加caption的功能,需要通过shortcode曲线救国。所以需要查找出$filename.md中涉及插入图片的段落进行修改。这不是一个简单的功能,但此时的我信心百倍,我深信,只要简单地在注释中写下:“edit the image script with caption from markdown to hugo shortcode”,只需要零点几秒钟,Copilot便会用魔法变出它的实现。不出我所料,Copilot马上给出了基于sed函数的实现。运行测试一下,sed error: ... \2 not defined in the RE,竟然报错了。

没关系,Copilot提供了好几种实现,试试其他的。errorerror、输出结果不符合期待、error……当我把所有实现都试了一遍却没有一个可以正常工作的时候,我开始慌了。看着sed语句中密密麻麻的符号,我这时才意识到,我对这个函数一无所知。

接下来便是漫长的爬坑,从stackoverflow到函数文档,历时半个下午,我才把这行代码调通——只是一个很简单的参数传递格式的问题。回去审视一下Copilot提供的代码,功能上满足要求的只有两种实现,而这两种实现都是错的。

原来Copilot也会犯错。

编译发布

因为考虑到有时还要在博文中添加一些视频和js脚本,而Obsidian本身对这两者的支持并不好,需要单独对$filename.md进行编辑,不能直接发布,所以定义了auto_publish的参数用来判断是否执行编译发布模块。

这部分的脚本编写十分顺利,在# publish the post when auto_publish is true的指引下,一路tab就完成了。

关于Copilot

关于Copilot,我最后再谈一下我的看法。它的功能不可谓不强大,甚至超出了我的想象。但是在使用的过程中,极易对其产生依赖性,甚至丧失独立思考的能力。对于一门不熟悉的编程语言,一旦遇到Copilot无法解决的问题或者给出的错误代码,由于没有线性的学习过程,很容易陷入手足无措的局面。

但我还是会坚持使用Copilot,因为它确实能极大地提高功能实现的效率,并且不乏优秀的实现方案。我对自己的要求是,每一次按下tab键的时候,我至少要知道为什么。

访问分析工具

很多互联网大厂都提高免费的网站访问分析工具,比如Google AnalyticsBing Webmaster Tools以及Yandex metricad等。我没有太仔细地调研彼此间的差异,图方便直接选择了Google Analytics。配置过程比较方便,按照官网指引一步步操作,将提供的网站跟踪ID填入Hugo工程的配置文件中即可。

域名映射

博客迁移的最后一步是域名映射。

从2021年12月16日在Google Blogger发布第一篇文章,到今天也就不到两个月的时间。但我却感觉过了很久,已经习惯了时常打开管理主页看一看访问人数的增长,为每一个微小数字的增加而洋洋得意。在博客访问量即将突破1000的时候,我一遍又一遍地刷新管理页面,生怕错过了截图的时刻。在2022年1月15日深夜11:50,终于达到了博客访问量1000的目标,我把它截图发在了朋友圈里,“One Small Step”。

现在,我即将和Google Blogger说再见,希望自己在新的平台,用新的方式,坚持书写不变的初心,成为一名真正的写作者


  1. 不将article_name直接作为filename的原因在于article_name一般为中文,将其用于url看起来不够和谐。 ↩︎