资讯动态

t3code:命令行工具库,搞定代码片段管理与文件整理自动化

发布时间:2026/10/26 23:34:38 来源:尧图企业网站定制
1. t3code是什么从我的命令行日常里长出来的小工具库先说结论t3code不是某个大厂的开源框架也不是什么需要看上千页文档的复杂系统。它是我个人维护的一套命令行小工具合集代号里的t3第三层级的意思——也就是在系统工具和大型应用之间专门放那些自己写自己用但是好用得让人离不开的中间层脚本。如果你经常在终端里处理代码片段、批量整理文件、抓取网页信息又不想为这点事去装一个动不动几百MB的图形软件那这套东西大概率对你有用。我最早有建这套工具库的念头其实是被一组重复劳动逼出来的。做技术这一行日常要面对的场景其实高度重复写代码时频繁翻旧项目找某段实现下载的一堆PDF和文档散落在十几个文件夹里看到一篇好文章想存正文却总被网页广告和弹窗干扰。这些事单看都不难但架不住每天都要做而且每做一次都要打开不同的软件、走不同的流程。时间就这么一点点漏掉了。我试着找过现成方案有的太重有的太偏有的要付费有的维护到一半就停了。后来干脆自己动手把零零碎碎的脚本统一收拢到一个项目里起名t3code用一套统一的命令入口去调用它们。1.1 这套工具解决的三类真实痛点先说第一类痛点代码片段的跨项目复用。技术人电脑里最值钱的资产其实不是某个完整项目而是那些经过验证、可复用的实现片段。一个鉴权逻辑、一段日期处理函数、一个正则表达式这些散落在各个项目里等到真要用的时候翻半天才知道哦原来我在那个项目里写过。t3code做一个本地片段仓库按语言、标签、使用频次做索引一条命令就完成添加、搜索、复制到剪贴板。第二类是文件与内容的批量整理。比如我每个月都要把Downloads目录里上百个文件按类型、日期、项目名归类手动画文件夹再一个个拖动文件既慢又容易出错。t3code把这类批量操作抽象成规则引擎你只要描述规则例如所有带invoice关键字的PDF移到财务/2025目录下剩下的递归扫描、冲突处理、移动记录都由脚本完成。第三类是网页正文的快速提取。写技术文章或者做调研时经常需要把网页存成干净的Markdown。直接复制粘贴会被导航、广告、推荐位干扰浏览器插件又往往只在特定浏览器里可用。t3code用一个轻量的提取命令把HTML结构里的正文、标题、发布时间、作者等信息剥离出来再转成Markdown落地到本地。1.2 t3code名字的来历和整体设计思路名字的由来很简单。一开始项目叫my-scripts太没辨识度后来叫tools又太宽泛。有一次整理目录的时候发现自己写的所有脚本都站在第三层——底层是操作系统命令顶层是大型软件中间这一层才是用得最频繁的自定义工具。于是顺手改叫t3code第三层代码。“T3”这个编号也就保留了下来每个子命令都带t3-前缀一眼就知道归谁管。整体设计思路其实就三条原则。第一单文件优先。一个子命令尽量就是一个独立的Python或者Shell文件不搞复杂的插件机制出了问题定位快。第二统一入口各自为战。所有子命令软链到同一个bin目录通过t3code调起但每个子命令的运行日志、缓存、配置都按命令名各自存放互不污染。第三默认输出是给人看的不是给机器看的。终端输出走彩色、对齐、分页但加一个--json参数就能切换成结构化输出兼顾手工操作和后续pipeline处理。不过要说清楚这套工具并不追求取代专业方案。它的定位是让你80%的日常需求在几秒内完成剩下20%的复杂场景你还是该用正经的专业工具。拆解下来我有几个建议给想自己攒工具库的朋友不要一上来就设计宏大的插件体系先把最痛的三件事做成三个命令跑通不要过度抽象等第三个相似需求出现时再考虑统一逻辑不要绕过日志哪怕是给个人用的脚本写足日志也比到时候靠猜强十倍。2. 安装部署与初始配置半小时内跑起来安装这事我踩过的第一坑就是环境洁癖。当时刚接触Linux桌面生怕装个Python包会污染系统环境于是所有脚本都要求跑在专门的虚拟环境里。结果过了半年每次打开新终端都得先source activate烦得不行。后来想通了个人开发机上用pip的--user参数或者系统包管理器直接装依赖没那么多洁癖问题。工具是拿来用的不是拿来供着的。2.1 依赖选择与安装t3code核心依赖非常克制Python 3.10以上就够了第三方库只用了三个requests用于网络请求BeautifulSoup4和lxml用于HTML解析PyYAML用于读取配置文件。没有用Click或者Typer这类命令行框架原因是希望每个子命令保持能看懂全部代码的状态依赖越少后期维护越容易。我目前的部署方式是这样的# 克隆项目到 ~/t3code git clone https://example.com/t3code.git ~/t3code # 创建软链接让全局可直接调用 ln -s ~/t3code/bin/t3code ~/.local/bin/t3code ln -s ~/t3code/commands/t3-snip.py ~/.local/bin/t3-snip ln -s ~/t3code/commands/t3-fetch.py ~/.local/bin/t3-fetch ln -s ~/t3code/commands/t3-org.py ~/.local/bin/t3-org # 安装依赖 pip install --user requests beautifulsoup4 lxml pyyamlWindows上的朋友稍微注意一下软链对应的是mklink命令或者更简单直接写三个.bat文件放到一个加入PATH的目录里。macOS和Linux的差异主要在路径~/.local/bin在macOS上默认不存在需要先mkdir -p创建并加入PATH。这些细节在官方文档里通常不会写但实际部署时都绕不开。2.2 平台兼容性细节跨平台的坑集中在三件事上。一是Python解释器路径。直接用#!/usr/bin/env python3是最稳的别写死/usr/bin/python3因为macOS和有些发行版把python3放在不同位置。二是编码问题。Windows控制台默认编码可能是GBK处理UTF-8文本时经常乱码所以我在所有文件读写的地方都显式指定encodingutf-8并在启动时设置sys.stdout.reconfigure(encodingutf-8)。三是路径分隔符。别手写/一律用os.path.join或者pathlib这是老生常谈但真到写的时候容易偷懒。另外强烈建议做一步校验部署。装完以后先跑t3code --version再跑t3-snip --help确认三个子命令都能正常拉起。别小看这一步很多人就是跳过校验等到真要用了才发现某个依赖没装上那时候再排查反而浪费时间。2.3 基础配置文件的结构说明t3code的所有配置集中在一个YAML文件里放在~/t3code/config.yaml。虽然是个人工具但配置和代码分离能让后续扩展省很多事。核心配置项包括storage: snip_dir: ~/t3code/data/snippets/ # 片段仓库 organize_db: ~/t3code/data/org-state.json # 整理状态记录 network: timeout: 10 # 网络请求超时秒 retry: 3 # 重试次数 user_agent: t3code/1.0 (https://example.com) output: color: auto # always / auto / never pager: auto # 超过一定行数自动分页 json: false # 默认文本输出配置文件的读取逻辑在bin/t3code里统一完成每个子命令启动时自动加载。不需要单独给每个命令写一套传参逻辑这也是我把配置集中到一起的原因——命令多了以后参数统一性比灵活性更重要。有一点想提醒配置文件别放在项目仓库里至少不要把真实路径和本机用户名提交上去。我在config.example.yaml里留了模板真正的config.yaml在git里ignore掉。这样换电脑或者给别人参考的时候只给模板不给隐私。3. 核心功能拆解三个命令背后的实现逻辑与代码走读这一节我会把t3code目前最常用的三个子命令拆开来看。不是贴全部代码那实在太长了但会把每个命令的骨架逻辑、关键判断、边界处理方式讲清楚让你理解每一条命令“为什么这么写”。同时也会标注哪些地方是我实际运行过程中反反复复调整过的。3.1 t3-snip片段管理命令t3-snip做的事情很简单往本地片段仓库里加一条记录或者搜索仓库里的记录复制到剪贴板。仓库结构如下每个片段是一个Markdown文件文件名是slug文件头部YAML里存元信息~/t3code/data/snippets/ python-datetime-parse.md nginx-location-alias.md docker-cleanup-images.md每个文件内容大概是--- tags: [python, datetime] lang: python created: 2025-01-12 usage: 5 --- # Python解析ISO日期时间字符串 from datetime import datetime dt datetime.fromisoformat(2025-01-12T10:30:00)新增命令t3-snip add的核心逻辑很简单输入标题和正文自动生成slug如果文件已存在就提示合并还是跳过。搜索命令t3-snip grep则是遍历所有文件把YAML里的tags和正文一起做关键词匹配匹配上的按usage频次排序展示然后你敲个序号就能复制到剪贴板。剪贴板操作的跨平台写法是这个小命令里最容易翻车的地方。macOS是pbcopyLinux要看有没有xclip或者wl-copyWayland下用Windows是clip。我目前的写法是先探测可用工具然后按平台走分支import platform, subprocess, shutil def copy_to_clipboard(text: str): sys_name platform.system() if sys_name Darwin: subprocess.run(pbcopy, inputtext.encode(utf-8), checkTrue) elif sys_name Windows: subprocess.run(clip, inputtext.encode(utf-16le), checkTrue) elif sys_name Linux: if shutil.which(wl-copy): subprocess.run(wl-copy, inputtext.encode(utf-8), checkTrue) else: subprocess.run(xclip -selection clipboard, inputtext.encode(utf-8), shellTrue, checkTrue)3.2 t3-org批量文件整理命令t3-org的设计思路是“规则先行”。这命令读取一个规则文件然后扫描目标目录把符合条件的文件移动到指定位置。规则文件本身也是YAML一段典型规则长这样rules: - name: 发票PDF match: type: extension value: [.pdf] keyword: invoice action: move target: ~/Documents/Finance/Invoices/ dedup: skip - name: 图片自动归类 match: type: extension value: [.jpg, .jpeg, .png, .gif] action: move target: ~/Pictures/ dedup: auto_rename执行的时候t3-org会递归扫描目录逐条规则做匹配命中以后先检查目标位置是否已有同名文件。dedup: skip表示跳过不动dedup: auto_rename则会在文件名后加序号再移动。整个过程会先干跑一遍打印将要执行的操作确认无误后加--commit参数才真正执行移动。干跑这个设计是踩过一次大坑后的教训。头一版脚本我没做干跑上来就真移动文件结果一条规则匹配过宽把一批不该动的文件挪到了错误目录。虽然路径记录在案可以手动挪回来但从此我所有涉及批量改动的命令都坚持先打印计划再执行。宁可多敲一个--commit也不能让脚本自作主张。说句掏心窝的话批量文件操作最需要敬畏。任何代码跑在几十几百个文件上概率问题就会变成必然问题。所以t3-org会在执行前自动生成manifest文件里面记录每条“从哪来到哪去”的操作存在data/org-history目录下。真出问题了靠manifest一键回滚。3.3 t3-fetch网页内容抓取与清洗命令t3-fetch的用途一句话版本是“把一个网页转成干净的Markdown文件”。实现上没有用无头浏览器而是直接发HTTP请求拿HTML再用BeautifulSoup做正文提取。肯定有人会问现在很多网页都是JS动态渲染的直接拿HTML拿不到内容怎么办这个问题我后面会在踩坑部分单独展开这里先讲清楚静态页面的处理逻辑。正文提取的核心逻辑是三步。第一步拿HTML后先把script、style、noscript、nav、footer、aside这些噪音节点直接剔除。第二步在剩余节点里找候选正文容器。这里我用了一个不算复杂但很有效的方法统计每个div的文本密度文本长度除以标签嵌套深度取文本密度最高的节点作为正文根节点。第三步从正文根节点出发逐段抽取p、pre、li、blockquote里的文本保留a标签的href属性生成Markdown格式正文。def extract_main_body(soup): # 剔除噪音节点 for tag in soup([script, style, noscript, nav, footer, aside]): tag.decompose() # 按文本密度找出正文根节点 best_node None best_density 0 for div in soup.find_all([div, article]): text_len len(div.get_text(stripTrue)) depth len(div.find_parents()) density text_len / (depth 1) if text_len 200 and density best_density: best_density density best_node div return best_node这个方法对付博客、文档站、新闻站这类以静态HTML为主的内容页相当有效。遇到JavaScript渲染的现代站点我目前的策略不是硬撑而是检测到正文为空时给出提示建议你换用官方API或者直接用浏览器开发者工具拿Network里的JSON数据。工具就要清楚自己的能力边界硬用锤子拧螺丝不如老实承认该用螺丝刀。4. 用真实需求串一次完整工作流从收集到整理工具单独讲容易发散我拿一个完整的真实场景把t3code的各个命令串起来走一遍。这样你能看到它们是怎么协同工作的也能理解为什么我会说“不是追求复杂流程而是追求顺手”。4.1 场景整理一周的技术笔记和收藏链接假设你在做某块业务模块的调研这一周收集了20多个网页、记了10来段代码片段、下载了一批PDF文档。周六晚上你决定把这一周的成果归档不然下周一定会忘。习惯性打开t3code会经历的步骤大概是第一步t3-fetch把10个网页正文抓下来按域名和时间建目录t3-fetch https://example.com/docs/guide -o ~/Research/2025w03/ t3-fetch https://blog.example.net/how-to-use-api -o ~/Research/2025w03/第二步t3-snip把记在临时文件里的代码片段正式入库t3-snip add --title Python实现指数退避重试 --lang python # 然后从stdin粘贴正文CtrlD结束第三步t3-org把Downloads里积攒的PDF、图片按规则归位t3-org --config ~/t3code/rules-weekly.yaml --target ~/Downloads --dry-run # 确认计划无误 t3-org --config ~/t3code/rules-weekly.yaml --target ~/Downloads --commit这三步做完你的调研材料其实已经被三类命令分别解决正文类内容变成Markdown文件代码类内容进入片段仓库文件类内容按规则归到对应目录。整个过程不必打开浏览器去逐页另存也不用担心文件放错位置。4.2 搭配cron/任务计划实现自动归档如果每周都有一批固定的重复操作可以进一步把它们固化成任务计划。比如每周六晚上10点自动跑一次t3-org把Downloads里这一周的新文件按周规则整理到归档目录。Linux和macOS下用cronWindows下用任务计划程序。cron一行命令的写法是# 编辑 crontab crontab -e # 每周六22:00执行整理 0 22 * * 6 /home/user/.local/bin/t3-org --config /home/user/t3code/rules-weekly.yaml --target /home/user/Downloads --commit /home/user/t3code/logs/cron-org.log 21这里有个经验自动执行的任务比手动执行更需要日志和错误通知。手动跑了出问题你当场能看见自动跑了出问题你三天后才知道。所以我在所有命令里都内置了日志轮转和错误报告错误信息不仅写日志还会通过系统通知弹出来。宁可让自己被通知烦一点也不要等材料要用时才发现归档没跑。4.3 与外部生态git、vim、VS Code的配合工具再好用如果是信息孤岛用一阵子就会腻。t3code目前和主流工具链的配合方式我列一下作为参考git管理整个~/t3code/data目录是一个git仓库snippet的增删改都会产生commit方便回溯版本。我在t3-snip里内置了一个钩子每次add或修改以后自动执行git add与commitcommit message就是片段标题。这样不用手动切来切去。vim/VS Codet3-snip grep的输出可以直接通过管道接到编辑器里。比如在VS Code终端里执行t3-snip grep retry | xargs -I{} code {}就能直接把命中的片段文件在编辑器里打开。这套配合谈不上多智能但胜在直接。浏览器端我写了一个非常简陋的书签小脚本Bookmarklet点一下就能把当前页面URL塞进t3-fetch的命令行里。不是浏览器扩展不搞权限请求就是一个javascript:协议的小代码块复制粘贴到地址栏或收藏夹即可用。原理就是读取window.location.href拼接成命令行字符串。通过这些组合t3code并不是要替代现有的笔记软件或文件管理器而是把命令行、编辑器、浏览器的缝隙填上让数据在工具间流动时不需要手工转接。这是我个人最看重的一点工具之间的“缝”才是时间黑洞把缝填上比单个工具的功能强大更重要。5. 踩坑记录与常见问题的排查链路用了大半年踩过的坑不少。挑三个最有代表性的把完整排查过程写出来而不是只给结论。排查思路比结论值钱下次遇到类似的坑你能自己顺着链路走到底。5.1 字符编码问题的完整排查过程症状表现t3-fetch抓了一个中文博客的页面出来的Markdown里中文全变乱码。第一反应是编码问题但当时我犯了个错——没先验证而是直接改代码把requests.get的响应text换成了resp.content.decode(utf-8)一跑还是乱码。停下来理一下链路。乱码这种事可能出在三个环节请求环节、解析环节、写文件环节。我先在Python交互环境里直接请求那个URL打印resp.apparent_encoding和resp.text前200个字符发现apparent_encoding返回的是GB2312。也就是说页面本身的charset声明可能是UTF-8但requests按照某种逻辑判断出的实际编码是GB2312。再用resp.content.decode(gb2312)试了一遍正文正常了。根因清楚了那台服务器返回的响应头里没有明确的charset而页面内容里有GBK编码的字节requests的默认嗅探逻辑被带偏了。修复方案不是硬编码gb2312而是写一个兼容逻辑先看HTTP头的charset没有再取HTML页面里的meta charset都拿不到就走chardet嗅探最后才兜底到UTF-8。这类问题的通用排查方法我总结成三个动作第一最小化复现只抓一个出问题的URL第二把请求、解析、输出三个环节分别打印中间结果定位到底哪个环节出错第三修完后把出问题的URL加进回归测试列表防止以后改动把老问题重新带出来。乱码类的坑最怕的就是修了一次就完事过几个月重构代码又漏一次。5.2 网络请求超时与重试策略的坑t3-fetch最初版本的请求逻辑很天真直接requests.get(url)一把梭。跑真实网页时发现两类问题一是部分网站响应特别慢一个页面能卡住30秒以上二是部分网站对迅捷的访问频率敏感连续抓10来个页面后开始返回403。优化之后的请求封装逻辑包含完整的超时和重试策略import time, requests def fetch(url, timeout10, retries3): headers {User-Agent: t3code/1.0} for attempt in range(1, retries 1): try: resp requests.get(url, headersheaders, timeouttimeout) if resp.status_code 200: return resp if resp.status_code in (403, 429): # 服务端明确说别急那就多等一会 wait attempt * 5 time.sleep(wait) continue except requests.RequestException as e: if attempt retries: raise time.sleep(attempt * 2) raise RuntimeError(ffetch failed after {retries} retries: {url})这个策略的核心不是“重试次数多”而是“根据错误类型动态等待”。403和429通常说明你被限流了这种场景下快速重试只会让封锁更久网络波动类的异常反而可以快速重试。我发现好多人写重试都是固定三次固定间隔效果远不如这种分场景的策略。另外还有一个容易被忽略的细节超时时间要拆成connect超时和read超时。requests的timeout参数如果是单个值会把连接和读取一起限制导致连接已建立但网页迟迟不吐内容时误判为超时。更好的写法是timeout(5, 15)连接5秒读取15秒。这个细节我用了一个多月才意识到之前一直觉得明明没超时却报Timeout查了文档才知道是自己用法不对。5.3 大目录递归扫描变慢的优化过程t3-org在处理Downloads目录时最初版本扫描整个目录树需要几十秒一个递归os.walk把所有文件和子目录都走进来再逐条规则匹配实在低效。先说排查过程我用time命令输出耗时分布发现90%的时间都花在os.walk遍历上而实际命中规则的文件只有不到5%。也就是大量时间浪费在“看根本不相关的文件”上。优化思路其实就一句话减少遍历范围。具体做了三件事第一规则里加match.dir_exclude允许跳过不需要扫描的目录比如node_modules、.git、Library这类既大又无关的目录。第二把t3-org的规则匹配从“先扫完再匹配”改成“边扫边匹配”命中一个文件就立即处理尽早释放扫描压力。第三如果是频繁执行的归档目录用文件修改时间做增量判断只处理最近N天内的文件老文件跳过。这轮优化后扫描时间从几十秒降到几秒内。日志显示绝大部分时间花在网络和IO等待上遍历本身几乎不构成瓶颈。优化的核心口诀先测量再优化优化时对准热点不要做全局重构。很多性能问题就是这种局部热点堆积出来的找到热点解决热点比什么都强。6. 打个补丁扩充你自己的子命令读到这你可能会想t3code好归好但不是我的需求集合我还能不能往里加命令答案当然是可以而且扩展成本很低。这一节就以一个具体例子讲清楚如何给t3code加一个全新子命令。6.1 模块注册机制t3code的bin/t3code入口逻辑很简单启动时扫描commands目录下的所有t3-*.py文件用它们的文件名作为命令名用argparse的subparsers做分发。每新增一个文件只要你按照约定写了main()和register_parser()函数入口就会自动识别不需要改任何公共代码。还是上代码直观些。每新增命令至少需要提供如下结构#!/usr/bin/env python3 t3-backup备份配置文件到指定目录 import argparse, shutil, sys from pathlib import Path def register_parser(subparsers): p subparsers.add_parser(backup, help备份指定目录或配置文件) p.add_argument(source, nargs*, help要备份的文件或目录列表) p.add_argument(--dest, default~/backups, help备份目标目录) p.add_argument(--dry-run, actionstore_true, help只打印计划不实际复制) p.set_defaults(funcrun) def run(args): dest Path(args.dest).expanduser() dest.mkdir(parentsTrue, exist_okTrue) for src in args.source: src_path Path(src).expanduser() if not src_path.exists(): print(f[跳过] {src} 不存在, filesys.stderr) continue target dest / src_path.name if args.dry_run: print(f[计划] {src_path} - {target}) else: shutil.copytree(src_path, target, dirs_exist_okTrue) print(f[完成] {src_path} - {target}) def main(): from bin.t3code import build_parser parser build_parser() args parser.parse_args() if hasattr(args, func): args.func(args) else: parser.print_help() if __name__ __main__: main()这个结构不是我一开始就设计好的也是用了几周觉得手动维护分发太麻烦才抽出来的。原则还是那条约定优于配置文件放对位置、函数签名叫对名字剩下的都交给入口。6.2 新增一个t3-backup命令的完整示例我们按上面的模板把t3-backup做成真正能用的命令。目标是定期备份当前用户的几个重要配置目录.config/nvim、.ssh、.bashrc等到指定备份目录同时保留日期子目录防止覆盖旧备份。第一步在commands目录下新建t3-backup.py填入register_parser和run函数。第二步在命令里加入日期目录逻辑让每次备份都可回溯import datetime def run(args): stamp datetime.datetime.now().strftime(%Y%m%d-%H%M%S) dest_root Path(args.dest).expanduser() dest_dir dest_root / stamp dest_dir.mkdir(parentsTrue, exist_okTrue) for src in args.source: src_path Path(src).expanduser() if not src_path.exists(): print(f[跳过] {src} 不存在, filesys.stderr) continue target dest_dir / src_path.name if args.dry_run: print(f[计划] {src_path} - {target}) else: if src_path.is_dir(): shutil.copytree(src_path, target, dirs_exist_okTrue) else: shutil.copy2(src_path, target) print(f[完成] {src_path} - {target})第三步在入口脚本bin/t3code里添加一行注册调用或者如果你用的是我前面那种自动扫描方式直接放文件就行。第四步软链t3-backup到PATH目录跑一下验证。到这里一个新命令就算接入了。我日常跑的备份计划和cron表类似t3-backup ~/.config/nvim ~/.ssh ~/.bashrc ~/.zshrc --dest ~/Backups --dry-run t3-backup ~/.config/nvim ~/.ssh ~/.bashrc ~/.zshrc --dest ~/Backups加个每日cron任务就能实现每天自动备份关键配置。这类高频、低风险的自动化任务才是t3code这种工具库真正擅长的地方。6.3 关于项目后续扩展方向的想法对未来扩展我的规划优先级是先补搜索能力然后加打包分发最后考虑远程同步。搜索这块目前t3-snip grep是顺序遍历文件片段多了会变慢。我打算引入一个轻量的SQLite索引库把snippet的tag、语言、关键词提前索引搜索时走SQLite FTS5的全文搜索。SQLite好在单文件、无需服务、可随git提交和现有架构天然契合。打包分发方面个人工具写得再好换电脑重新部署也是一身汗。后续想做成单文件可执行包用PyInstaller把入口和核心依赖打成一个可执行文件分发到任意目录就能跑。这样就算环境里没有Python也不影响使用。远程同步目前只写了接口约定还没有真正落地。思路是命令支持t3code sync --remote userserver:/path这样的形式把本地数据目录增量同步到好几台机器上。因为涉及密钥管理、冲突合并这些麻烦事我打算留给后面有真实场景驱动时再设计不去预设过度复杂的功能。说给想动手的朋友的最后几句做了这么久的个人工具库我最深的一个体会是自动化这件事真正的门槛从来不是技术而是持续雕琢的耐心。写一个脚本跑通容易难的是在真正用了三个月后还愿意回头修它的边界条件、补它的日志、优化它的速度。t3code到今天这个状态至少经历了三轮大的重构第一轮统一切入入口第二轮把配置抽离到YAML第三轮加上干跑和回滚机制。每一次重构都是因为真实需求逼着它进化而不是为了炫技。如果你也想攒一套自己的命令行工具库我的建议是从最让你烦躁的一件事开始把脚本写出来别管代码写得好不好遇到下一个需要加命令的时刻再回来统一入口和配置这时候你自然知道自己该抽象什么等第三个命令进来再考虑通用化设计。一次性完美设计是不存在的迭代着写才是常态。只要工具帮你在未来一个月省下的时间超过了你写它所花的时间这笔投资就永远不会亏。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