Fabric应用项目结构

Fabric Apps 项目将后台配置、数据模型和前端代码分开。 具体布局取决于模板。 默认 blankapp 模板解析为 Universal App,这是一个拥有独立前端、数据和共享包的 npm 工作区。

文件夹布局

默认的通用应用支架结构如下:

your-project/
├── rayfin/
│   ├── .env
│   ├── rayfin.yml
│   └── tsconfig.json
├── packages/
│   ├── frontend/
│   │   ├── src/
│   │   └── package.json
│   ├── data/
│   │   └── src/index.ts
│   └── shared/
│       └── src/index.ts
├── package.json
├── tsconfig.json
└── README.md
Location 所有权
rayfin/ 后端配置和当前环境的值。
packages/frontend/ 浏览器界面、客户端初始化和前端构建。
packages/data/ 带装饰器的运行时实体类和架构注册。
packages/shared/ 与前端共享的同构记录契约和模式类型。 不要在这里放后端专用代码。

基础脚手架中的数据被禁用。 当应用需要持久记录时启用:

npm run pack:add -- data-modeling

该功能增加了起始实体和共享契约,并启用了数据服务。 关于实体创作和MSSQL方言配置,请参见 定义数据模型。

Flat-template 替代方案

一些模板和现有应用使用平面布局,前端代码位于 root src/ 中,实体位于 rayfin/data/ 中,模式类型映射位于 rayfin/data/schema.ts 中。 这种布局依然有效。 不要移动文件或创建重复包来匹配另一个模板。 阅读 rayfin/rayfin.yml 中的服务路径,找到你的项目实际构建的目录。

关键配置文件

rayfin/rayfin.yml

rayfin/rayfin.yml 文件是Fabric应用后端的主配置文件。 它控制哪些服务在本地开发期间运行,并支持动态配置值的环境变量内插。

默认工作区使用显式服务路径。 以下示例展示了为需要数据库的应用启用“数据”后的这些路径:

id: my-app
name: my-app
version: 1.0.0
services:
  auth:
    enabled: true
    allowedRedirectUris:
      - http://localhost:5173
    fabric:
      enabled: true
      externalEntraExchange: true
    password:
      enabled: false
  data:
    enabled: true
    dialect: mssql
    path: packages/data
    buildCommand: npm run build
  staticHosting:
    enabled: true
    path: packages/frontend
    folder: dist
    buildCommand: npm run build:fabric
    indexDocument: index.html
    assetAccess: protected

服务 path 值是相对于项目根的。 构建命令在已解析的服务目录中运行。 函数初始化还会在选择工作区包(如 packages/functions)时记录 services.functions.path。 扁平项目可以使用现有的 rayfin/functions 位置。 参见 使用函数。

配置包括以下关键字段:

顶级字段

领域 类型 必需 说明
id string 是的 用作 Docker Compose 项目名称和 Fabric 项目标识符的 slug(短标识)。
name string 是的 便于阅读的项目显示名称。
version string 是的 Project版本(semver)。
services object 是的 服务配置块。

services.data

领域 类型 默认 说明
enabled boolean false 启用数据服务。
dialect string — 在 Fabric 中将 mssql 用于 SQL 数据库。 启用数据时为必填项。
path string — 相对于项目根的数据包目录,例如 packages/data。 平面模板可以使用 rayfin/data。
buildCommand string — 为配置的数据包构建命令。

services.auth

领域 类型 默认 说明
enabled boolean false 启用身份验证服务。
expiryInMinutes number — JWT 令牌在几分钟内过期。
customClaims Record<string, string> — 添加到已签发 JWT 中的自定义声明。
scopes string[] — OAuth 范围(例如 ["read:data", "write:data"])。
refreshToken.lifetimeInDays number — 刷新令牌有效期(天数)。
allowedRedirectUris string[] ["http://localhost:5173"] 允许用于身份验证回调的重定向 URI。

services.auth.password

领域 类型 默认 说明
enabled boolean true 为本地开发启用电子邮件和密码身份验证

services.auth.fabric

领域 类型 默认 说明
enabled boolean false 启用Fabric中转身份验证(Microsoft Entra ID SSO)。
externalEntraExchange boolean — 在目标环境支持时,启用直接委派Entra令牌交换和外部父主机认证。

services.staticHosting

领域 类型 默认 说明
enabled boolean false 启用静态内容托管。
path string — 前端包目录相对于项目根节点。
root string — 旧版前端根,用于扁平配置。
folder string "dist" 包含相对于已解析前端路径构建的静态资产的目录。
buildCommand string — 打包之前要运行的 Shell 命令(例如, npm run build)。
indexDocument string — 为根路径提供的默认文档(例如, index.html)。

