AI 加持的代码编写实战:快速实现 Nginx 配置格式化工具( 三 )


当然,除了 goja 之外,参考我之前一个的开源项目/rss-can,我们也可以使用更强悍的 v8go 来实现这个功能,实际执行速度更快一些,但会让构建文件的体积稍大一些 。
让程序能够一个文件解决战斗
前文提到,我们希望程序能够“一个文件走天下”,不需要带着一堆依赖、配置文件等乱七八糟的东西 。
我们都知道能够编译成一个文件,但是一般情况下只能处理 Go 文件的编译构建 。那么如何将变成的一部分呢?如果是你我的老读者,你一定会想起我曾经提到的 go embed 嵌入方案 。
如果你没有了解过这个技术方案,我推荐你看一下资源嵌入方案,了解它的来龙去脉、几种方案的性能几何 。
不过,这里我们想实现具体功能,并且越快越好,我们不妨直接问问 :“如何在里使用 Embed,嵌入一个 JS 文件 。”
使用追问,完成我们要的代码
比如,在上面的章节中,我们询问如何在中运行代码 。
结合实际需要,我们应该需要构建一个 Go 的格式化函数,接受一些必要的参数,比如:原始配置内容、缩进数量、缩进符 。
那么我们可以在具体的会话中,追加问题:
一般情况下,的表现是可以的:
类似上面提到的具体代码实现,我们在写工具的过程中会有许多许多 。
但是并非每次生成的代码,都能够派上用场,以及并非每次的代码都是正确的,这时,我们可以基于已经生成好的代码,进行多轮对话,让的答案,能够接近我们的需求,如果答的不对,我们可以让他重新生成 。如果多次重新生成依旧不能让你满意,那么大概率是问题提的不够贴近,我们需要适当调整问题 。
优化程序生成的代码
就上面的代码而言,虽然能够满足需求,但是写的未免太过于啰嗦 。而默认生成的代码一般都是直白的逻辑呈现,并且因为我们的提问都比较简单,所以都有一些啰嗦 。
所以,我们需要针对 GPT 生成的内容做一些优化,比如上面提到的比较关键的函数(位于项目位置 /nginx-///.go):
package formatterimport ("fmt""github.com/dop251/goja")func Formatter(s string, indent int, char string) (string, error) {if s == "" {return "", nil}vm := goja.New()v, err := vm.RunString(fmt.Sprintf("%s;FormatNginxConf(`%s`, %d, `%s`)", JS_FORMATTER, s, indent, char))if err != nil {return "", err}return v.String(), nil}
当然,在过程中你也可以咨询,具体的细节优化,函数使用 。
实战:完善程序阶段
当我们把程序的核心功能实现完毕之后,剩下的就都是比较通用的边边角角的功能或者“质量保证”相关的测试啦 。
编写一般功能,都比较简单,使用下面的句式即可完成任务:
这里就不多做展开,浪费篇幅了,我们聊聊比较典型的单元测试 。
使用 GPT 完成单元测试
应该不会有太多工程师对于写测试感兴趣,尤其是程序频繁变动的前提下,我们写的测试越多,可能随着项目变化变成废代码的可能性也就越高 。
但是,如果不需要我们动手,这个事情就能完成呢?
比如,我们将上面的代码直接粘贴到中,要求他完成单元测试 。
如果是上下文不够明确、缺少注释的函数,一般会生成比较泛的代码,如果你愿意完善注释或者多提供一些上下文,那么你将得到覆盖率 80~90%,甚至完全覆盖的测试代码 。
实战:编写效率提升
除了和聊天,笨笨的复制粘贴代码之外,是否还有更偷懒的方式写代码呢?
答案是有的,借助离线和在线的语言模型即可 。
本地代码补全模型的使用