我发布了自己第一个由ChatGPT辅助开发的开源项目goattribute

news/2024/7/10 20:20:13 标签: chatgpt, 开源, java, 开发语言

需求产生

前两天在工作过程中又遇到了一直以来困惑我的一个问题,就是Go配置项的管理问题。

在开发一个新项目的时候,往往涉及到配置项的管理。个人小项目可能会通过配置文件来传入、环境变量来传入,也可能通过命令行参数来传入,公司级别的项目还可能用到各种各样的config center。那么,如何来管理这些配置项就会很麻烦。

在我的习惯中,通常会使用至少两种方式来传入配置——如配置文件加命令行。原因有三:

  • 大部分情况下我运行的程序无需进行定制化,此时常使用默认配置文件。但有时候我们要临时修改一些选项,可以直接通过命令行参数传入覆盖默认配置

  • 我通常会将默认配置文件直接添加到Git仓库里,但其中有部分包含敏感信息的配置(如加密密钥),我需要通过其他方式传入,如环境变量、命令行等

  • 程序如果需要同时在测试环境和生产环境运行,我可以通过命令行选项来控制一些选项,而无需准备两个不同的配置文件

以往在命令行覆盖配置文件中配置项的时候,有一个很大的痛点就是,我不可能给每一个配置项都编写一个对应的命令行参数,而且随着项目的迭代,每次添加新的配置项都要添加对应的命令行参数,不太方便。

Go生态里有一个开源项目viper可以用于处理类似的问题,但是项目比较大,和pflagcobra的耦合也比较深。

其实我需要的功能很简单,一个类似Java -Dserver.port=8000中的-D这样的选项,让我可以动态的修改配置文件中的一些配置项。这样,不管配置来自哪里,里面有哪些字段,我都可以通过-Da.b.c=1这样的方式来修改。

ChatGPT辅助开发

按照我的这个痛点,我准备开发一个库,这个库的工作很简单,就是可以使用一定的语法,获取和设置任意对象中的属性。

比如,下面这个YAML对应的对象(这实际上是一个docker-compose.yml的配置文件):

version: "2.0"
services:
  web:
    image: openjdk:8-jre
    ports:
      - "8080:8080"
      - "8081:8081"

我要将web容器的镜像由openjdk:8-jre换成openjdk:8-jdk,可以编写这样的语句:services.web.image=openjdk:8-jdk;如果我想将8080端口修改成9090,则可以编写这样的语句:services.web.ports[0]=9090:8080

这并不是一个非常困难的项目,但作为一个尊贵的ChatGPT Plus会员,我想让GPT4辅助我完成这个项目代码的编写。

首先,我们需要将自己的需求清晰地描述给ChatGPT,比如,我将我的需求抽象成一个名为SetAttr的函数,并将这个函数的作用和例子发给它:

5ff260e625086e21d68c0b7fac6833b9.png

ChatGPT返回给我的函数,看起来大致没有什么问题。接着,我还让其帮忙生成了与SetAttr对应的GetAttr函数,由于前面已经生成过SetAttr,所以对于GetAttr函数的描述可以比较简单,GPT4具有一定逻辑思考能力:

fa506bb5ddf2fe57b16572d542f81487.png

这两个函数的代码主体上没有什么问题,但细节是否能完全满足我们的需求,还需要编写单元测试来验证。

我这里的建议是,如果代码由GPT生成,那么单元测试需要我们人工来编写;如果代码是我们人工编写,那么单元测试可以让GPT生成。人工编写的过程中,可以让GPT来生成一些辅助片段加快我们工作效率,但最好不要把这两部分全部都交给GPT来实现,否则很可能在它那里是逻辑自洽的,但实际上有很多情况没有被考虑,需要大量修改。

最后,我投入了一些时间在单元测试的编写上,处理了一些panic,让项目可以适应大部分情况。

项目取名与开源

完成了代码开发,我们可以让ChatGPT帮忙生成一下README:

483db3e2bd4725f597da9993cc334cbc.png