小窍门

所有字符串值都支持使用 ${VAR} 和 ${VAR:-default} 语法进行环境变量插值。 变量从 rayfin/.env 和 Shell 环境中解析。

rayfin/.env

该 rayfin/.env 文件包含当前运行时和部署值,并通过插值向 rayfin.yml 提供值。 CLI 为当前活动的后端写入框架中立的 RAYFIN_PUBLIC_* 值。 只有带有该前缀的变量才会投影到生成的前端环境文件中。 绝不要把敏感信息放进 RAYFIN_PUBLIC_* 变量里。

不要将 rayfin/.env 纳入版本控制。 使用 rayfin/.env.example 记录带有占位符的预期变量。

rayfin/.deployments.json

部署注册表记录了项目部署的后端 URL、托管 URL、项 ID 和工作区 ID。 它不是一个前端环境文件。 不要将其纳入源代码管理。 使用 npx rayfin up list 列出已记录的部署,使用 npx rayfin up switch <name> 切换当前活动部署并重新生成其环境值。

rayfin/tsconfig.json

模板为其自身布局提供 TypeScript 配置。 Workspace 包有自己的配置和项目引用;平面模板可以通过 rayfin/tsconfig.json 编译实体。 保留脚手架的引用,使用其构建和类型检查脚本,而不要假定只有单一根级编译流程。

数据模型文件

保持运行时注册和面向客户端的类型与你所选的布局保持一致。

工作空间实体与共享契约

在通用应用中,packages/data/src/ 下的文件定义了装饰实体类。 在由 schema 导出的 packages/data/src/index.ts 数组中注册运行时类。

保持匹配的记录接口以及 packages/shared/src/index.ts 中的 UniversalAppSchema 类型。 前端是从这个契约 @rayfin-app/shared 导入,而不是导入装饰过的后端类。

平面模板实体

在平面模板中,rayfin/data/*.ts定义实体,rayfin/data/schema.ts将实体名称映射为client.data.<Entity>的类型。 按照模板提供的注册机制操作。

生成的产物

rayfin/.temp/

该 rayfin/.temp/ 文件夹包含运行开发服务器时创建的生成的后端项目。 如果后端似乎正在使用过时的架构或配置,请停止并重启开发堆栈以重新生成这些文件。

Important

不要将 .temp/ 文件夹提交到存储库。 将其添加到 .gitignore 文件。

前端结构

默认前端位于 packages/frontend/src/。 扁平模板可以使用根 src/。 services.staticHosting.path 设置用于标识前端包。

当前环境与框架映射

rayfin dev 和 rayfin up 从 .env.local 生成框架特定的 rayfin/.env 值。 对于嵌套前端,文件写成 services.staticHosting.path,例如 packages/frontend/.env.local;平面项目使用项目根。

源位于rayfin/.env Vite 输出在 .env.local 中 .env.local 中的 Next.js 输出
RAYFIN_PUBLIC_API_URL VITE_RAYFIN_API_URL NEXT_PUBLIC_RAYFIN_API_URL
RAYFIN_PUBLIC_PUBLISHABLE_KEY VITE_RAYFIN_PUBLISHABLE_KEY NEXT_PUBLIC_RAYFIN_PUBLISHABLE_KEY
RAYFIN_PUBLIC_ITEM_ID VITE_FABRIC_ITEM_ID NEXT_PUBLIC_FABRIC_ITEM_ID
RAYFIN_PUBLIC_WORKSPACE_ID VITE_FABRIC_WORKSPACE_ID NEXT_PUBLIC_FABRIC_WORKSPACE_ID
RAYFIN_PUBLIC_PORTAL_URL VITE_FABRIC_PORTAL_URL NEXT_PUBLIC_FABRIC_PORTAL_URL

在 rayfin/.env 中编辑源值,而不是生成的文件。 无需部署即可重新生成:

npx rayfin env --framework vite

可使用 --framework nextjs 或 --framework plain 用于其他支持的映射。 使用 --output <dir> 选择输出目录,或使用 --show 检查公共映射而无需写入。 不要将生成的 .env.local 文件纳入源代码控制。

迁移旧的环境布局

较早的项目可能包含 .env.fabric 或 .env.fabric-<workspace> 文件。 这些文件不是当前布局中的活动环境文件。 运行 npx rayfin up 以使用当前环境的工作流程。 查看任何迁移消息,并根据需要将自定义值复制到 rayfin/.env 中。 部署注册表取代了每个工作区的环境文件。 不要将新应用配置为依赖它们。