尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

CLI-Anything:统一命令行入口,终结多技术栈下的命令混乱

发布时间:2026/9/28 16:50:29

资讯中心
01
ARTICLE

CLI-Anything:统一命令行入口,终结多技术栈下的命令混乱

CLI-Anything:统一命令行入口,终结多技术栈下的命令混乱
很多人一开始看到“CLI-Anything”这个名字可能会觉得有点玄乎CLI 就是命令行Anything 又是怎么回事难道一个命令行工具还能包治百病不成说实话我第一次接触这个项目也是这种反应。但真正用下来之后我意识到它解决的是一个特别实在的问题——我们在日常开发中面临的从来不是“没有工具”而是“工具太多、命令太杂、切换太累”。你今天在这套项目里用 pnpm 加 vite明天换到另一个仓库又得用 npm 配 webpack后天可能还要处理 Python 的 pip 和 Go 的 mod。每个项目的初始化、构建、测试、部署命令都长得不一样时间全花在“回忆”和“翻文档”上了。CLI-Anything 的思路就是把这些乱七八糟、项目相关的操作全部收拢到一个统一入口里。它并不是一个试图取代所有命令行工具的神器更像是一个“命令调度中枢”或者“操作总控台”。你只需要记住这一个工具的名字然后让它根据你当前所在的项目、你写的配置、你传的参数去调用背后那些真正干活的工具。这个定位听起来不大但实际用起来会觉得非常省心。尤其是对于同时维护多个技术栈、多个仓库的开发者、DevOps、以及带新人的技术负责人来说这种“统一入口 规则化配置”的模式能省掉大量的重复记忆和沟通成本。这篇文章我会从一个实际使用者的角度把 CLI-Anything 的设计思路、核心概念、上手配置、搞砸现场和恢复技巧都梳理一遍。不会只讲概念会把手上的配置和踩过的坑都掏出来。如果你正在被“项目里的命令一团乱麻”这件事困扰这东西值得你花一杯咖啡的时间了解一下。1. 项目整体设计与核心思路拆解1.1 万物皆入口为什么需要“统一命令层”先说说这个工具诞生的背景。搞开发的人都知道现代软件工程早已不是“一个语言一把梭”的时代。一个稍微上点规模的项目后端可能用 Java 或者 Go前端用 React 或者 Vue移动端可能还挂着 Flutter 或者 React Native。这些技术栈的命令体系是完全割裂的比如 Java 那边常用 Maven 的mvn clean package前端开发和构建离不开 Node 生态的npm run devPython 那边还可能有 Pipenv 或者 Poetry。哪怕你只在一台机器上工作只要手头同时有多个不同技术栈的项目你的脑子里就得装好几个“命令字典”。CLI-Anything 用一个“约定”来解决这个混乱把命令抽象成三层。第一层是恒定的“入口命令”也就是这个工具本身的名字加上几个固定的动作比如init、run、task。这一层几乎是不变的不管你在哪个项目里调用方式都一样。第二层是“任务名”。这是由开发者自己定义的业务化词语比如build、deploy、db:migrate。重点在于这些任务名是跨技术栈通用的语义化命令你不需要知道底层是 Maven 还是 npm。第三层才是“具体执行语句”也就是真正在背后运行的 shell 命令。这个分层最大的好处是把“做什么”和“怎么做”彻底分开了。举个例子你在 A 仓库里运行cli run build可能背后执行的是npm run build -- --mode production在 B 仓库里运行同样的cli run build背后可能就是mvn clean package -DskipTests。但是你不需要记这些差异CLI-Anything 会根据当前目录的配置文件自动帮你去匹配和执行。这种设计思路和我以前用过的 Makefile 有相似之处Makefile 也是想把一堆命令聚合成统一的 target。但 Makefile 有个老问题语法是个独立语言缩进敏感功能一多就难维护。而且 Makefile 是文件级别的跨项目复用基本靠复制粘贴。CLI-Anything 把配置做成了结构化的数据文件通常是 JSON 或 YAML甚至支持把一段任务描述写进代码仓库后每个新人都能通过cli tasks看到项目的完整操作手册。团队协作的时候这个价值是很大的。1.2 设计哲学约定大于配置但保留弹性的“逃生舱”CLI-Anything 的配置核心原则是“约定大于配置”但它没有把这个原则走极端。默认状态下它确实会做一些聪明的自动推断比如检测到当前目录有package.json就把run dev映射到npm run dev检测到有go.mod就执行go run main.go。这些“开箱即用”的行为降低了上手门槛你基本不需要写配置就能跑通简单的场景。但真实世界的项目永远比默认约定复杂所以它提供了完整的“逃生舱”配置机制。你可以通过一个cli.config.json文件或者名为.cli-anything.yaml的配置显式声明一个任务到底要执行什么。例如tasks: build: exec: npm run build -- --mode production description: 构建前端生产包 prepare-db: exec: docker compose up -d postgres poetry run alembic upgrade head description: 启动数据库并执行迁移这里最值得注意的是exec字段它并不仅仅是一个字符串它本质上是一段可以被额外解释的 shell 执行单元。在实操中你会发现这里可以用连接多条命令可以写循环甚至可以直接调用项目里的scripts目录下的 shell 脚本。这种设计给了开发者完全的控制权同时又不用碰那些难记的底层命令本身。如果你试过其他任务运行器比如npm scripts你会发现它们有个致命缺陷只能在 Node 项目里用而且环境变量处理上总是有些别扭。CLI-Anything 的配置是项目级的它天然就兼容多语言项目联合的场景。你在一个全栈项目里用一条cli run dev同时拉起后端、前端、还有 Redis 哨兵这种“聚合任务”的能力才是它真正有魔力的地方。1.3 为什么选择“策略模式”而不是“硬编码模式”我研究过不少类似的工具比如一些框架自带的 CLI它们最大的局限在于所有操作都是针对自家框架硬编码的。你用一个 React 的 CLI就只能在 React 项目里横跳你用一个 Python 的任务管理工具就离不开 Python 的虚拟环境。而 CLI-Anything 采用的是“策略模式”思路每个项目下的配置都是一套独立的策略工具本身只负责解析参数、加载策略、执行命令。打个比方这就好比一个万能遥控器。遥控器本身只有几个按键但每个房间里的家电都提前做了适配。你在客厅按“电影模式”它可能同时打开电视、调暗灯光、启动音响你在书房按“电影模式”它可能只是打开电脑和显示器。CLI-Anything 做的事情就是把“模式”翻译成对应房间项目里实际需要的那套动作。对于团队新人来说这种设计还有一个隐性好处他们在刚开始接触项目代码时不需要去翻几十页的 README 去搞懂构建和部署流程只需要敲一个cli tasks所有合法的操作、参数、说明都整整齐齐列在面前。这实际上是把“项目知识”的一部分直接编码进了工具里变成了可执行的手册。2. 核心细节解析与实操要点2.1 配置文件的生态位从零创建你的第一个命令集先不讨论安装细节直接进入配置的核心环节。CLI-Anything 支持两种配置文件形式JSON 和 YAML。我个人习惯用 YAML因为它读起来更接近自然语言能加注释层级关系也更清楚。在项目根目录下创建一个.cli-anything.yaml文件这是最常见的第一步。一个基础的配置文件大概长这样# 项目名称主要用于展示 project: my-app # 全局变量可以在 exec 中使用占位符引用 variables: REGISTRY: registry.cn-beijing.com/myteam IMAGE_TAG: latest # 定义任务 tasks: dev: description: 启动整个项目前端后端数据库 exec: | docker compose up -d infra cd backend poetry run uvicorn main:app --reload --port 8000 cd frontend npm install npm run dev build: description: 构建实际交付包 exec: sh scripts/build.sh health: description: 检查服务状态 exec: | curl -sf http://localhost:8000/healthz echo backend ok curl -sf http://localhost:3000/healthz echo frontend ok这里面有三点值得展开说。第一variables段我建议每个项目都写上特别是那些含有仓库地址、敏感端口、团队专属标记的变量。这样一来当项目被 clone 到新的环境时新人只需要修改最顶部的变量区而不需要碰下面那一大堆已经调好的执行命令出错的概率会小很多。第二exec字段里使用字符块写法YAML 里的|可以直接保留换行符和缩进这意味着你可以写下多个连续的操作步骤。需要提醒的是这里千万不要为了“看着整洁”去手动缩进那些以cd开头的子命令。在 YAML 的块字符串里所有缩进会被原样保留并送入 shell 执行。如果 shell 在解析时发现某一行前面莫名多了空格都有可能出现诡异的问题。我自己就因为这个浪费过半小时输出里全是cd: cant cd to /backend最后发现是 YAML 块字符串的空格前缀搞的鬼。第三description字段看似简单但在团队协作中非常重要。它不仅仅是给人看的CLI-Anything 的tasks列表命令会把这个描述提取出来生成一个清晰的任务清单。如果一个任务没有写描述其他人在看任务列表时就得靠猜名字来理解了那这个“统一入口”就名存实亡了。2.2 参数的传递与吞并如何安全地透传原生参数命令工具最核心的日常操作就是“往具体工具里传参数”。CLI-Anything 在这一步上做了挺巧妙的设计。它提供了三种参数传递方式这在真实使用中会有明显差异。第一种是“全量照搬”也就是在任务执行时直接把用户输入的命令行参数原样拼接在exec命令后面。这种模式最直接适合你想完全自由操作的情况。比如cli run go-test -race -cover如果任务go-test执行的是go test ./...那么最终实际执行的就是go test ./... -race -cover。第二种是“具名变量注入”。在配置文件里可以定义一个任务参数表比如tasks: build-image: description: 构建镜像并推送到仓库 options: - name: tag short: t type: string default: latest - name: push short: p type: boolean default: false exec: | docker build -t $REGISTRY/my-app:$tag . if [ $push true ]; then docker push $REGISTRY/my-app:$tag; fi这样用户就可以运行cli run build-image -t v2.1 -p背后生成的 shell 变量就是tagv2.1和pushtrue。这种方式的优势在于即使给团队用了大家也只需要面对统一的参数接口而不需要去记忆docker build和docker push的具体语法。第三种是“穿插替换”。你可以在exec中直接写{{ .params.q }}这种类似模板的占位符CLI-Anything 会像渲染模板一样把参数值填充进去。这种方式灵活性最高但需要你小心处理引号问题特别是当参数值里包含空格或者其他特殊字符时。我的经验是能不用模板就别用模板定义好具名参数让你头脑清楚得多。不过在实际工作中我最常用的其实是“全量照搬”加“预置默认值”的组合。因为对于大多数临时操作你就是想把当前有几个测试用例跑一下或者把构建输出的文件名改一下。这种场景下定义一大堆具名参数反而是在浪费配置时间。先把默认路径跑通再留一个透传的尾巴性价比最高。2.3 生命周期钩子before 与 after 里藏的自动化潜力CLI-Anything 支持在任务上定义生命周期钩子例如tasks: database-restore: description: 从备份文件恢复本地数据库 before: - exec: mkdir -p ./backups - exec: test -f ./backups/db_latest.dump || curl -o ./backups/db_latest.dump $BACKUP_URL exec: psql -U postgres -d appdb -f ./backups/db_latest.dump after: - exec: echo restore finished at date这里before和after可以各挂一组命令它们会在主exec前后执行。这个设计在自动化场景里特别有价值本质上它允许你组合出“有前置条件”和“有后续动作”的完整执行流程。比如我经常会在before里做环境检查防止自己在未启动 Docker 的情况下就去操作容器。也会在after里执行一些项目自带的日志收集或状态更新动作。要注意的是before和after里的任何命令失败都会导致整个任务的中断。这既是好事也是陷阱。好事在于你可以依赖“前面失败后面就不会跑”的短路逻辑避免一连串灾难性的半成品操作。陷阱则是如果你在after里写了清理日志这种无关紧要的命令它一挂整个任务看起来就像失败了。我的建议是after里只放那些“如果失败也无关大局”的非关键操作比如打印提示信息。真正关键的清理和验证逻辑应该放在主exec里用串联。不要把关键步骤的生命周期绑在工具自动执行的尾巴上否则排查问题的时候会多一个隐含的变量。3. 实操过程与核心环节实现3.1 安装与启动一次安装全面接管这个工具的使用方式在不同操作系统上略有差异。我用 macOS 作为例子因为这是大多数开发者的主力环境同时也提一下 Windows 下的注意点。在 macOS 上我建议用 Homebrew 来安装。安装完成之后第一时间运行一下cli --help确认版本和可用的子命令列表。如果用的是 Windows则要留意 PowerShell 的执行策略限制最好在终端工具比如 Windows Terminal中先运行一次Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser确保后续的脚本命令能正常执行。装好之后先别急着写配置文件。Windows 上的用户还会遇到一个更基础的问题shell 环境变量未设置导致命令找不到。通常把安装目录加入系统的PATH环境变量就能解决。macOS 和 Linux 用户的默认 shell 一般都能直接识别但如果你在 Mac 上使用 zsh偶尔会遇到command not found这时候通常需要手动执行source ~/.zshrc刷新一下环境或者检查一下有没有安装到非标准位置。3.2 引导式初始化让工具帮你生成配置骨架CLI-Anything 提供了一个初始化命令帮助你生成配置骨架。在项目根目录下执行cli init它会自动探测当前目录下的工程文件比如如果你有package.json它会默认把dev、build、test这几个任务填充进去如果你还同时有一个docker-compose.yml它会建议加入一个up任务来启动容器。这一步交互式引导很好用但有一个细节要注意它自动生成的命令里通常只会写最小化的可执行语句比如npm run dev但不会自动把你项目里真正需要的其他环境变量放进去。如果你项目里需要读取.env文件你需要在生成的exec里自己补一行set -a source .env set a或者干脆用工具内置的变量引用把关键配置暴露出来。生成完配置后建议马上跑一次cli run dev比预期更快地去验证你的环境。如果这一步跑不起来多半是因为当前的 shell 环境里缺了一些启动脚本需要的 PATH 信息比如 Rust 的~/.cargo/env没有加载。把这类底层环境初始化命令写进before钩子里就能保证每次都能稳定复现。3.3 跨项目命令联动实际上手一个“前后端同时启动”场景这算是一个比较有代表性的真场景。我手头一个微服务项目目录结构大概是这样services/ backend/ server.py frontend/ package.json infra/ docker-compose.yml如果不用 CLI-Anything我每次开启开发环境要依次做这些事情跳到infra目录运行docker compose up -d redis跳到backend目录创建虚拟环境并安装依赖然后启动 uvicorn跳到frontend目录执行npm install如果依赖变了的话再执行npm run dev这条流程就算熟练了也得敲十几二十次键盘而且终端一关全部作废。有了 CLI-Anything我把整条链路的启动逻辑都固化到了配置文件里tasks: dev: description: 一键启动全栈开发环境 before: - exec: docker compose -f services/infra/docker-compose.yml up -d redis postgres exec: | cd services/backend python -m venv .venv source .venv/bin/activate pip install -r requirements.txt uvicorn main:app --reload --port 8000 cd ../frontend pnpm install pnpm run dev after: - exec: echo Dev environment is ready. Backend: http://localhost:8000, Frontend: http://localhost:3000现在你每次新开终端只需要敲一下cli run dev然后就能看到两个服务的日志像雪花一样刷在同一个终端里。整个过程几乎不用思考也不用担心漏掉哪一步。这对那些“过了一周再回来继续开发”的仓库尤其管用不仅省时间更能避免那种“明明代码没变却跑不起来”的环境遗忘问题。如果你觉得这样同时启动会出现日志互相干扰也可以把后端进程放到后台并重定向到日志文件uvicorn main:app --reload --port 8000 backend.log 21 然后再在前台把前端跑起来。这种“后台关键服务 前台当前关注服务”的模式在实际开发中体验好很多。4. 常见问题与排查技巧实录4.1 配置不生效先检查你的文件名和位置遇到“明明配置了任务但还是提示没有”这种情况十有八九是文件名没对上或者文件放错了目录。CLI-Anything 默认会向上递归查找配置文件但它只认固定几个名字.cli-anything.yaml、.cli-anything.json、cli.config.json。如果你命名成cliawesome.yaml或者把它塞进了子目录里工具当然找不到。这个问题排查起来很快第一步运行cli config path看看工具当前认为哪个文件才是配置源第二步确认文件是否位于项目根目录的上一层比如 workspace 根目录第三步检查配置文件的扩展名注意这是.yaml而不是.yml如果你是在 monorepo 工作区里这个“向上递归”的逻辑还有可能让你踩坑。子包里的命令可能会继承了根目录的配置导致你明明在小包里定义了build但执行的时候用的却是根目录的历史版本。解决方案有两种要么在子包目录下再建一个配置文件覆盖要么用--config参数显式指定文件。就团队协作的清晰度而言我更喜欢显式指定参数的做法。4.2 交互式命令失效管道和 TTY 的相爱相杀这是一个非常隐蔽的坑没有在上吃过大亏的人很难第一时间想到。如果你在任务里执行的是类似npm init、docker login这种需要交互输入的命令你会发现直接跑cli run interactive-demo时会挂在屏幕上输入什么按键都没反应或者干脆直接报“ioctl: Inappropriate ioctl for device”。原因很简单CLI-Anything 默认是以非交互模式去捕获子进程输出的。它会将子进程的输入输出通过管道连接而很多需要 TTY 终端的交互程序一旦检测不到 TTY就会自动放弃交互能力或者直接报错退出。我踩完这个坑之后记住了一个铁律所有需要人工输入密码、确认 y/n、或者执行编辑器操作的任务绝对不要直接通过任务的默认管道执行。如果有硬需求可以在任务配置里显式开启交互模式。通常这会对应一个interactive: true的选项或者在exec前面加上script -q /dev/null这类包装命令强制分配一个虚拟 TTY。比如tasks: chain-login: description: 登录到内部制品库 interactive: true exec: docker login $REGISTRY如果你用的版本没有interactive选项还可以用script命令作为中间层。这个命令在很多 Unix 系统上都有能够强制分配一个伪终端。注意 macOS 上的script参数跟 Linux 略有差异Windows Git Bash 里环境也不完全一样但总体思路是成立的让命令觉得自己面前坐着一个真正的终端。4.3 参数中带空格和引号的处理误区很多人在往exec里拼接外部命令时习惯直接用字符串拼接。例如在任务定义里写exec: docker run --name $CONTAINER image:latest arg1 arg2这在参数不复杂时可运行但一旦参数里带有空格、$、单双引号混合整个命令就会变得难以掌控。比如你从配置变量中读取了一个镜像标签v1.0 release这句命令就会因为空格被 shell 拆成不同的单词导致 docker 无法解析参数。处理这类问题的标准姿势应该是优先使用前面提到过的具名参数方式。CLI-Anything 在内部对参数做处理时会帮你在必要的位置加上引号。如果没有具名参数可用也可以自己在exec里写一段引号逻辑例如将变量用单引号包裹并在变量内部对单引号做转义用\这种 shell 技巧。但说实话这种手写引号实战里很难不出错我个人的建议仍然是遇到带复杂参数的任务务必走参数定义那一套不要在exec里裸拼。另外还有一个很常见的误区就是把环境变量硬编码在exec里。比如写export SECRET_KEYabc123 cli run some-task。这样确实能跑但一旦配置提交到代码仓库这个SECRET_KEY就彻底泄露了。正确做法是利用 CLI-Anything 的变量引用机制从本地环境读取或者在.env文件中设置变量并加入.gitignore然后在任务执行时通过读取.env来加载。这点在团队协作中尤其重要别把敏感信息留在配置里然后让 Git 追着跑。5. 效率倍增进阶用法与工作流整合5.1 用cli tasks作为团队的“活文档”我在前面反复强调cli tasks这个命令的价值这里想单独展开聊一聊。在很多团队里项目的操作文档往往写在 README 里但 README 的“保质期”通常很短。人员一流动、命令一更新那些文字说明就会失真。而 CLI-Anything 的任务清单是从配置文件里实时生成的只要你把任务说明写清楚这个清单就是一份永远不过期的“活文档”。这份文档还有一个妙用它可以帮助团队统一操作习惯。我见过很多团队的不同成员对同一个项目使用不同的启动方式有人用pnpm dev、有人用npm start、有人直接在 IDE 里点按钮。这样一来出问题的环境就有好几种可能性排查起来特别累。当你把标准动作固化到cli run xxx上之后所有人都走同一个闸口出了问题直接问“你跑的是哪条命令”就能快速定位。另外cli tasks的输出还支持简单的过滤和搜索。假设一个项目有几十个任务你只需要看跟“数据库”相关的可以直接敲cli tasks --filter db。这个小功能我一个人同时维护五个项目的时候感觉特别爽不用在长长的任务列表里翻来翻去。5.2 作为前端脚手架的一次性命令除了日常的 dev/build/test 之外CLI-Anything 也能很好地承担“脚手架”和“一次性命令”的职责。你可以为项目定义一些并不常用但非常重要的一次性任务比如tasks: new-component: description: 生成一个全新的 React 组件模板 exec: | mkdir -p src/components/$name cat src/components/$name/index.tsx EOF import React from react; export const $name: React.FC () { return div$name/div; }; EOF这里的$name需要在执行时用参数形式传进来。命令写好了以后要新建组件就不用去复制某个已有组件的目录了团队的新人也不会因为不熟悉项目结构而发怵。这种任务的本质是“用代码去写代码”把套路化的文件操作全部自动化。不过如果你的项目里已经存在成熟的代码生成器比如用 plop 或者 hygen 脚手架那也别担心冲突。CLI-Anything 完全可以作为这些脚手架的“总入口”只要在exec里调用npx plop $name就行。它并不刻意跟其他工具抢饭碗而是把最终任务提供出来让使用者少记一层东西。5.3 与 CI/CD 管道的组合很多 CI/CD 系统本来就允许你执行自定义脚本但那些脚本写起来往往比本地命令晦涩且难以调试。如果你把 CI 管道中跑的构建、测试、部署等步骤定义成 CLI-Anything 任务那么本地开发和 CI 执行的就是同一套逻辑可以少掉“本地能过、CI 挂了”的尴尬。举个例子你的 CI 配置里可以这样写stages: - test - build test-job: stage: test script: - cli run test build-job: stage: build script: - cli run build这套写法的优势很明显本地测试时跑的是cli run testCI 里跑的也是cli run test。一旦出现了环境不一致问题大概率就出在操作系统和依赖安装上可以直接去排查这两个点而不是怀疑命令写的有没有问题。当然前提是 CI 环境安装了 CLI-Anything 并且能正确找到配置文件这一点需要在 CI 的依赖安装步骤里多加一行npm i -g cli-anything或curl -sL ... | bash具体看工具官方文档。5.4 铁律级习惯先定义好退出码“命令执行之后我怎么判断它到底成没成功”这个问题在拼装多任务时很关键。CLI-Anything 遵循 Unix 的惯例所有命令最终会返回一个退出码。如果主任务失败这个退出码会非零地向上传递。但如果你的exec里最后一个命令是echo something那么不管中间某个环节是不是炸了最终退出码都会是 0CI 里就容易出现“假绿”的情况。我在配置任务时会下意识地把“关键校验”放在最末尾。比如部署任务我一定会这样写exec: | sh deploy.sh curl -sf http://localhost/healthz echo deploy success || exit 1这样做的效果是就算deploy.sh本身没有抛错如果最终健康检查不过整个任务照样会失败。这个习惯让任务的“成功”和“真正可用”强绑定而不是停留在“命令退出无异常”的层面。如果你对这个习惯无感不妨想想你是不是遇到过这种诡异情况部署脚本打印了一张“SUCCESS”横幅但实际服务压根起不来。有了退出码检查这类问题在命令行阶段就会被拦截一半。6. 写在最后的经验体会这个工具在我手上用了大概一个季度之后我才逐渐感觉到它的真实价值。最初它只是帮我省了几个cd和但后来它变成了一种“团队约定”的载体。新同学入职我不用再拉个腾讯会议逐条讲过“数据库先启动、前端要先装 pnpm 依赖、后端要用 poetry 激活环境”这些琐碎细节直接把cli tasks的输出截个图发过去就行。项目里的运维命令、数据修复脚本、版本发布流程全部都是可见的、可检查的、可被 Git 审计的。相比那些动辄需要引入一个重量级微服务编排框架的方案CLI-Anything 更像是一个贴着地面走的轻量级方案。它不强制统一技术栈也不试图消灭 shell只是在 shell 之上加了一层更温柔的语义包装。这种保守的哲学让它在各种不同的工作场景里都能安静地发挥价值。最后分享一个小技巧如果你像我一样经常同时管理多个不相关的项目可以在你 shell 的配置文件比如~/.zshrc里建立一个快捷方式让cli在找不到配置文件的目录时自动向上递归并在进入项目时自动切换到对应的任务上下文。这样你连“先找到项目根目录”这一层都省掉了真正实现“在哪里操作由工具自己找规则”。这个小的体验优化算是我用 CLI-Anything 这么久以来最舒服的一个点。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。