프로젝트 구조
runlot.json 하나와 진입점 하나, 그리고 자산 디렉토리. 배포 계약은 이 셋입니다.
create-runlot 이 만드는 것은 이것뿐입니다.
my-app/
runlot.json 배포 계약
src/index.ts 워커 진입점
public/ 정적 자산
hello.txt
.gitignorerunlot.json
{
"name": "my-app",
"org": "me",
"main": "src/index.ts",
"assets": "public"
}name 은 반드시 있어야 하고, main 과 assets 중 적어도 하나는 있어야 합니다 — 둘 다 없으면 서빙할 것이 없습니다. 전체 필드는 runlot.json 참조 에 있습니다.
runlot pg create · runlot storage create · runlot auth create 는 여기에 "database": true 같은 줄을 적습니다. 그것은 기록이지 선언이 아닙니다. runlot deploy 는 그 값을 보고 데이터베이스를 만들지 않습니다 — 배포가 프로비저닝 경로이면 오타 하나가 조용히 데이터베이스를 만들고, 만들어진 것을 지우는 길은 배포에 없기 때문입니다. 기록과 실제가 어긋나면 배포가 경고합니다.
진입점
기본 export 에 fetch 가 있으면 됩니다. Cloudflare Workers 를 써 보셨다면 같은 모양입니다.
export default {
async fetch(request: Request, env: Env): Promise<Response> {
return new Response("hello runlot");
},
};env 로 들어오는 것은 켠 것들입니다 — env.assets, 그리고 켰다면 env.db · env.storage · env.auth, 그리고 시크릿. 시크릿은 대문자 이름이라 소문자 바인딩과 절대 부딪히지 않습니다.
정적 자산
assets 가 가리키는 디렉토리는 통째로 번들에 들어가고, 워커에서는 env.assets 로 꺼냅니다.
if (url.pathname.startsWith("/static/")) {
return env.assets.fetch(
new Request(new URL(url.pathname.slice("/static".length), url), request),
);
}main 없이 assets 만 있으면 정적 사이트입니다. 그때는 모든 요청을 자산으로 넘기는 진입점이 자동으로 들어갑니다.
번들에는 실제 파일만 담깁니다. 심볼릭 링크와 프로젝트 루트 밖을 가리키는 경로는 거절됩니다 — 번들 안의 심링크 하나로 노드의 아무 파일이나 서빙 대상이 되기 때문입니다.
마이그레이션 디렉토리
runlot pg migrate 는 기본적으로 migrations/ 를 봅니다.
my-app/
migrations/
0001_init.sql
0002_posts.sql자세한 것은 마이그레이션 에 있습니다.