这就是我第一个使用ChatGPT辅助生成的完整项目。ChatGPT的工作大概70%,我的工作大概30%,相比于正常实现一个类似的项目,我大概节省了50%时间。

我的贡献除了编写部分单元测试,我还优化了API,让其更方便被使用,用可以直接通过这样的方式来设置config对象的任意属性:

goattribute.New(&config).SetAttr("Services.Web.Ports[0]", "9090:8080")

有这样一个库,我就可以比较方便地实现文章开头的需求了——从命令行获取-D参数的值后,使用=将其分割成键名和值,键名作为SetAttr的第一个参数,值作为SetAttr的第二个参数即可。

完整代码已经发布在https://github.com/phith0n/goattribute,如果你与我有相似需求,可以考虑使用这个库来优化你的配置管理流程。当然,goattribute并不仅限于我上面说到的场景,也可以用于操纵任意对象的值。

1b445d9c9667437d48308060b1c00427.gif

封面图片由MidJourney生成。喜欢这篇文章,点个在看再走吧~


http://www.niftyadmin.cn/n/293286.html

相关文章

BrokenPipeError: [Errno 32] Broken pipe解决办法

我在train的过程中。出现错误 BrokenPipeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_15608\3724903352.py in <module>37 checkpoint_dircheckpoint_dir,38 checkpoint_intervalhparams.syncnet_c…

如何用ChatGPT写专业方向的科普内容?

该场景对应的关键词库&#xff08;13个&#xff09;&#xff1a; 目标用户、科普内容、生活问题、医疗类型、科普文章、病情症状、通俗性、专业名词、背景资质、权威领域、执业范围、证言人、内容形式。 提问模板&#xff08;3个&#xff09;&#xff1a; 第一步&#xff0c;…

【vue3.2 + ts + vite】使用 slot

vue3中使用slot会报错&#xff0c;需要用template封装一下。 1&#xff0c;基本使用方法 <slot name"button"> </slot><template #button><div>查看详情</div> </template>2&#xff0c;有参数传递&#xff0c;接收值使用方法…

OpenCV中的图像处理3.4-3.6(四)平滑化、形态学、图像梯度

目录 3.4 平滑化图像目标二维卷积 ( 图像滤波 )图像模糊(图像平滑)其他资源 3.5 形态学转换目标理论结构化元素 3.6 图像梯度目标理论代码一个重要的问题! 翻译及二次校对&#xff1a;cvtutorials.com 编辑者&#xff1a;廿瓶鲸&#xff08;和鲸社区Siby团队成员&#xff09; …

比赛记录:Codeforces Round 870 (Div. 2) A~D

传送门:CF A题:A. Trust Nobody 观察到 n n n很小,所以可以直接枚举说谎者的数量,显然说谎者的数量不会超过 n n n,确定了一个假设出来的说谎者数量之后然后枚举每一个人是不是说谎即可,然后再判断一下这个和我们假设出来的人是否一致即可 #include <bits/stdc.h> usi…

数据结构初阶--链表OJ

目录 前言移除链表元素思路分析代码实现 链表的中间节点思路分析代码实现 反转链表思路分析代码实现 链表分割思路分析代码实现 合并两个有序链表思路分析代码实现 前言 本篇文章将对部分单链表的OJ题进行讲解 移除链表元素 我们先来看题 思路分析 我们可以采用双指针的方…

解决Edge Dev更新后NewBing侧边栏消失的问题,并使用NewBing作画

文章目录 解决Edge Dev更新后NewBing侧边栏消失的问题&#xff0c;并使用NewBing作画问题来源操作步骤打开侧边栏步骤尝试让NewBing给出图像输出表情包或者其他图片使用NewBing作画 查看聊天记录插件 总结 解决Edge Dev更新后NewBing侧边栏消失的问题&#xff0c;并使用NewBing…

教室资源管理系统【纯控制台】(Java课设)

系统类型 纯控制台类型&#xff08;没有用到数据库&#xff09; 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87753360 更多系统…