news 2026/9/24 16:28:41

create-keystone-app 版本演进解析:从 v10 到 v11 的脚手架变革与实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
create-keystone-app 版本演进解析:从 v10 到 v11 的脚手架变革与实现原理
  • 后端

【免费下载链接】keystone

The superpowered headless CMS for Node.js — built with GraphQL and React

项目地址:https://gitcode.com/gh_mirrors/key/keystone
点击查看免费下载

create-keystone-app是 Keystone 6 官方的项目脚手架 CLI:执行一条命令即可生成一套开箱即用的 Headless CMS 工程(含 GraphQL API 与 Admin UI 骨架)。本文以该包的 CHANGELOG.md 为骨架,逐版本解读 v10.0.0 到 v11.0.2 之间发生的行为变更(包管理器检测、移除自动安装、纯 ESM 化等),并结合 packages/create 下的实际源码与starter模板,讲清脚手架每次生成的完整流程与生成物的内部结构。读完你将掌握该 CLI 的当前用法、版本演进带来的迁移注意点,以及生成项目每个配置文件的作用与修改入口。

create-keystone-app 是什么

create-keystone-app是随 Keystone 6 一起维护的初始化工具,当前仓库内版本为11.0.2。它的作用是:交互式地询问目标目录,然后把 packages/create/starter 中的一份可运行 starter 工程复制到该目录,并给出安装依赖与启动的命令提示。

包的元信息定义在 packages/create/package.json:

  • bin指向./cli.js,即命令行可执行入口;
  • exports["."]指向构建产物dist/create-keystone-app.js
  • preconstruct.entrypoints声明index.ts为唯一构建入口;
  • 运行时依赖仅三个:enquirer(交互式提问)、meow(CLI 参数解析)、package-json(拉取 npm registry 元数据做版本自检);
  • files字段说明发布包只包含diststartercli.js

而 packages/create/cli.js 本身只有两行——通过import 'create-keystone-app'引入包入口,真正的逻辑全部在 packages/create/src/index.ts。

一次脚手架生成的全流程(基于当前源码)

index.ts是理解整个 CLI 的最佳入口,它按顺序完成以下工作:

  1. 打印开场信息:使用 Node 内置util.styleText高亮 "Keystone 6" 字样;
  2. 版本自检(checkVersion):通过package-json从 npm 拉取create-keystone-appupstream版本,与本地package.json版本比较,不一致则在 stderr 提示“你正在运行旧版本,请更新到 x.y.z”(对应 packages/create/src/index.ts);
  3. 参数归一化(normalizeArgs):若命令行没有传入目录参数(cli.input[0]为空,climeow解析),则用enquirer交互式提问"What directory should create-keystone-app generate your app into?",并对空输入做校验;最终用path.resolve将目录解析为绝对路径(packages/create/src/index.ts);
  4. 创建目录并复制模板fs.mkdir新建目标目录,然后并行复制 8 个 starter 文件(见下节);
  5. 检测包管理器:从环境变量npm_config_user_agent推断当前使用的包管理器(见“包管理器检测”小节);
  6. 输出后续指引:打印cd <目录><包管理器> install<包管理器> run dev三步命令,并提示阅读生成目录下的README.md、编辑keystone.ts(packages/create/src/index.ts)。

入口处的meow定义了最简单的 CLI 用法,这也是本文档的核心命令形态:

Usage $ create-keystone-app [directory]

即支持create-keystone-app my-app直接指定目录,或不带参数进入交互式流程。

模板文件清单

复制逻辑位于 packages/create/src/index.ts,通过fs.copyFile将以下 8 个文件从starter复制到目标目录(_gitignore复制时重命名为.gitignore):

starter 源文件生成后的文件作用
_gitignore.gitignore忽略 node_modules、.keystone、keystone.db 等产物
schema.tsschema.ts定义 User / Post / Tag 三个列表(list)
package.jsonpackage.json名为keystone-app的工程清单与 dev/build/start 脚本
prisma.config.tsprisma.config.tsPrisma CLI 的 schema 与 datasource 配置
tsconfig.jsontsconfig.jsonTypeScript 编译配置
keystone.tskeystone.tsKeystone 配置入口(db、lists、session、apolloConfig)
auth.tsauth.ts基于@keystone-6/auth的登录与无状态会话配置
README.mdREADME.md起步指引(数据库切换、鉴权说明、接入前端等)

全部文件均可直接在 packages/create/starter 目录中查看。

包管理器检测

生成结束后,CLI 需要提示用户用哪个包管理器安装依赖。v10.0.0 起引入了基于npm_config_user_agent的检测(这也是该版本在 CHANGELOG 中被标记为 Major Changes 的原因):

