关于 new
用于创建或关联 Railway 项目并添加服务的技能,也提供应用与 monorepo 配置指引,面向通过 Railway CLI 部署代码和数据库的开发者。
主要功能
- 01创建或关联 Railway 项目
- 02向已关联项目添加服务
- 03按项目类型指导应用配置
- 04配置独立或共享 monorepo
- 05将数据库设置交由对应技能
- 06检查 CLI 与登录前提
适用场景
- 01启动新的 Railway 项目
- 02添加 API 或 worker 服务
- 03部署代码仓库或 monorepo 包
- 04连接现有项目
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ railwayapp/ railway-skills --skill new安装后在 Claude Code 中输入/new确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/environment-config.mdmonorepo.mdrailpack.mdvariables.md详细介绍
新建项目/服务/数据库
通过适当的配置创建 Railway 项目、服务和数据库。
使用场景
- 用户说“部署到 Railway”(如果已关联,则添加服务;如果未关联,则初始化)
- 用户说“创建 Railway 项目”“初始化”“新建项目”(明确要新建项目)
- 用户说“关联到 Railway”“连接到 Railway”
- 用户说“创建服务”“添加后端”“新建 API 服务”
- 用户说“创建 Vite 应用”“创建 React 网站”“创建 Python API”
- 用户说“从 github.com/user/repo 部署”“从这个仓库创建服务”
- 用户说“添加 Postgres”“添加数据库”“添加 Redis”“添加 MySQL”“添加 Mongo”
- 用户说“连接到 Postgres”“接入数据库”“将我的 API 连接到 Redis”
- 用户说“添加 Postgres 并连接到服务器”
- 同时设置代码和 Railway 服务
先决条件
检查是否已安装 CLI:
command -v railway
如果尚未安装:
安装 Railway CLI:
npm install -g @railway/cli或者
brew install railway
检查是否已完成身份验证:
railway whoami --json
如果尚未完成身份验证:
运行
railway login进行身份验证。
决策流程
railway status --json (in current dir)
│
┌────┴────┐
Linked Not Linked
│ │
│ Check parent: cd .. && railway status --json
│ │
│ ┌────┴────┐
│ Parent Not linked
│ Linked anywhere
│ │ │
│ Add service railway list
│ Set rootDir │
│ Deploy ┌───┴───┐
│ │ Match? No match
│ │ │ │
│ │ Link Init new
└───────┴────────┴────────┘
│
User wants service?
│
┌─────┴─────┐
Yes No
│ │
Scaffold code Done
│
railway add --service
│
Configure if needed
│
Ready to deploy
检查当前状态
railway status --json
- 如果已关联:向现有项目添加服务(见下文)
- 如果未关联:检查父目录是否已关联(见下文)
已关联时
默认行为:“部署到 Railway”=向已关联的项目添加服务。
除非用户明确表示以下意图,否则不要创建新项目:
- “新建项目”“创建项目”“初始化项目”
- “独立项目”“不同的项目”
“flappy-bird”或“my-api”这样的应用名称是服务名称,不是项目名称。
User: "create a vite app called foo and deploy to railway"
Project: Already linked to "my-project"
WRONG: railway init -n foo
RIGHT: railway add --service foo
关联父目录
Railway CLI 会沿目录树向上查找已关联的项目。如果当前位于子目录中:
cd .. && railway status --json
如果父目录已关联,则无需初始化或关联子目录。应改为:
- 创建服务:
railway add --service <name> - 通过环境技能将
rootDirectory设置为子目录路径 - 从根目录部署:
railway up
如果没有父目录已关联,则继续执行初始化或关联流程。
初始化还是关联
如果已关联,则跳过本节——只需添加服务。
仅当没有项目已关联(包括通过父目录关联)时,才使用本节。
检查用户的项目
输出可能很长。请在子 Agent 中运行,并仅提取以下内容:
- 项目的
id和name - 工作区的
id和name
railway list --json
决策逻辑
- 用户明确表示“新建项目” → 使用
railway init - 用户指定了现有项目 → 使用
railway link - 目录名称与现有项目匹配 → 询问用户:关联现有项目还是创建新项目?
- 没有匹配的项目 → 使用
railway init - 意图不明确 → 询问用户
创建新项目
railway init -n <name>
选项:
-n, --name- 项目名称(在非交互模式下,如果省略则自动生成)-w, --workspace- 工作区名称或 ID(如果存在多个工作区,则为必填项)
多个工作区
如果用户有多个工作区,railway init 必须指定 --workspace 标志。
通过以下方式获取工作区 ID:
railway whoami --json
workspaces 数组包含每个工作区的 { id, name }。
根据用户输入推断工作区:
如果用户说“部署到 xxx 工作区”或“在 my-team 中创建项目”,请将名称与
workspaces 数组进行匹配,并使用相应的 ID:
# User says: "create a project in my personal workspace"
railway whoami --json | jq '.workspaces[] | select(.name | test("personal"; "i"))'
# Use the matched ID: railway init -n myapp --workspace <matched-id>
关联现有项目
railway link -p <project>
选项:
-p, --project- 项目名称或 ID-e, --environment- 环境(默认为 production)-s, --service- 要关联的服务-t, --team- 团队/工作区
创建服务
链接项目后,创建服务:
railway add --service <name>
GitHub 仓库来源:先创建一个空服务,然后调用 environment skill,通过 staged changes API 配置来源。不要使用 railway add --repo——它需要 GitHub 应用集成,而该集成经常失败。
流程:
railway add --service my-api- 调用
environmentskill,设置source.repo和source.branch - 应用更改以触发部署
根据项目类型进行配置
构建配置请参考 railpack.md。 monorepo 模式请参考 monorepo.md。
静态站点(Vite、CRA、Astro static):
- Railpack 会自动检测常见的输出目录(dist、build)
- 如果使用非标准输出目录:调用
environmentskill 设置RAILPACK_STATIC_FILE_ROOT - 不要使用
railway variablesCLI——始终使用 environment skill
Node.js SSR(Next.js、Nuxt、Express):
- 确认 package.json 中存在
start脚本 - 如果需要自定义启动方式:调用
environmentskill 设置startCommand
Python(FastAPI、Django、Flask):
- 确认存在
requirements.txt或pyproject.toml - Railpack 会自动检测,通常无需配置
Go:
- 确认存在
go.mod - 会自动检测,无需配置
Monorepo 配置
**关键决策:**根目录还是自定义命令。
隔离式 monorepo(应用之间不共享代码):
- 将 Root Directory 设置为应用的子目录(例如
/frontend) - 构建时只能访问该目录中的代码
共享式 monorepo(TypeScript 工作区、共享包):
- 不要设置根目录
- 设置自定义构建和启动命令,以筛选目标包:
- pnpm:
pnpm --filter <package> build - npm:
npm run build --workspace=packages/<package> - yarn:
yarn workspace <package> build - Turborepo:
turbo run build --filter=<package>
- pnpm:
- 设置监视路径,避免不必要的重新构建
详细模式请参阅 monorepo.md。
项目设置指南
分析代码库,确保其兼容 Railway。
分析代码库
检查是否存在以下项目文件:
package.json→ Node.js 项目requirements.txt、pyproject.toml→ Python 项目go.mod→ Go 项目Cargo.toml→ Rust 项目index.html→ 静态站点- 均不存在 → 指导搭建项目骨架
检测 monorepo:
pnpm-workspace.yaml→ pnpm 工作区(共享式 monorepo)- 含有
workspaces字段的package.json→ npm/yarn 工作区(共享式 monorepo) turbo.json→ Turborepo(共享式 monorepo)- 存在多个各自含有
package.json、但没有工作区配置的子目录 → 隔离式 monorepo
项目骨架提示
如果没有代码,请参考 railpack.md 中的最简模式:
静态站点:
在根目录中创建一个
index.html文件。
Vite React:
npm create vite@latest . -- --template react
Astro:
npm create astro@latest
Python FastAPI:
创建一个包含 FastAPI 应用的
main.py,以及一个包含依赖项的requirements.txt。
Go:
创建一个
main.go,其中包含监听PORT环境变量指定端口的 HTTP 服务器。
数据库
添加数据库(Postgres、Redis、MySQL、MongoDB)时,请使用 database skill。
database skill 负责:
- 创建数据库服务
- 配置连接变量引用
- 将服务连接到数据库
组合使用
- 创建服务后:使用
deployskill 推送代码 - 高级配置:使用
environmentskill(buildCommand、startCommand) - 配置域名:使用
domainskill - 检查状态:使用
statusskill - 服务操作(重命名、删除、查看状态):使用
serviceskill
错误处理
未安装 CLI
Railway CLI not installed. Install with:
npm install -g @railway/cli
or
brew install railway
未通过身份验证
Not logged in to Railway. Run: railway login
没有工作区
No workspaces found. Create one at railway.com or verify authentication.
项目名称已被占用
Project name already exists. Either:
- Link to existing: railway link -p <name>
- Use different name: railway init -n <other-name>
服务名称已被占用
Service name already exists in this project. Use a different name:
railway add --service <other-name>
示例
创建 HTML 静态站点
User: "create a simple html site and deploy to railway"
1. Check status → not linked
2. railway init -n my-site
3. Guide: create index.html
4. railway add --service my-site
5. No config needed (index.html in root auto-detected)
6. Use deploy skill: railway up
7. Use domain skill for public URL
创建 Vite React 服务
User: "create a vite react service"
1. Check status → linked (or init/link first)
2. Scaffold: npm create vite@latest frontend -- --template react
3. railway add --service frontend
4. No config needed (Vite dist output auto-detected)
5. Use deploy skill: railway up
向项目添加 Python API
User: "add a python api to my project"
1. Check status → linked
2. Guide: create main.py with FastAPI, requirements.txt
3. railway add --service api
4. No config needed (FastAPI auto-detected)
5. Use deploy skill
链接并添加服务
User: "connect to my backend project and add a worker service"
1. railway list --json → find "backend"
2. railway link -p backend
3. railway add --service worker
4. Guide setup based on worker type
部署到 Railway(含义不明确)
User: "deploy to railway"
1. railway status → not linked
2. railway list → has projects
3. Directory is "my-app", found project "my-app"
4. Ask: "Found existing project 'my-app'. Link to it or create new?"
5. User: "link"
6. railway link -p my-app
7. Ask: "Create a service for this code?"
将服务添加到隔离式 Monorepo
User: "create a static site in the frontend directory"
1. Check: /frontend has its own package.json, no workspace config
2. This is isolated monorepo → use root directory
3. railway add --service frontend
4. Invoke environment skill to set rootDirectory: /frontend
5. Set watch paths: /frontend/**
将服务添加到 TypeScript Monorepo
User: "add a new api package to this turborepo"
1. Check: turbo.json exists, pnpm-workspace.yaml exists
2. This is shared monorepo → use custom commands, NOT root directory
3. Guide: create packages/api with package.json
4. railway add --service api
5. Invoke environment skill to set buildCommand and startCommand (do NOT set rootDirectory)
6. Set watch paths: /packages/api/**, /packages/shared/**
部署现有 pnpm 工作区包
User: "deploy the backend package to railway"
1. Check: pnpm-workspace.yaml exists → shared monorepo
2. railway add --service backend
3. Invoke environment skill to set buildCommand and startCommand
4. Set watch paths for backend + any shared deps
部署已链接项目的子目录
User: "create a vite app in my-app directory and deploy to railway"
CWD: ~/projects/my-project/my-app (parent already linked to "my-project")
1. Check status in my-app → not linked
2. Check parent: cd .. && railway status → IS linked to "my-project"
3. DON'T init/link the subdirectory
4. Scaffold: bun create vite my-app --template react-ts
5. cd my-app && bun install
6. railway add --service my-app
7. Invoke environment skill to set rootDirectory: /my-app
8. Deploy from root: railway up