ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

create-imba 独立脚手架包实战:从 `imba create` 移除到 `npm create imba` 全流程实现方案

create-imba 独立脚手架包实战:从 `imba create` 移除到 `npm create imba` 全流程实现方案 编程语言编译器语言运行时【免费下载链接】imba The friendly full-stack language项目地址https://gitcode.com/gh_mirrors/im/imba点击查看免费下载导读本篇文章以imba仓库内 packages/create-imba/PLAN.md 为核心骨架完整拆解「用npm create imba一键创建 Imba 项目」这一能力从设计、实现到验证的全过程。你将掌握该独立脚手架包的目标定位、CLI 全部参数、四种内置模板的差异、交互式与非交互式两条流程的底层源码逻辑以及基于 esbuild Imba 编译器构建零运行时依赖发布物的完整工程方案。一、背景imba create被移除后留下的断档create-imba这个包诞生的直接原因是一个真实的兼容性事故官方文档快速上手、首页、基础语法等页面长期以来引导用户执行npx imba create但该命令在主包中被提交6afea2e12026-05-30提交信息为 Remove imba create删除后没有任何替代命令导致用户执行时报错Could not resolve create。PLAN.md 明确给出了修复目标makenpm create imba(andnpx create-imba) work again by building a small standalone scaffolder package in this monorepo, and re-add a thinimba createalias in the main CLI that delegates to it.即在本 monorepo 中新建一个独立脚手架包同时在主 CLI 中恢复一个只做委托的薄别名imba create让两种入口都重新可用。围绕这个目标PLAN.md 记录了一批已经核实的仓库事实核对日期 2026-08-13它们是后续所有设计决策的依据事实内容旧实现可恢复git show 6afea2e1^:packages/imba/bin/create.imba可还原出约 170 行的旧源码包含prompts交互流程、haikunator 随机项目名、_gitignore→.gitignore重命名、noCopy排除列表旧 CLI 接线旧版bin/imba.imba约 296 行处注册过create [name]带-t, --template、-y, --yes、--fast三个选项四个模板仍存在packages/imba/templates/{default,express,module,cli}在 HEAD 依然完好且templates仍在packages/imba/package.json的files数组约 50 行中随每个 imba tarball 发布但因命令被删而完全不可达npm 名称未被占用create-imba在 npm 上未注册404可安全使用已发布的imba为2.0.0-alpha.253与仓库版本一致工程约束monorepo 使用 lernalerna.json当前只列packages/imba npm workspacesimba 要求 node20.19.0主 CLI 二进制为packages/imba/bin/imba→ 预编译的bin/imba.imba.js旧依赖清单旧 create 实现依赖prompts、cross-spawn、haikunator在还原源码前需确认这些依赖是否仍存在于packages/imba/package.json二、总体设计七个已拍板的决策PLAN.md 明确标注这些决策「已定案不再反复讨论」settled — dont relitigate构成整个方案的设计基线新建独立包packages/create-imbanpm 名为create-imbabin 名为create-imba。这是npm create imba/pnpm create imba/bun create imba能被解析的根本原因。版本0.1.0MIT 许可engines node18。迁移模板把模板从packages/imba/templates/通过git mv移入packages/create-imba/templates/并从 imba 的files数组中移除templates。模板随 create-imba 包发布体积很小v1 不做网络拉取 / degit。移植而非重写以还原出的create.imba为起点保留 prompts 流程、haikunator 默认名、_gitignore重命名、noCopy列表及三个 CLI 选项同时更新过期内容模板描述、脚本与依赖需对照 cli.md 校准。源码用 Imba 写、bin 是编译后的 JSnpx create-imba直接用 node 执行 bin因此 bin 不能是.imba文件。源码放在src/create.imba构建脚本产出单个自包含的bin/create-imba.js把依赖全部打包进发布物使发布包零运行时依赖。模板刷新脚手架出的package.json应写入所选项目名并把imba: *替换为imba: ^2.0.0-alpha.253或从packages/imba/package.json构建时读取的当前版本同时保证dev/build脚本可用还要验证 express 模板的服务器入口与当前imba的 serve 方式一致。主 CLI 恢复imba create别名在packages/imba/bin/imba.imba中加一个只做委托的create命令——spawnnpx create-imbalatest并透传参数win32 下用shell: true主包不携带任何脚手架逻辑。工作区接线把packages/create-imba加入根package.json的workspaces与lerna.json的 packages 列表。三、包形态package.json 与发布物构成当前仓库中 packages/create-imba/package.json 的实态如下与 PLAN 决策一致{ name: create-imba, version: 0.1.0, description: Scaffold a new Imba project, license: MIT, bin: { create-imba: ./bin/create-imba.js }, files: [ bin, templates ], engines: { node: 18 }, scripts: { build: node scripts/build.js, prepack: npm run build }, devDependencies: { cross-spawn: ^7.0.6, esbuild: ^0.24.2, haikunator: ^2.1.2, prompts: ^2.4.2 } }几个值得注意的设计要点files只含bin与templates发布物就是「可执行文件 四套模板」src/与scripts/不随包分发。prepack钩子保证npm pack前自动执行构建因此即使没有 CI也能直接发布。依赖全部放在devDependenciesprompts、cross-spawn、haikunator、esbuild都只是构建期依赖运行时被打进单个 bundle实现了 PLAN 决策 4 的「零运行时依赖」目标。engines 只要求 node18这比 imba 主包20.19.0更宽松降低脚手架工具本身的使用门槛源码中另外对旧版 node 给出了黄色警告见下文源码分析。仓库根目录下的packages/create-imba/实际文件布局为packages/create-imba/ ├── PLAN.md ├── README.md ├── package.json ├── scripts/ │ └── build.js # esbuild imba 编译器产出 bin/create-imba.js ├── src/ │ ├── colors.imba # 终端着色 │ ├── create.imba # 脚手架主逻辑Imba 源码 │ └── runtime-shim.js # 打包时替换 imba/runtime 的最小运行时 ├── bin/ │ └── create-imba.js # 预编译产物构建生成 └── templates/ ├── default/ ├── express/ ├── module/ └── cli/四、CLI 用法与全部参数packages/create-imba/README.md 给出了最简用法与参数表npm create imbalatest同一入口也适用于pnpm create imba、bun create imba或直接npx create-imba。命令形式为create-imba [name] [options]不带参数进入交互式安装向导传入项目名则直接使用用.表示当前目录。选项说明-t, --template [template]指定模板default、express、module、cli-y, --yes对所有确认提示一律回答 yes--fast随机项目名 全部默认答案只打印生成目录名供 shell 脚本使用-v, --version打印 create-imba 版本号-h, --help显示帮助信息这五个选项在源码src/create.imba的parseArgv中逐项解析-t/--template消费下一个参数作为模板名-y/--yes、--fast、-h/--help、-v/--version均为布尔开关遇到未知-开头参数输出Unknown option: ...并退出位置参数超过一个则报Unexpected argument。run入口按help→version→main的顺序分发。五、四种内置模板详解PLAN 决策 2 把模板从 imba 主包迁入 create-imba 后四套模板当前都在 packages/create-imba/templates/ 下。其定位与package.json实态如下1. default —— 纯客户端应用描述Client only application。包含index.html、src/main.imba、_gitignore。核心脚本scripts: { dev: imba -w index.html, build: imba build index.html }, devDependencies: { imba: * }src/main.imba演示了一个最精简的 Imba 单页组件global css设置页面级样式body c:warm2 bg:warm8 ff:Arial inset:0 d:vcctag app声明组件与响应式状态count 0%counter clickcount绑定点击事件内联 CSS 使用e:250ms us:none、hover:indigo5等 Imba 风格语法最后imba.mount app挂载。2. express —— Express 全栈应用描述Full stack application with an Express server。在 default 基础上多出server.imba与express运行时依赖scripts: { dev: imba -w server.imba, build: imba build server.imba, preview: node dist/server.js, prod: npx pm2 start dist/server.js }, dependencies: { express: * }, devDependencies: { imba: * }server.imba展示了 Imba 的imba.serve用法import index from ./index.html import express from express const app express! const port process.env.PORT or 3000 app.get / do(req, res) res.send index.body imba.serve app.listen(port)注意imba -w server.imba会同时编译并监听服务器代码preview直接运行编译产物dist/server.jsprod则交给 pm2 托管——这是 PLAN 决策 5 中「verify the express templates server entry still matches how imba serves today」要重点校验的部分。3. module —— 可被任意 JS 项目使用的模块描述A module that can be used in any JavaScript project。ESM 形态、面向库作者type: module, files: [dist], main: ./dist/main.mjs, module: ./dist/main.mjs, exports: { .: ./dist/main.mjs }, scripts: { dev: imba -w index.html, build: imba build src/main.imba --esm, watch: imba build -w src/main.imba --esm }模板特意将产物声明为.mjs并通过exports字段暴露还配套watch脚本做增量构建。4. cli —— 可发布到 npm 的 CLI 工具描述A CLI tool ready for npm publishing。自带bin映射、版本管理与打包检查脚本bin: { imba-project: bin }, version: 0.0.0, scripts: { test: ./bin blue! -c blue, dev: imba build -w main.imba, build: imba build main.imba, sync: npm i npm run build npm link, prepack: npm i npm run build, check: npm pack --dry-run }, dependencies: { commander: * }main.imba给出了用commander写 CLI 的范式global.E统一错误出口、import { program } from commander定义name/description/argument/option--version从./package.json注入showHelpAfterError!让出错时自动打印帮助。说明以上四个模板的package.json中imba: *是迁移前的旧态。按 PLAN 决策 5脚手架时create.imba会通过npm pkg set把它改写为形如^2.0.0-alpha.253的固定版本详见第七节这正是「模板刷新」要落地的内容之一。六、源码实现交互流程与关键机制核心逻辑全部在 packages/create-imba/src/create.imba约 220 行完整覆盖 PLAN 要求的「移植而非重写」范围。下面按执行顺序拆解其关键机制。1. 环境与常量注入const cwd process.cwd! const swd __dirname require ./colors const prompt require prompts const spawn require cross-spawn const Haikunator require haikunator # Injected by scripts/build.js via esbuild define const imbaVersion typeof IMBA_VERSION string ? IMBA_VERSION : * const ownVersion typeof PKG_VERSION string ? PKG_VERSION : 0.0.0imbaVersion与ownVersion由构建脚本通过 esbuild 的define在编译期注入IMBA_VERSION被定义为^2.0.0-alpha.253之类的值运行期不可改——这是「版本固定」机制的源头。主流程开头还有一段 Node 版本兜底检查主版本号 20时打印黄色警告Detected Node {...}, imba requires v20.19 or higher.但不阻止继续运行create-imba 自身只要求 node 18。2. 名称校验toValidRepoNamedef toValidRepoName name return unless typeof name string return name if name . name name.replaceAll(/[^\s\w.-]/g,).trim!.replaceAll(/\s/g,-) if not name or name . throw Project name can only contain a-z A-Z 0-9 _ . - if name .. throw Project name cannot be .. if fs.existsSync(name) throw Project name {name} already exists in current directory name规则可以归纳为.表示当前目录非法字符非字母数字下划线点横线被剔除、空白折叠为-空名 /../ 已存在的目录都会抛出明确错误。该函数同时作为 prompts 文本输入的format与validate使用保证交互与非交互两条路径校验一致。3. noCopy 排除表与_gitignore重命名const noCopy [ .git dist node_modules package-lock.json ] def copy src, dest return if noCopy.includes path.basename(src) if path.basename(dest) _gitignore dest path.join(path.dirname(dest), .gitignore) if fs.statSync(src).isDirectory! fs.mkdirSync(dest,recursive:yes) for file in fs.readdirSync(src) copy path.resolve(src,file), path.resolve(dest,file) else fs.copyFileSync(src,dest)递归复制器承担两项职责排除.git、dist、node_modules、package-lock.json后两个留给用户自行npm install生成以及把_gitignore重命名为.gitignore——这是模板文件与 npm 打包规则博弈的经典技巧.gitignore无法作为文件名安全发布模板用下划线前缀存储复制时还原。四个模板目录中的_gitignore文件正是为此存在。4. 模板选择与确认模板清单以对象形式硬编码path指向 templates 目录子目录name/desc用于展示defaultDefault —— Client only applicationexpressExpress —— Full stack application with an Express servermoduleModule —— A module that can be used in any JavaScript projectcliCLI Tool —— A CLI tool ready for npm publishing交互路径下未指定-t时用prompts的select类型弹出模板选择随后再用confirm类型确认创建信息Create Template project named name in ./dir?。而--fast会跳过所有提示模板缺省时直接回退templates.default。5. 依赖安装与版本固定核心差异点process.chdir(dest) unless projectName . spawn.sync npm, [pkg, set, name{packageName}, devDependencies.imba{imbaVersion}] spawn.sync npm, [up, -S], stdio:(!opts.fast and inherit)这两行实现了 PLAN 决策 5 的「模板刷新」npm pkg set把脚手架出的package.json的name改为项目名同时把devDependencies.imba从模板中的*改写为注入的imbaVersion如^2.0.0-alpha.253避免新项目永远漂移在最新 alpha 上随后npm up -S安装依赖。--fast模式下安装过程不继承 stdio静默执行。若安装失败仅打印红色错误而不中断退出。6.--fast模式与 haikunatorprojectName if opts.fast haikunator.haikunate(tokenLength: 0) else try toValidRepoName name catch e console.error(e.red)--fast是面向脚本的设计用haikunator形容词-名词式随机命名如wandering-sunset生成项目名跳过所有 prompts全程不输出过程日志最终只打印生成的目录名——配合$(npm create imba -- --fast)即可在 shell 脚本里拿到新项目路径。7. 完成提示非--fast路径下结束时打印下一步指引安装 VS Code 扩展提示语来自 CLI 输出、加入 Imba Discord 社区、然后cd name执行npm run dev。成功创建与复制失败分别以绿色/红色信息区分。七、构建管线esbuild Imba 编译器产出零依赖单文件packages/create-imba/scripts/build.js 是整个发布策略的工程核心实现了 PLAN 决策 4 与「commit the built bin so the package is publishable without CI」读取同仓 imba 编译器require(packages/imba/dist/compiler.cjs)即用 monorepo 内兄弟包的预编译编译器来编译 Imba 源码注册.imba加载器esbuild 插件的onLoad钩子把每个.imba文件交给编译器以platform: node、format: esm编译后以jsloader 返回编译错误透传为 esbuild 错误单文件打包入口src/create.imba输出bin/create-imba.jsbundle: true把prompts、cross-spawn、haikunator全部打进产物platform: node、format: cjs、target: node18运行时替换alias把imba/runtime指向包内src/runtime-shim.js轻量运行时垫片避免引入完整 imba 运行时版本注入define把IMBA_VERSION注入为^ imbaVersion从packages/imba/package.json的version读取无需硬编码、PKG_VERSION注入为 create-imba 自身版本——这正是第六节提到的常量来源可执行化banner 写入#!/usr/bin/env node构建后chmod 755确保npx create-imba可直接运行。最终产物bin/create-imba.js是提交进仓库的预编译文件配合prepack钩子意味着「零 CI 也可发布」。八、主 CLI 恢复imba create委托别名PLAN 决策 6 给出了主 CLI 侧的恢复方案在packages/imba/bin/imba.imba重新注册create命令但只做委托——spawnnpx create-imbalatest并透传全部参数若cross-spawn可用则用它否则在 win32 上回退child_process.spawn加shell: true。主包内不引入任何脚手架逻辑避免重蹈旧版170 行脚手架代码内嵌主包的覆辙。同时 PLAN 特别提示了一个工程细节bin/imba.imba.js是预编译产物需确认其重建方式如packages/imba/scripts/build.js并同步重建若重建成本过高则把别名留作后续跟进并在文档中说明。配套的文档恢复动作PLAN 实施步骤 8包括cli.md 新增## imba create小节说明委托关系并以npm create imba为主推形式start.md、home/examples.md、basic-syntax.md 统一改用npm create imbalatest作为规范命令npx imba create作为别名提及在 DOCS-IMPROVEMENTS.md 的 §1 勾掉「imba create不存在」的发现项并附完成说明最后执行cd apps/imba.io npm run build-content npm run build-site两者必须通过。九、工作区与 monorepo 接线PLAN 决策 7 要求把新包接入现有工程结构根package.json的workspaces当前列imba-language-core、imba-language-server、imba-typescript-plugin、vscode-imba-next新增packages/create-imbalerna.json当前只列packages/imba的 packages 数组同样加入该路径。同时按 PLAN 决策 2迁移模板后需从packages/imba/package.json的files数组移除templates使模板不再随 imba tarball 发布此前它们「发布着但不可达」。十、验证清单与完成定义PLAN.md 的 Verification 与 Definition of done 是方案收尾的硬性标准原文要求逐条执行在临时目录执行node repo/packages/create-imba/bin/create-imba.js my-test-app --template default --yes以及--fast非交互脚手架必须成功在脚手架出的应用中npm install或用npm link/file:依赖指向 workspace 的 imba然后npm run build——脚手架项目必须能用当前 imba 构建express 模板同样重复一遍交互路径不带参数运行、回答 prompts至少验证 prompt 定义能正常渲染完整 TTY 交互可能无法脚本化需说明哪些验证过、哪些没有若别名已实现node packages/imba/bin/imba create --help应显示委托生效npm pack检查 tarball 文件列表bintemplates齐全、无冗余内容。完成定义Definition of done汇总为至少default与express两个模板能从构建后的 bin 端到端本地脚手架成功脚手架出的应用能用 workspace 的 imba 构建模板不再随 imba tarball 发布文档更新且站点构建通过追踪文档对应项已勾选。十一、范围外事项PLAN.md 也明确划定了本方案不触碰的边界避免范围蔓延npm 实际发布create-imba 的npm publish与下一版 imba 的别名发布由维护者执行GitHub 模板仓库的创建/重构基于 degit 的网络拉取可作为后续替代内嵌模板的方案CI 接线。这三个「out of scope」点决定了本方案的交付形态一切工作收敛在仓库内可构建、可验证、可本地端到端运行发布动作留给维护者的发布流程。小结create-imba是 Imba monorepo 中一个「小而完整」的工程样本——它演示了独立脚手架包如何用 Imba 编写源码、用 esbuild 打包成零运行时依赖的单文件 bin、用_gitignore规避 npm 打包限制、用--fast服务脚本化调用并通过薄别名恢复主 CLI 兼容性。无论是想为语言项目搭建npm create xxx入口还是想理解 Imba 源码 esbuild 的打包流水线PLAN.md 与其落地的 src/create.imba、scripts/build.js 都是一份可完整对照参考的实现蓝本。赞分享编程语言编译器语言运行时【免费下载链接】imba The friendly full-stack language项目地址https://gitcode.com/gh_mirrors/im/imba点击查看免费下载相关推荐Imba 命令行完全指南imba / imba build / imba serve / npm create imba 实战详解Imba 命令行完全指南imba / imba build / imba serve / npm create imba 实战详解 Imba 是一款友好的全栈编程语言编译器语言运行时tsParticles create-particles 脚手架包深度解析从 npm create particles 到模板化项目生成tsParticles create particles 脚手架包深度解析从 npm create particles 到模板化项目生成 导读 本文以 tsP前端Imba编译原理从.imba文件到高性能JavaScript的转换过程Imba编译原理从.imba文件到高性能JavaScript的转换过程 Imba是一种友好的全栈编程语言其独特的 编译原理 使得开发者能够编写简洁优雅的代码编程语言编译器语言运行时上一篇WebCrate 开源项目教程下一篇AutoGen.NET 轮询群聊实战RoundRobinGroupChat 固定顺序多 Agent 对话的实现与源码解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表