const [packageManager] = process.env.npm_config_user_agent?.split('/', 1) ?? ['npm']

npm_config_user_agent形如npm/9.6.7 node/v20.0.0 linux x64split('/', 1)只取第一个分隔段,即包管理器名(npmpnpmyarn等)。当用户通过 npm 启动 CLI 时,后续提示会输出npm install;若通过 pnpm 执行,则提示pnpm install——这正是“用你偏好的包管理器安装依赖”的设计落点。若环境变量缺失,则回退到npm

starter 模板剖析:生成的工程长什么样

keystone.ts:Keystone 配置入口

packages/create/starter/keystone.ts 导出一个由withAuth包裹的config(...)对象,包含四块关键配置:

  • db:使用sqliteprovider,通过@prisma/adapter-better-sqlite3PrismaBetterSqlite3适配器连接file:./keystone.db,追求最快的启动体验;onConnect钩子中,若User表为空,则用crypto.getRandomValues(new Uint8Array(16)).toHex()生成 16 字节随机密码,自动创建admin@example.com初始用户并打印到控制台(代码注释明确警告:该逻辑仅用于开发环境,不可用于生产);
  • apolloConfig.plugins:注册 Apollo 插件,在每次 GraphQL 请求开始时打印 operationName,在遇到错误时打印错误堆栈,方便开发期观察 API 行为;
  • lists:从./schema.ts导入的列表定义;
  • session:从./auth.ts导入的会话策略。

schema.ts:User / Post / Tag 三列表

packages/create/starter/schema.ts 展示了几种最常用的字段类型与关系写法,同时用satisfies Lists约束类型(Lists来自生成目录下./generated/keystone/types):

  • Username(必填文本)、email(必填且isIndexed: 'unique'唯一索引)、password(密码字段)、posts(一对多关系ref: 'Post.author')、createdAtdefaultValue: { kind: 'now' }自动记录创建时间);
  • Posttitle(必填文本)、content(来自@keystone-6/fields-document的文档字段,开启formattinglinksdividers及五种分栏布局)、author(卡片式 UI 的关系字段,many: false单作者)、tags(多对多关系ref: 'Tag.posts'many: true);
  • Tag:仅name与反向posts关系,并通过ui.hideNavigation在 Admin UI 导航中隐藏。

三个列表的access均设为allowAll,注释反复强调:这是 starter 的默认开放策略,生产环境务必参考访问控制指南收紧。

auth.ts:登录与会话

packages/create/starter/auth.ts 用createAuth配置基于 email + password 的认证(listKey: 'User'identityField: 'email'secretField: 'password'sessionData片段为'name createdAt'),并用statelessSessions提供 cookie 无状态会话,maxAge为 30 天(60 * 60 * 24 * 30),密钥取自process.env.SESSION_SECRET

其余配置文件

  • packages/create/starter/package.json:提供devkeystone dev)、startkeystone start)、buildkeystone build)三个脚本;
  • packages/create/starter/prisma.config.ts:供 Prisma CLI 使用,schema指向schema.prismadatasource.urlfile:./keystone.db——注意 Prisma CLI 与 Keystone 运行时分别从这里和keystone.ts的 adapter 读取连接,切换数据库时两处都要改;
  • packages/create/starter/tsconfig.json:target: esnextmodule: commonjsstrict: truenoEmit: true

CHANGELOG 逐版本解读:v10 到 v11 的三次大变化

以下所有条目均来自 packages/create/CHANGELOG.md 原文,按版本顺序解读其行为影响:

10.0.0 —— 包管理器检测

Adds support fornpm_config_user_agentfor determining your package manager

这是本包进入 10.x 的第一个破坏性变更:CLI 开始读取npm_config_user_agent来判断用户使用的包管理器,从而在“安装依赖”的后续指引中输出与之一致的命令。其源码实现即上文“包管理器检测”小节中的一行代码。

10.0.1 / 10.0.2 / 10.0.3 —— 模板与输出的修复

  • 10.0.1Update generated schemas,更新生成的 schema 文件(即 starter 内列表定义所对应的 GraphQL/Prisma schema 产出);
  • 10.0.2Fix starter script error when looking for pre-built schemas,修复 starter 脚本在查找预构建 schema 时的报错;
  • 10.0.3Fix output formatting for CLI instructions,修复 CLI 指引文案的输出格式。

11.0.0 —— 三项重大变更

