命令
ShipKit 的全部 package.json 脚本,按用途分组,外加几条常用的 wrangler 命令。
所有脚本都用 bun run <name> 运行。名字后面的参数会原样传下去,所以bun run db:seed --reset、bun run verify:deletion credits 这样写就能用。
开发
| 命令 | 作用 |
|---|---|
bun run dev | 在 3000 端口启动开发服务器,代码跑在 workerd 里,带本地 D1 和 R2 binding |
bun run preview | 在本地运行上一次 bun run build 的产物 |
bun run generate-routes | 新增或移动路由文件后重新生成 src/routeTree.gen.ts。开发服务器会自动做这件事,没开它的时候才需要手动跑 |
bun run cf-typegen | 根据 wrangler.jsonc 重新生成 worker-configuration.d.ts(Env 类型)。刚 clone 下来、以及每次改完 wrangler.jsonc 都要跑一次 |
环境变量在启动时读取。改完 .dev.vars 后要重启 bun run dev。
检查与测试
| 命令 | 作用 |
|---|---|
bun run typecheck | 对整个项目跑 tsc --noEmit |
bun run check | Biome 一次完成格式和 lint 检查(CI 跑的就是它) |
bun run lint | 只跑 Biome lint |
bun run format | 只检查格式;bun run format --write 直接改写 |
bun run test | Vitest 单元测试,包括守护规则的测试(权限、设置注册表)和在内存 D1 上跑的资金链路测试 |
bun run e2e | Playwright 端到端测试,跑在真实的开发服务器和本地 D1 上。:3000 已有服务就复用,没有就自己启动;会先写入演示数据,并用 BETTER_AUTH_SECRET 伪造一个管理员和一个普通用户的会话 |
bun run e2e:ui | 同一套测试,在 Playwright 的调试界面里跑 |
bun run verify:deletion | 把每个功能的删除方案逐个应用到仓库副本上,要求构建、类型检查和单元测试全部通过 |
verify:deletion 可以指定方案名(bun run verify:deletion credits files),也可以传 all,把所有方案叠加到同一份副本上。一台机器第一次跑 bun run e2e前需要先装浏览器:bunx playwright install chromium。
数据库
| 命令 | 作用 |
|---|---|
bun run db:generate | 根据 src/core/db/schema.ts 的 schema 在 drizzle/ 里生成一个新的 SQL 迁移 |
bun run db:migrate:local | 把待执行的迁移应用到本地 D1 |
bun run db:migrate:remote | 把待执行的迁移应用到生产 D1。需要手动执行,而且要在部署依赖它的代码之前 |
bun run db:seed | 往本地 D1 写入 90 天的确定性演示数据(所有 id 以 seed- 开头)。可重复执行 |
bun run db:seed --reset | 只删除演示数据 |
bun run db:seed --remote | 给公开演示站的 D1 写演示数据。绝不要对真实的生产库执行 |
bun run auth:generate | 按 auth.cli-config.ts 重新生成 src/features/auth/schema.ts 里的 better-auth 表;之后接着跑 bun run db:generate |
迁移的完整流程见数据库。
构建与部署
| 命令 | 作用 |
|---|---|
bun run build | 生产构建,预渲染营销页,再根据预渲染出的页面生成 sitemap.xml 和 robots.txt 里的相应行 |
bun run deploy | 先 bun run build,再 wrangler deploy |
bun run deploy:www | 部署 infra/www-redirect/ 里可选的 www 跳转主域名 Worker。通常用 Cloudflare 的重定向规则更省事 |
构建还会生成 src/paraglide/,类型检查和单元测试都依赖它。所以在全新的checkout 上,先跑一次 bun run build(或启动开发服务器),再跑bun run typecheck。部署细节见部署。
支付
| 命令 | 作用 |
|---|---|
bun run stripe:listen | 通过 Stripe CLI 把 Stripe webhook 转发到 localhost:3000/api/webhooks/stripe,密钥取自 .dev.vars 里的 STRIPE_SECRET_KEY。它会打印出 whsec_…,这就是 STRIPE_WEBHOOK_SECRET 的值 |
在本地测试 Stripe 购买流程时必须开着它。Creem 没有转发用的 CLI,做法见支付。
营销素材
| 命令 | 作用 |
|---|---|
bun run capture:marketing | 用运行中的应用和已写入演示数据的本地 D1,重新截取落地页上的产品截图,输出到 public/marketing/。传一个界面名则只重拍那一张 |
bun run upload:marketing <dir> | 把 <dir> 里的图片缩放并转成 webp,上传到 R2 bucket 的 marketing/ 下,页面通过 appConfig.mediaUrl 读取。加 --dry-run 先看计划 |
bun run og | 用 scripts/og-card.html 重新生成 public/og.png(1200×630) |
capture:marketing 需要 :3000 上的开发服务器,以及 bun run e2e 准备好的登录会话,所以先完整跑一次 e2e。跑完 bun run og 后,要把src/routes/__root.tsx 里 socialCard 的 v 加一,否则社交平台的爬虫会一直用缓存的旧图。详见落地页与主题。
常用命令
下面这些不是脚本,但会经常用到。
第一次登录后把自己设为管理员(生产环境把 --local 换成 --remote):
bunx wrangler d1 execute DB --local \
--command "UPDATE user SET role='admin' WHERE email='you@example.com'"
查询本地数据库:
bunx wrangler d1 execute DB --local --command "SELECT id, email, role FROM user LIMIT 5"
在 bun run dev 运行时手动触发每晚的定时任务:
curl "localhost:3000/cdn-cgi/handler/scheduled"
添加一个 shadcn/ui 组件(之后看一下 git diff src/components/ui,这个 CLI可能会覆盖你改过的文件):
bunx shadcn@latest add <component>
写入一个生产环境的 secret:
bunx wrangler secret put BETTER_AUTH_SECRET