실행과 프리뷰
「▶」 단추가 프로젝트의 pubspec.yaml 에서 풀스택 · Flutter · Jaspr · Dart · 테스트 실행 대상을 찾아 실행 탭이나 프리뷰로 돌리는 방식과, 프리뷰의 장치 크기 · 테마 · 지원 운영체제를 설명합니다.
목차
코드 모드에서 프로젝트를 돌려 보는 길은 두 가지입니다. 아래쪽 터미널 탭 줄의 「▶」 단추와 위쪽 「프리뷰」입니다. 앱은 프로젝트의 pubspec.yaml 을 훑어 무엇을 실행할 수 있는지를 스스로 찾고, 그 프로젝트의 정식 러너 명령을 터미널 탭에서 돌립니다. Flutter · Jaspr 앱은 그 결과를 프리뷰 패널 안에서 보여 줍니다. 터미널 자체는 코드 모드에 있습니다.
참고
이 쪽의 배지가 「일부」인 이유입니다. 프리뷰를 앱 안에 그리는 것은 macOS 와 Windows 뿐이고, Linux 에서는 「이 플랫폼은 내부 WebView를 지원하지 않습니다」와 주소만 나옵니다.
실행 대상 찾기
실행 대상은 프로젝트를 열 때 한 번 찾습니다. 프로젝트 폴더에서 아래로 3단계까지의 폴더에서 pubspec.yaml 을 읽고, 이름이 . 으로 시작하는 폴더와 build · node_modules · Pods · android · ios · macos · windows · linux · web · test · integration_test · lib 폴더는 들어가 보지 않습니다. 찾아낸 뒤에는 파일을 감시하지 않습니다. 열어 둔 채 터미널에서 새 프로젝트를 만들었다면 프로젝트를 다시 여세요. 대상이 하나도 없을 때에 한해 Run 메뉴의 실행 명령(Windows · Linux 는 「«실행: <이름>»」, macOS 는 보이는 탭이 실행 탭이 아닐 때의 「다시 실행」)이 한 번 더 찾기는 합니다.
패키지 하나에서 앱 대상은 하나만 잡히고(아래 순서대로 처음 맞는 것), 패키지에 test/ 폴더가 있으면 테스트 대상이 따로 하나 더 잡힙니다. 그래서 앱이면서 테스트도 있는 패키지는 대상이 둘입니다.
| 단추 | 이렇게 판정합니다 | 실행하는 명령 | 어디서 보나 |
|---|---|---|---|
| ▶ 풀스택: 이름 | pubspec.yaml 이 serverpod 를 의존하고, bin/main.dart 와 config/ 폴더가 있는 서버 |
serverpod start --no-flutter. 프로젝트 루트에 tool/serverpod/cli.sh 와 identity.yaml 이 있고 서버가 backend/<프로젝트>_server 이면(Windows 제외) bash tool/serverpod/cli.sh start --no-flutter --no-tui |
실행 탭 |
| ▶ Jaspr: 이름 | jaspr 를 의존하고 pubspec.yaml 에 jaspr: 아래 mode: 가 있는 웹 앱 |
dart run jaspr_cli:jaspr serve(jaspr_cli 를 의존하지 않으면 dart pub global run jaspr_cli:jaspr serve) |
프리뷰 |
| ▶ Flutter: 이름 | Flutter 를 의존하고, 현재 운영체제 폴더(macos · windows · linux)나 web 폴더가 있고, lib/main.dart 가 있는 앱 |
flutter run -d web-server --web-hostname 127.0.0.1 --web-port 0 -t lib/main.dart |
프리뷰 |
| ▶ Dart: 이름 | Flutter 를 의존하지 않고 bin/ 에 .dart 파일이 있는 패키지 |
dart run |
실행 탭 |
| ▶ 테스트: 이름 | test/ 폴더가 있는 패키지 |
dart test(Flutter 를 의존하면 flutter test) |
실행 탭 |
- 판정 순서는 풀스택 → Jaspr → Flutter → Dart 입니다. 단추는 풀스택 → Flutter → Jaspr → Dart → 테스트 순서(풀스택이 맨 앞, 테스트가 맨 뒤)로 늘어서고 같은 종류 안에서는 폴더 경로순입니다.
- 프로젝트 폴더에
.fvmrc파일이나.fvm폴더가 있으면 위 명령의flutter·dart앞에fvm이 붙습니다(fvm flutter·fvm dart). - Flutter 앱은 데스크톱 창으로 뜨는 것이 아니라 웹 서버로 실행되어 프리뷰에 보입니다. Flutter 웹이 지원하지 않는 기능은 프리뷰에서 동작하지 않을 수 있습니다.
「▶」로 실행하기
「▶ 종류: 이름」 단추는 아래쪽 「터미널」 탭 줄의 오른쪽에 서고, 처음 네 개까지만 나옵니다. 나머지는 macOS 의 「Run」 메뉴에서 고릅니다(Windows · Linux 의 창 안 메뉴에는 대상별 항목이 없고, 「«실행: <이름>»」이 맨 앞 대상을 실행합니다). macOS 의 「실행」(⌘ R)도 맨 앞 대상을 실행합니다. 대상이 하나도 없으면 「▶」 단추가 서지 않습니다. 그 채로 Run 메뉴의 실행 명령을 누르면(macOS 의 「실행」은 대상이 없으면 눌러지지 않고 「다시 실행」은 눌러집니다) 한 번 더 찾아본 뒤에도 없을 때 상태 표시줄에 「실행할 대상을 찾지 못했습니다 (pubspec.yaml)」가 나옵니다.
- 실행 전 점검: 필요한 명령이
PATH에 있는지 먼저 확인합니다. 명령은 풀스택이serverpod(스크립트를 쓰면bash), Flutter 앱이flutter, Jaspr 와 Dart 가dart, 테스트가flutter또는dart입니다. FVM 을 쓰면 Flutter 앱 · Jaspr · Dart · 테스트는fvm이 되고(fvm flutter·fvm dart) 풀스택은 그대로입니다. 없으면 띄우지 않고 그 탭에 「실행할 수 없습니다」와 「flutter명령을 PATH 에서 찾지 못해 실행하지 않았습니다. 설치하거나 로그인 셸의 PATH 에 추가한 뒤 다시 실행하세요.」 같은 사유를 남깁니다.serverpod는dart pub global activate serverpod_cli로 설치하라는 안내가 붙습니다. 점검 자체가 돌지 못하면 막지 않고 띄웁니다. - 어디서 도나: 풀스택 · Dart · 테스트는 터미널 탭 줄에 「▶」의 이름(예: 「풀스택: my_server」)을 가진 실행 탭이 생겨 거기서 돕니다. Flutter · Jaspr 는 프리뷰 패널이 열리고 「프리뷰: 이름」 탭이 생깁니다. 실행 탭은 대화형입니다. 핫 리로드(
r) · 재시작(R)이나 Serverpod 의 조작은 내가 키로 누르고, 앱이 대신 입력하지 않습니다. - 이미 돌고 있으면: 같은 대상을 또 누르면 새 세션을 만들지 않고 도는 탭으로 옮겨 갑니다. 포트와 빌드 폴더가 겹쳐 두 번째 세션이 첫 번째를 망가뜨리기 때문입니다.
- 중지와 다시 실행: 실행 탭이 보일 때 「■ 중지」(돌 때만)와 「↻ 다시 실행」이 나옵니다. 중지해도 탭과 출력은 남고 탭 이름에 「(종료 N)」이 붙습니다. 「↻ 다시 실행」은 같은 자리에서 새 세션으로 바꾸므로 이전 출력은 보이지 않습니다. 풀스택을 중지하면 그것이 띄운 동반 프리뷰도 함께 끝나고, 동반 프리뷰 탭에서 「■ 중지」를 눌러도 풀스택 실행 전체가 멈춥니다.
- 풀스택의 순서: 서버가 「Server running.」을 알리면 서버의
pubspec.yaml에serverpod:아래flutter_apps로 적힌 동반 Flutter 앱을 프리뷰로 띄웁니다(앱마다auto_launch가false가 아닐 때,dart-define·flavor도 그대로 넘깁니다). 2분 안에 서버가 준비되지 않거나 준비되기 전에 끝나면 「실행 준비 실패: …」를 탭에 남기고 멈춥니다. 서버가 준비된 뒤 동반 Flutter 앱을 프리뷰로 띄우다 실패해도(예: 앱 폴더에web폴더가 없을 때) 같은 문구로 멈추고 새로 띄운 서버도 끝냅니다. - 실행 환경: 터미널과 같은 규칙으로 앱 환경 변수의 일부만 넘깁니다(코드 모드의 터미널 NOTE).
프리뷰
프리뷰는 내 컴퓨터에서 실행한 앱의 화면을 앱 안에서 보여 주는 패널입니다. 호스팅하는 미리보기가 아니라, 러너가 알려 준 내 컴퓨터의 로컬 주소(localhost · 127.0.0.1)를 창 안에 그릴 뿐입니다.
열고 닫기
- 상단 막대의 「프리뷰」가 패널을 열고, 다시 누르면 접습니다. 터미널 탭 줄의 「프리뷰」와 Flutter · Jaspr 「▶」도 패널을 엽니다.
- 패널 안의 앱 선택 목록에서 앱을 고르고 「프리뷰 실행」을 누릅니다. 처음에는 첫 번째 앱이 골라져 있고, 주소를 기다리거나 화면을 그리는 동안에는 「프리뷰 실행」이 눌러지지 않습니다.
- 창이 넓으면 작업 영역 오른쪽에, 좁으면 「좁은 창에서는 프리뷰를 아래에 나눠 표시합니다」라는 안내와 함께 아래에 놓입니다. 경계를 끌어 크기를 조절합니다. 「탭으로 보기」는 패널 대신 편집기 탭(「프리뷰 · 상태」)에 놓고, 「오른쪽에서 보기」는 되돌립니다. 「프리뷰 접기」는 패널을 숨길 뿐 러너는 멈추지 않습니다. 멈추려면 「■ 중지」를 누릅니다.
- 앱이 하나도 없으면 「프리뷰할 Flutter/Jaspr 앱을 찾지 못했습니다 (pubspec.yaml).」가 나옵니다.
상태 표시
패널 위의 상태 글이 지금 단계를 알려 줍니다. 주소는 러너가 출력으로 알려 준 것을 읽어 옵니다.
| 상태 | 뜻 |
|---|---|
| 주소 없음 | 아직 실행하지 않았습니다. 「앱을 고르고 「프리뷰 실행」을 누르세요.」 |
| 주소 대기 | 러너가 앱 주소를 알리기를 기다립니다. 출력은 아래쪽 터미널에서 봅니다 |
| 표시 중 | 주소를 받아 화면을 그리는 중입니다 |
| 러너 종료 | 러너가 끝났습니다. 종료 코드가 있으면 함께 나옵니다 |
| 실행 실패 | 「프리뷰를 실행할 수 없습니다: 사유」 |
장치 크기와 새로고침
도구 줄(이름표 「미리보기」)에는 세 장치 단추가 있습니다. 처음에는 「데스크톱」이 골라져 있습니다.
| 단추 | 화면 |
|---|---|
| 폰 | 폰 모양 프레임 안에 기준 크기 393 × 852(논리 픽셀, 세로 방향)로 그립니다 |
| 태블릿 | 태블릿 프레임 안에 기준 크기 834 × 1194(논리 픽셀, 세로 방향)로 그립니다 |
| 데스크톱 | 주소 줄이 없는 브라우저 창 같은 틀 안에 패널이 허락하는 만큼 채웁니다 |
폰과 태블릿은 기준 크기를 넘지 않는 선에서 패널에 들어가도록 줄어들고, 앱이 보는 화면 크기도 그만큼 달라집니다. 주소가 있을 때 나오는 「새로고침」은 화면만 다시 읽습니다. 앱의 핫 리로드가 아닙니다.
프리뷰 테마
도구 줄의 해/달 아이콘이 프리뷰의 밝기를 바꾸고, 「Customize」가 「프리뷰 테마」 패널을 엽니다. 패널에는 테마 검색, 미리 만든 테마(CoUI Light · CoUI Dark · Ocean · Forest · High Contrast Light · High Contrast Dark), Light · Dark, 색(Primary · Foreground · Secondary · Accent · Base · Error · Border), 글자 크기 배율(100% · 115% · 130%), 모서리 배율(각진 모서리 · 기본 · 둥근 모서리)이 있습니다.
바꾼 값은 이 세션의 프리뷰에만 적용되고 프로젝트 파일은 바꾸지 않습니다. 앱에도 적용되는지는 앱이 달려 있는지에 따라 갈립니다. 앱이 window.cocodePreviewTheme 연결(버전 1, setTheme 함수)을 열어 두었으면 「연결된 앱과 프레임에 즉시 적용 · 앱 상태 유지」이고, 그렇지 않으면 「앱 테마 연결 없음 · 아래 설정은 프레임에만 적용됩니다」라서 바깥 틀만 바뀝니다. 밝기 아이콘의 설명도 각각 「앱과 프레임 밝기」 · 「프레임 밝기 (앱 연결 없음)」으로 달라집니다.
운영체제별 차이
macOS
앱 안의 웹 화면(WKWebView)에 프리뷰를 그립니다. 외부 브라우저를 저절로 열지 않습니다.
Windows
앱 안의 웹 화면(WebView2)에 프리뷰를 그립니다. 외부 브라우저를 저절로 열지 않습니다. WebView2 를 초기화하지 못하면 아래 「프리뷰를 불러오지 못했습니다」 안내가 나옵니다.
Linux
앱 안에 프리뷰를 그리지 못합니다. 패널에 「이 플랫폼은 내부 WebView를 지원하지 않습니다」와 앱 주소가 글자로 나오고, 외부 브라우저는 저절로 열리지 않습니다. 주소를 브라우저에 직접 입력해 확인하세요. 러너의 출력에도 같은 주소가 찍힙니다.
자주 겪는 문제
「이 Flutter 앱에 web 실행 대상이 없습니다」가 나옵니다
Flutter 앱은 웹 서버로 실행되는데, 앱 폴더에 web 폴더가 없어서입니다. 프리뷰 패널에는 「프리뷰를 실행할 수 없습니다: …」로 나옵니다. 터미널에서 앱 폴더로 가서 flutter create . --platforms web 으로 웹 지원을 더한 뒤 프로젝트를 다시 열고 실행하세요(Flutter 의 일반 절차이고, 프로젝트 파일이 바뀝니다). 실행 대상은 프로젝트를 열 때 한 번 찾으므로, web 폴더를 더한 것을 앱이 알아채려면 프로젝트를 다시 열어야 합니다.
「… 명령을 PATH 에서 찾지 못해 실행하지 않았습니다」가 나옵니다
실행 탭에 「실행할 수 없습니다」와 함께 「flutter 명령을 PATH 에서 찾지 못해 실행하지 않았습니다. 설치하거나 로그인 셸의 PATH 에 추가한 뒤 다시 실행하세요.」처럼 나옵니다(명령 자리에는 flutter · dart · serverpod · bash · fvm 이 옵니다). 앱이 읽은 PATH 에 해당 명령이 없습니다. 터미널에서 flutter --version 처럼 직접 실행되는지 확인하고, 되지 않으면 설치하거나 로그인 셸의 PATH 에 추가하세요. 터미널에서는 되는데 여기서만 안 되면, 앱이 시작할 때 읽은 로그인 셸의 PATH 에 그 폴더가 빠진 경우일 수 있습니다(준비물). macOS · Linux 에서는 이 점검이 실행할 로그인 셸에 한 번 더 물어보고서야 「없다」고 말합니다(Windows 는 where 의 답이 전부입니다). 점검이 돌지 못하면 막지 않고 띄웁니다.
상태가 「주소 대기」에서 멈춰 있습니다
러너가 아직 앱 주소를 출력하지 않은 것입니다. 앱은 러너 출력에서 is being served at <주소>(Jaspr 는 Serving at <주소>) 줄을 읽어 주소를 알아내고, localhost · 127.0.0.1 · ::1 의 포트가 붙은 주소만 받으며 포트로 주소를 짐작하지 않습니다. 첫 빌드는 오래 걸릴 수 있습니다. 아래쪽 「프리뷰: 이름」 탭의 출력에서 컴파일 오류나 의존성 오류가 났는지 확인하세요. 러너가 끝났다면 상태가 「러너 종료」로 바뀝니다.
「프리뷰를 불러오지 못했습니다」가 나옵니다
주소는 받았지만 앱 안의 웹 화면이 그 주소를 열지 못한 경우입니다. 사유가 함께 나오고, 「위의 새로고침으로 다시 시도할 수 있습니다」라고 안내합니다. 러너가 아직 준비 중이었을 수 있으니 잠시 뒤 「새로고침」을 눌러 보세요.
Linux 에서 프리뷰가 보이지 않습니다
정상입니다. Linux 에서는 앱 안에 프리뷰를 그리지 않습니다. 패널에 나온 주소를 브라우저에 입력하세요.
다음 단계
이제 설정 화면을 살펴봅니다. 가장 먼저 쓰는 항목은 AI 공급자입니다.