这是 CHANGELOG 中信息量最大的一个版本,包含三个 Major Changes:

  1. 移除自动安装依赖Removes auto-install, use your preferred package manager to install dependencies instead。此前 CLI 可能自动安装依赖,现在不再自动安装,改由用户用自己偏好的包管理器执行(对应生成的指引命令npm install/pnpm install等);
  2. 升级keystone-app配置到最新主版本Updates the keystone-app configuration to the newest major version。即生成的工程清单(starter 中名为keystone-app的 package.json,当前版本 1.0.3)及其配置结构升级到与新版 Keystone 兼容;
  3. 纯 Node ESMChanges package to exclusively Node ESM。此包改为纯 ESM 发布,设计上供require(esm)使用,对普通消费者而言主要影响是需要较新的 Node 版本;同时明确声明keystone build的构建产物仍然是 CommonJS,不影响生成项目的部署形态。当前 package.json 中"type": "module"正是这一变更的直接体现。

11.0.1 —— 对齐 UI 版本

Updates@keystar/uito0.9.2to align with@keystone-6/core

@keystar/ui更新到 0.9.2,与@keystone-6/core的依赖对齐,避免 UI 组件库版本错位。

11.0.2 —— 精简发布包

Removes declaration maps andsrcfrom published package

从发布产物中移除 declaration maps 和src目录,减小 npm 包体积;结合 package.json 中files字段(diststartercli.js)可知,发布包现在只保留构建产物、模板目录与 bin 入口。

升级与使用注意事项

综合 CHANGELOG 与当前源码,使用或升级到 v11.x 时有以下几点需要留意:

  1. 安装依赖方式变了:v11 起 CLI 生成工程后不会自动安装依赖,需按提示手动执行cd <目录> && <你的包管理器> install,随后npm run dev(即keystone dev)启动;
  2. 包管理器提示是智能的:只要通过 npm/pnpm/yarn 等启动 CLI,后续指引命令会自动匹配你当前使用的包管理器,这依赖npm_config_user_agent环境变量;
  3. Node 版本要求:由于包已切换为纯 ESM 且面向require(esm),运行环境需要支持现代 Node 特性;而keystone build的产物仍是 CommonJS,线上部署形态不受影响;
  4. 数据库可平滑切换:starter 默认 SQLite(file:./keystone.db),如需切换 PostgreSQL,需安装@prisma/adapter-pgpg,在keystone.ts中用PrismaPg替换适配器,并同步修改 packages/create/starter/prisma.config.ts 中的datasource.urlprocess.env.DATABASE_URL
  5. 生产安全边界:starter 中access: allowAllonConnect自动创建初始用户的逻辑都仅面向开发体验,上线前必须收紧访问控制并移除默认凭据。

继续深入的相关文件

  • CLI 全部实现:packages/create/src/index.ts
  • 包元数据与发布配置:packages/create/package.json
  • bin 入口:packages/create/cli.js
  • 生成模板目录:packages/create/starter
  • 版本演进记录(本文依据):packages/create/CHANGELOG.md
  • 包级说明:packages/create/README.md
  • 后端

【免费下载链接】keystone

The superpowered headless CMS for Node.js — built with GraphQL and React

项目地址:https://gitcode.com/gh_mirrors/key/keystone
点击查看免费下载

相关推荐

上一篇:抖音无水印视频下载完整指南:douyin-downloader一键批量获取教程
下一篇:Subtitle Edit终极指南:如何用免费开源工具解决字幕制作的五大痛点

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 16:24:04

智慧社区建设踩坑记:这3件事千万别做

智慧社区建设踩坑记&#xff1a;这3件事千万别做 干这些年&#xff0c;见过太多智慧社区项目&#xff0c;宣传时都是"标杆"“示范”&#xff0c;落地后却成了摆设&#xff1a;大屏关着吃灰&#xff0c;平台没人登录&#xff0c;居民该跑腿还跑腿。踩坑的社区不少&…

作者头像 李华
网站建设 2026/9/24 16:18:37

【Coze】【图文】人间清醒大学男生工作流

今天给大家演示一个 Coze 图文工作流 ——「人间清醒大学男生」的完整流程。该工作流通过文字生成与图像生成的结合,把用户输入转化为“人间清醒”风格的简短文案,并进一步扩展成阳光明亮、治愈系风格的插画,主角是一位在校大学男生。最终成果不仅仅是简单的文字,而是图文并…

作者头像 李华
网站建设 2026/9/24 16:17:19

【n8n】n8n项目设置中文 npx 启动方式

n8n 是一个非常强大的自动化工具,允许用户在无代码的情况下构建复杂的工作流。然而,默认情况下,n8n 的界面是英文的,若需要使用中文界面,则需要进行一定的汉化操作。 本文将详细介绍如何将 n8n 界面汉化,并解决部分翻译缺失的问题。 文章目录 克隆 n8n 仓库并启动 汉化资…

作者头像 李华