사람함께에이전트▾
사람 — 직접 정하고 책임지는 비즈니스 규칙과 흐름. 직접 읽어보세요.
함께 — 개념은 알아두고, 세부 규칙은 에이전트가 따릅니다.
에이전트 — 에이전트가 따르는 규칙과 레퍼런스. 필요할 때 찾아보세요.
CLI 레퍼런스▾
AkanJS 레퍼런스▾
애플리케이션 CLI
앱을 만드는 순간부터 출시까지 쓰는 명령입니다. 앱을 만들고, 로컬에서 띄우고, 검사·빌드한 뒤 네이티브 앱으로 내보냅니다.
앱 관리
명령설명
템플릿으로
apps/ 아래에 새 앱을 만듭니다.워크스페이스에서 앱 폴더를 지웁니다.
앱이나 라이브러리의 생성 파일을 다시 만듭니다.
앱을 별도 워크스페이스로 옮길 때 필요한 파일을 나열합니다.
로컬 개발
명령설명
앱 하나 또는 여럿을 개발 서버로 띄웁니다.
로컬 데이터베이스 컨테이너를 띄웁니다.
로컬 데이터베이스 컨테이너를 내립니다.
앱의
script/ 폴더에 있는 파일을 실행합니다.대화형 서버 콘솔을 엽니다.
실행 중인 앱의 로그를 필터로 걸러 봅니다.
검사와 빌드
네이티브
명령설명
시뮬레이터, 에뮬레이터, 연결된 기기에서 앱을 실행합니다.
이 컴퓨터에서 앱을 데스크톱 앱으로 실행합니다.
네이티브 런타임으로 네이티브 앱을 빌드합니다.
App Store나 Play Store 출시용으로 앱을 빌드합니다.
설치된 앱이 스스로 업데이트할 릴리스를 서명해 게시하거나, 다른 곳에서 서명할 폰 업데이트를 묶습니다.
create-application
앱 템플릿으로
apps/<appName>을 만들고 sync까지 실행합니다. --start를 주면 개발 서버도 바로 띄웁니다.형식
인자
appNameString필수
앱 이름입니다. 소문자로 바뀌고 공백은 하이픈이 됩니다.
옵션
--startBoolean기본값 false
앱을 만든 직후 개발 서버를 띄우고 브라우저를 엽니다.
예시
remove-application
apps/<app> 폴더를 지워 앱을 sync, 빌드, 배포에서 뺍니다. 되살릴 수도 있다면 먼저 커밋해 둡니다.형식
예시
sync
앱이나 라이브러리를 다시 스캔해 생성 파일을 새로 씁니다. 파일을 추가·이름 변경·삭제했거나 import를 바꾼 뒤에 실행합니다.
형식
참고
이름설명
생성 파일
index.ts, cnst.ts, st.ts 같은 배럴 파일, akan.<app|lib>.json, 범위별 AGENTS.md입니다.의존성
코드가 import하는 패키지를 루트와 같은 버전으로 자기
package.json에 적습니다.앱에서만
lib 에셋을
public/libs에 연결하고, syncPageLibs를 켰다면 lib 라우트도 page/(libs)에 연결합니다.자동 실행
start, build, typecheck, test는 --write로 이 작업을 먼저 실행합니다.예시
plan-slice
앱이 독립된 워크스페이스로 옮겨 갈 때 필요한 파일을 정확히 출력합니다. 계획만 보여 주고 아무것도 쓰지 않습니다.
형식
옵션
--formatString기본값 texttext | json
출력 형식입니다.
참고
이름설명
담기는 것
앱, 앱이 닿는 모든 lib, 이를 감싸는 워크스페이스 뼈대, 루트
package.json입니다.파일 출처
파일 목록을 git에서 가져오므로 env 값처럼 gitignore된 파일은 빠집니다.
루트 매니페스트
슬라이스가 import하는 패키지만 워크스페이스의 버전 그대로 남깁니다.
경고
앱이나 lib 아래의 추적되지 않는 파일은 git이 옮기지 않으므로 경고로 나열합니다.
예시
start
SSR 프론트엔드와 백엔드를 함께 띄우는 개발 서버입니다. 앱은 공백이나 쉼표로 나열하거나
all을 주고, 생략하면 체크 목록에서 고릅니다. 여러 앱도 한 세션에서 함께 돌아갑니다.형식
옵션
--plainBoolean기본값 false
전체 화면 뷰 대신 앱 이름이 붙은 줄을 섞어 출력합니다.
--killBoolean기본값 false
개발 포트를 먼저 비웁니다. akan 프로세스가 아닌 점유자는 알리기만 하고 그대로 둡니다.
--concurrencyNumber
동시에 부팅할 앱 수입니다. 비우면 (메모리 절반 ÷ 1.8GB)와 (코어 수 ÷ 4) 중 작은 값입니다.
--dbupBoolean기본값 true
앱마다 실행할 모드의 로컬 서비스를 먼저 띄웁니다. 끝날 때는 자기가 띄운 것만 내립니다.
--openBoolean기본값 false
브라우저로 앱을 엽니다.
--shareBoolean기본값 false
akan 터널로 각 앱을 공개 URL에도 올립니다. 뷰에서
s를 누르면 복사됩니다.--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan s로도 실행합니다.자동 전환
파이프, 리다이렉트, 크기를 알 수 없는 터미널에서는 저절로
--plain이 됩니다.세션 로그
앱마다
local/apps/<app>/runtime/dev.log에 기록합니다. 앱 하나를 --plain으로 띄울 때만 빠집니다.메모리 예산
AKAN_MEMORY_LIMIT을 주면 --concurrency 계산에 쓰는 메모리가 줄어듭니다.예시
dbup
Docker Compose로 로컬 데이터베이스 서비스를 띄웁니다.
multiple에는 Redis를, cluster에는 Redis와 Postgres 18을 띄웁니다. akan start는 --dbup false가 아니면 이 작업을 알아서 합니다.형식
옵션
--modeStringsingle | multiple | cluster
한 모드의 서비스만 띄웁니다.
single에는 필요한 서비스가 없습니다. 빼면 워크스페이스의 앱들이 선언한 모든 모드를 띄웁니다.참고
이름설명
Docker
Docker 데몬이 실행 중이어야 합니다. 이미 떠 있는 서비스는 그대로 둡니다.
compose 파일
local/docker-compose.yaml은 처음 실행할 때 만들어지고, 그 뒤로는 직접 관리합니다.빠진 서비스
예전 compose 파일에는 서비스가 빠져 있을 수 있습니다. 직접 더하거나, 파일을 치워 두면 현재 템플릿으로 새로 만듭니다.
예시
dbdown
local/에서 docker compose down을 실행해 로컬 데이터베이스를 내립니다. 어느 앱이 띄웠든 그 compose 프로젝트의 서비스가 모두 멈춥니다.형식
예시
db-export
셸이 가리키는 모드의 데이터베이스에서 앱의 model 테이블마다 NDJSON 파일 하나씩을 씁니다.
db-import와 짝지어 single에서 cluster처럼 모드 사이에 데이터를 옮깁니다.형식
옵션
--dirString기본값 local/transfer
파일을 쓸 폴더로, 워크스페이스 루트 기준입니다.
참고
이름설명
모드
셸의
AKAN_DATABASE_MODE, 없으면 앱이 처음으로 선언한 모드입니다.배포된 데이터
배포된
single 앱이라면 SQLite 파일을 복사하고 SQLITE_DATABASE_PATH가 그 복사본을 가리키게 합니다.요청 없음
요청을 받지 않고 cron과 init 작업도 돌리지 않는 채로 앱을 띄웁니다.
예시
db-import
db-export가 쓴 파일을 셸이 가리키는 모드의 데이터베이스로 읽어 들입니다. 앱이 그 모드를 선언해야 합니다.형식
옵션
--dirString기본값 local/transfer
파일을 읽을 폴더로, 워크스페이스 루트 기준입니다.
참고
이름설명
행
행은 저장된 그대로, 삭제된 행까지 옮겨집니다. 이미 있는 id는 덮어쓰므로 다시 실행해도 됩니다.
텍스트 검색
가져오기가 끝나면 검색 인덱스를 다시 만듭니다.
옮기지 않는 것
세션과 대기 중인 작업은 옮기지 않으므로 사용자는 다시 로그인합니다.
local/의 업로드 파일은 직접 복사합니다.요청 없음
요청을 받지 않고 cron과 init 작업도 돌리지 않는 채로 앱을 띄웁니다.
예시
script
앱을 sync한 뒤
apps/<app>/script/<filename>.ts를 Bun으로 실행합니다. 파일 이름을 빼면 목록에서 고릅니다.형식
인자
filenameString
script/ 바로 아래 파일입니다. .ts는 붙여도 되고 빼도 됩니다. 하위 폴더 경로는 거부됩니다.예시
console
앱의 서비스와 데이터를 실행 환경에서 직접 들여다보는 대화형 콘솔을 엽니다.
akan build가 main.js 옆에 console.js도 만들어 두므로 컨테이너 안에서도 같은 콘솔을 씁니다.형식
참고
이름설명
프로세스
요청을 받지 않고 internal 작업도 돌리지 않는 별도 서버를 띄웁니다.
main.js에 붙지 않습니다.전역 변수
프롬프트에서
srv, sig, db, cnst, dict, option을 바로 씁니다.컨테이너
빌드된 컨테이너나 pod 안에서는
AKAN_CONSOLE=1 bun console.js를 실행합니다.운영 환경
main 환경, cloud·edge 모드, NODE_ENV=production에서는 AKAN_CONSOLE=1 없이 열리지 않습니다.예시
logs
실행 중인 앱의
akan-control.sock에 붙어 로그를 따라 봅니다. 모든 기록에 호출의 traceId, endpoint, origin이 붙어 있어 글자뿐 아니라 호출 단위로 거를 수 있습니다.형식
옵션
--levelStringtrace | verbose | debug | info | warn | error
출력할 가장 낮은 레벨입니다.
--grepString
메시지에 들어 있어야 할 글자입니다.
--endpointString
쉼표로 구분한 endpoint 글롭입니다. 예:
mutation:*, query:userList.--traceString
요청 하나의 traceId입니다. 그 요청이 남긴 모든 줄을 모읍니다.
--childString
쉼표로 구분한 레플리카 번호입니다.
--roleString-R
프로세스 역할입니다:
gateway, federation, batch, all, rsc-worker.--originString
호출 출처입니다:
http, websocket, mcp, internal, page.--sinceString
이보다 새 기록만 봅니다:
30s, 5m, 2h, 1d 또는 epoch ms.--replayNumber기본값 0-n
따라 보기 전에 버퍼에서 먼저 출력할 기록 수입니다.
--follow false일 때는 출력할 기록 수의 상한입니다.--jsonBoolean기본값 false
사람이 읽는 줄 대신 NDJSON 기록을 출력합니다.
--followBoolean기본값 true
계속 따라 봅니다.
--follow false는 지난 기록만 출력하고 끝냅니다.--runtime-dirString기본값 local/apps/<app>/runtime-d
akan-control.sock이 있는 폴더입니다. 비우면 AKAN_RUNTIME_DIR, 그다음 기본값을 씁니다.참고
이름설명
콘솔에서
akan console에서도 .tail과 .trace <id>로 같은 필터를 씁니다.예시
typecheck
TypeScript로 앱의 타입을 검사합니다. 증분 캐시를 재사용하며,
--clean을 주면 먼저 캐시를 지웁니다.형식
옵션
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.--cleanBoolean기본값 false
검사 전에 증분 캐시(
tsconfig.tsbuildinfo)를 지웁니다.--incrementalBoolean기본값 true
TypeScript 증분 캐시를 재사용합니다.
참고
이름설명
줄임 명령
akan t로도 실행합니다.예시
test
앱, 라이브러리, 패키지를 준비한 뒤 그 폴더에서
bun test --isolate로 테스트를 실행합니다.형식
옵션
--writeBoolean기본값 true
대상이 앱이면 먼저 sync합니다. 라이브러리와 패키지는 항상 준비 과정을 거칩니다.
예시
build
배포용 빌드를
dist/apps/<app>에 만듭니다. 타입을 검사한 뒤 백엔드, SSR 라우트, CSR 번들을 차례로 만듭니다.형식
옵션
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.--fastBoolean기본값 false
타입 검사 단계를 건너뜁니다.
--quietBoolean기본값 false
진행 상황과 빌드 요약을 출력하지 않습니다.
참고
이름설명
줄임 명령
akan b로도 실행합니다.웹 화면
SSR과 CSR 단계는
akan.config.ts의 web 설정을 따르며, 꺼 둔 쪽은 건너뜁니다.예시
start-ios
iOS 시뮬레이터나 페어링한 iPhone에서 앱을 실행합니다. 기본은 로컬 개발 서버에서 화면을 불러오는 디버그 빌드이고,
--release를 주면 자기 번들을 담은 릴리스 빌드를 실행합니다.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 locallocal | debug | develop | main
앱이 연결할 백엔드 환경입니다.
--releaseBoolean기본값 false
개발 서버를 불러오는 대신 배포용 웹 빌드를 담은 릴리스 빌드를 실행합니다.
--deviceString
실행할 시뮬레이터, 에뮬레이터, 기기입니다.
iPhone 17이나 Pixel_10처럼 id나 이름을 줍니다. 페어링한 iPhone 이름을 주면 서명한 iPhone 빌드를 만듭니다. 생략하면 켜져 있는 iPhone 시뮬레이터(없으면 가장 최신 것)나 연결된 Android 기기(없으면 첫 에뮬레이터를 띄워서)를 씁니다.--teamString-T
Mac에 여러 팀의 프로필이 있을 때 서명을 좁힐 Apple 팀 id입니다.
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan si로도 실행합니다.개발 서버
--release 없이 실행하면 앱이 dev gateway를 거쳐 akan start <app>에서 화면을 불러오므로 저장할 때마다 반영됩니다. 개발 서버를 켜 두세요. 꺼져 있으면 명령이 그렇게 알리고 멈춥니다.타깃 하나
네이티브 타깃을 한 번에 하나만 실행합니다. 여럿이면
--target <name>을 줍니다.결과물
개발 빌드는
dist/native/<app>/<target>/dev/ios, --release 실행은 …/build/ios 아래에 만들어집니다.예시
start-android
Android 에뮬레이터나 연결된 기기에서 앱을 실행합니다.
start-ios와 같이 기본은 개발 서버를, --release면 번들을 담은 릴리스 빌드를 씁니다.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 locallocal | debug | develop | main
앱이 연결할 백엔드 환경입니다.
--releaseBoolean기본값 false
개발 서버를 불러오는 대신 배포용 웹 빌드를 담은 릴리스 빌드를 실행합니다.
--deviceString
실행할 시뮬레이터, 에뮬레이터, 기기입니다.
iPhone 17이나 Pixel_10처럼 id나 이름을 줍니다. 페어링한 iPhone 이름을 주면 서명한 iPhone 빌드를 만듭니다. 생략하면 켜져 있는 iPhone 시뮬레이터(없으면 가장 최신 것)나 연결된 Android 기기(없으면 첫 에뮬레이터를 띄워서)를 씁니다.--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan sa로도 실행합니다.개발 서버
--release 없이 실행하면 앱이 dev gateway를 거쳐 akan start <app>에서 화면을 불러오므로 저장할 때마다 반영됩니다. 개발 서버를 켜 두세요. 꺼져 있으면 명령이 그렇게 알리고 멈춥니다.타깃 하나
네이티브 타깃을 한 번에 하나만 실행합니다. 여럿이면
--target <name>을 줍니다.결과물
개발 빌드는
dist/native/<app>/<target>/dev/android, --release 실행은 …/build/android 아래에 만들어집니다.예시
start-desktop
네이티브 타깃을 이 컴퓨터에서 데스크톱 앱으로 실행합니다. 데스크톱 앱은 자기 OS에서만 빌드되므로 macOS, Windows, Linux 중 지금 컴퓨터의 것을 씁니다.
start-ios와 같이 동작하며, 고를 기기나 팀은 없습니다.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 locallocal | debug | develop | main
앱이 연결할 백엔드 환경입니다.
--releaseBoolean기본값 false
개발 서버를 불러오는 대신 배포용 웹 빌드를 담은 릴리스 빌드를 실행합니다.
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan sd로도 실행합니다.개발 서버
--release 없이 실행하면 앱이 dev gateway를 거쳐 akan start <app>에서 화면을 불러오므로 저장할 때마다 반영됩니다. 개발 서버를 켜 두세요. 꺼져 있으면 명령이 그렇게 알리고 멈춥니다.--release 없이 서버를 싣는 타깃
서버를 싣는 타깃이면, 앱의 개발 포트에서 이미 응답하는 개발 서버가 있을 때 그대로 씁니다. 없으면 같은 명령에서
akan start <app>을 띄우고, 서버가 응답하면 앱을 엽니다. Ctrl+C를 누르거나 앱을 닫으면 둘 다 멈춥니다. --env는 개발 서버에 영향을 주지 않고, 개발 서버는 워크스페이스 .env를 따릅니다.desktop.server
akan.config.ts에 native: { desktop: { server: true } }를 주거나 한 타깃에 desktop.server를 주면, 데스크톱 앱이 앱의 서버를 싣습니다. 서버는 창과 함께 loopback 포트로 뜨고, 페이지는 그 서버만 부릅니다. build-desktop, start-desktop --release, publish-update가 모두 이 값을 읽습니다. 설치된 앱은 서버를 더하거나 빼는 업데이트를 받지 않으므로, 이미 배포한 앱에서 켜거나 끄려면 다시 설치해야 합니다.내장 서버
앱에 든 Bun으로 API만 서빙하는 서버이며 127.0.0.1에 바인딩합니다. 이 컴퓨터의 어떤 프로그램이든 부를 수 있으므로 엔드포인트는 네트워크 서버처럼 가드합니다. 앱의
database.modes에 single이 있어야 하고, 데이터는 앱 데이터 폴더의 server/에 둡니다. private/(lib의 것도), --env의 env.server.<env>.ts, lib의 서버 env 기본값이 평문으로 실리므로 비밀과 라이선스 파일은 두지 마세요. public/이 없고 데이터 폴더에서 돌므로, 실행 중에 읽는 파일은 process.cwd()가 아니라 AKAN_APP_DIR 기준으로 읽습니다. 이미지의 docker 단계는 실행하지 않으며, 설치하면서 스스로 빌드하는 패키지는 trustedDependencies에 적습니다.bin
akan.config.ts의 bin에 적은 실행 파일은 이 컴퓨터용으로 받아 서버를 싣는지와 상관없이 모든 데스크톱 앱에 들어갑니다. 앱의 PATH 맨 앞에 있으므로 내장 서버의 spawn("ffmpeg")가 그 파일을 실행하고, 네이티브 플러그인은 ctx.binDir에서 찾습니다.타깃 하나
네이티브 타깃을 한 번에 하나만 실행합니다. 여럿이면
--target <name>을 줍니다.결과물
개발 빌드는
dist/native/<app>/<target>/dev/<macos|windows|linux>, --release 실행은 …/build/<macos|windows|linux> 아래에 만들어집니다.예시
build-ios
네이티브 런타임으로 iOS 앱을 빌드합니다. 먼저
--env 환경으로 배포용 웹 빌드를 만든 뒤 타깃마다 시뮬레이터용 앱을 빌드합니다.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 debuglocal | debug | develop | main
앱이 연결할 백엔드 환경입니다.
--debugBoolean기본값 false
릴리스 대신 디버그 빌드를 만듭니다.
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan bi로도 실행합니다.결과물
dist/native/<app>/<target>/build/ios 아래에 만들어지며, 명령이 파일마다 경로를 출력합니다.예시
build-android
네이티브 런타임으로 Android 앱의 APK를 빌드합니다.
build-ios처럼 먼저 --env 환경으로 배포용 웹 빌드를 만듭니다.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 debuglocal | debug | develop | main
앱이 연결할 백엔드 환경입니다.
--debugBoolean기본값 false
릴리스 대신 디버그 빌드를 만듭니다.
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan ba로도 실행합니다.서명
~/.akan/native/debug.keystore로 서명하므로 테스트용입니다. Play Store에 낼 파일은 release-android로 만듭니다.결과물
dist/native/<app>/<target>/build/android 아래에 만들어지며, 명령이 파일마다 경로를 출력합니다.예시
build-desktop
이 컴퓨터의 OS용 데스크톱 앱을 빌드합니다. macOS는
.app, Windows와 Linux는 앱 폴더입니다. build-ios처럼 먼저 --env 환경으로 배포용 웹 빌드를 만듭니다. release 빌드는 환경 변수로 서명합니다. macOS는 Developer ID 서명과 공증(AKAN_NATIVE_MACOS_*), Windows는 Authenticode(AKAN_NATIVE_WINDOWS_*)이고, 서명하지 못하면 경고합니다. 내려받은 사본이 막히거나 경고를 받기 때문입니다. 데스크톱 배포 치트시트를 보세요.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 debuglocal | debug | develop | main
앱이 연결할 백엔드 환경입니다.
--debugBoolean기본값 false
릴리스 대신 디버그 빌드를 만듭니다.
--installerBoolean기본값 false
내려받을 파일도 만듭니다. Windows는 NSIS로
<file>-<version>-<arch>-setup.exe(winget install NSIS.NSIS), macOS는 .dmg, Linux는 .AppImage(mksquashfs 필요)입니다.--archString기본값 이 컴퓨터의 CPU
Windows·Linux 앱이 도는 CPU입니다.
arm64 또는 x64이고, 서버의 애드온과 bin도 따릅니다. macOS 앱은 Apple silicon(arm64)만 만듭니다.--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.참고
이름설명
줄임 명령
akan bd로도 실행합니다.desktop.server
akan.config.ts에 native: { desktop: { server: true } }를 주거나 한 타깃에 desktop.server를 주면, 데스크톱 앱이 앱의 서버를 싣습니다. 서버는 창과 함께 loopback 포트로 뜨고, 페이지는 그 서버만 부릅니다. build-desktop, start-desktop --release, publish-update가 모두 이 값을 읽습니다. 설치된 앱은 서버를 더하거나 빼는 업데이트를 받지 않으므로, 이미 배포한 앱에서 켜거나 끄려면 다시 설치해야 합니다.내장 서버
앱에 든 Bun으로 API만 서빙하는 서버이며 127.0.0.1에 바인딩합니다. 이 컴퓨터의 어떤 프로그램이든 부를 수 있으므로 엔드포인트는 네트워크 서버처럼 가드합니다. 앱의
database.modes에 single이 있어야 하고, 데이터는 앱 데이터 폴더의 server/에 둡니다. private/(lib의 것도), --env의 env.server.<env>.ts, lib의 서버 env 기본값이 평문으로 실리므로 비밀과 라이선스 파일은 두지 마세요. public/이 없고 데이터 폴더에서 돌므로, 실행 중에 읽는 파일은 process.cwd()가 아니라 AKAN_APP_DIR 기준으로 읽습니다. 이미지의 docker 단계는 실행하지 않으며, 설치하면서 스스로 빌드하는 패키지는 trustedDependencies에 적습니다.bin
akan.config.ts의 bin에 적은 실행 파일은 이 컴퓨터용으로 받아 서버를 싣는지와 상관없이 모든 데스크톱 앱에 들어갑니다. 앱의 PATH 맨 앞에 있으므로 내장 서버의 spawn("ffmpeg")가 그 파일을 실행하고, 네이티브 플러그인은 ctx.binDir에서 찾습니다.설치 프로그램
현재 사용자로
%LOCALAPPDATA%\Programs 아래에 설치하므로 업데이트가 관리자 권한 없이 앱을 바꾸고, WebView2 Runtime이 없는 PC에는 함께 설치합니다. /S는 무인 설치, /RUN은 설치 뒤 실행입니다.다시 설치
/D=<folder>로 설치 폴더를 고릅니다. 이것 없이 다시 실행하면 앱이 이미 있는 폴더에 설치하고, 다른 설치 프로그램이 도는 동안 띄운 것은 시작하지 않습니다.결과물
dist/native/<app>/<target>/build/<macos|windows|linux> 아래에 만들어지며, 명령이 파일마다 경로를 출력합니다.예시
release-ios
App Store 출시용으로 iOS 앱을 빌드하고 서명합니다. iPhone 앱과 그
.ipa를 만듭니다. 기본 백엔드는 main이고, --allow-local-release 없이 --env local을 주면 거부합니다.형식
옵션
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 maindebug | develop | main | local
앱이 연결할 백엔드 환경입니다.
--teamString-T
Mac에 여러 팀의 프로필이 있을 때 서명을 좁힐 Apple 팀 id입니다.
--ad-hocBoolean기본값 false
App Store 프로필 대신 ad-hoc 프로필로 서명합니다.
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.--allow-local-releaseBoolean기본값 false-l
--env local로 만든 릴리스를 허용합니다.참고
이름설명
서명
이 Mac에 Xcode가 둔 인증서와 프로필 중에서 찾습니다. 프로필은 app id와 앱이 요청하는 모든 capability를 덮어야 합니다. 명령이 쓴 서명을 출력합니다.
결과물
dist/native/<app>/<target>/build/ios 아래에 만들어지며, 명령이 파일마다 경로를 출력합니다.예시
release-android
Play Store 출시용으로 Android 앱을 AAB나 APK로 빌드하고 서명합니다.
release-ios처럼 기본은 main이고, --allow-local-release 없이 --env local은 거부합니다.형식
옵션
--assemble-typeString기본값 aabaab | apk
aab는 Play Store 업로드용, apk는 직접 설치용입니다.--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 maindebug | develop | main | local
앱이 연결할 백엔드 환경입니다.
--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.--allow-local-releaseBoolean기본값 false-l
--env local로 만든 릴리스를 허용합니다.참고
이름설명
서명
환경 변수가 가리키는 업로드 키로 서명합니다.
MYAPP_RELEASE_STORE_FILE, MYAPP_RELEASE_STORE_PASSWORD, MYAPP_RELEASE_KEY_ALIAS, 키에 비밀번호가 따로 있으면 MYAPP_RELEASE_KEY_PASSWORD도 둡니다. 하나라도 없으면 빌드 전에 멈춥니다.결과물
dist/native/<app>/<target>/build/android 아래에 만들어지며, 명령이 파일마다 경로를 출력합니다.예시
update-keygen
업데이트 릴리스에 서명할 Ed25519 키를 app id마다 한 번 만들고,
native.updates.publicKey에 넣을 공개 키를 출력합니다. 다시 실행하면 만든 키를 읽습니다. 키는 ~/.akan/native/keys/<app id>.update.key나 AKAN_NATIVE_UPDATE_KEY가 가리키는 곳에 있습니다. 설치된 앱은 검증할 수 없는 릴리스를 받지 않으므로, 릴리스 머신이 읽는 비밀 저장소에 보관합니다. appId가 플랫폼마다 다르면 id마다 키가 있으므로, 게시할 --platform을 적습니다.형식
옵션
--platformString기본값 desktopdesktop | android | ios
키가 서명할 app id의 플랫폼입니다.
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.예시
publish-update
릴리스를 빌드해 설치된 앱용으로 서명합니다. 데스크톱은 앱 전체(이 컴퓨터의 OS와 CPU, 이전 릴리스와의 delta 포함), Android와 iOS는 웹 번들입니다.
dist/native/<app>/<target>/updates 아래에 <channel>.json, 서명, 파일을 쓰며, 그 폴더에는 올릴 것만 있습니다. 그 폴더를 native.updates.url에 올리되 <channel>.json과 .sig는 마지막에 함께 올리고, CDN이 두 파일을 따로 캐시하지 않게 합니다. 서버를 싣는 타깃의 데스크톱 릴리스에는 서버도 들어갑니다.형식
옵션
--platformString기본값 desktopdesktop | android | ios
desktop은 이 컴퓨터의 OS와 CPU입니다.--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 maindebug | develop | main | local
앱이 연결할 백엔드 환경입니다.
--channelString
기본값은
updates.channel, 없으면 --env입니다. 쓸 매니페스트만 정하고, 릴리스가 따르는 채널은 바꾸지 않습니다.--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.--allow-local-releaseBoolean기본값 false-l
--env local로 만든 릴리스를 허용합니다.참고
이름설명
desktop.server
akan.config.ts에 native: { desktop: { server: true } }를 주거나 한 타깃에 desktop.server를 주면, 데스크톱 앱이 앱의 서버를 싣습니다. 서버는 창과 함께 loopback 포트로 뜨고, 페이지는 그 서버만 부릅니다. build-desktop, start-desktop --release, publish-update가 모두 이 값을 읽습니다. 설치된 앱은 서버를 더하거나 빼는 업데이트를 받지 않으므로, 이미 배포한 앱에서 켜거나 끄려면 다시 설치해야 합니다.--env
앱은
updates.channel, 없으면 빌드할 때의 --env 채널로 릴리스를 받습니다. 그 --env로 게시합니다.pilot
릴리스는 빌드할 때의 채널을 가집니다. pilot 그룹에는
updates.channel이 pilot인 타깃을 씁니다.서버 유무 변경
채널의 직전 릴리스와 서버 유무가 다르면, 설치된 앱이 거부할 것이므로 빌드 전에 거부합니다. 다른 채널(
updates.channel)로 게시하거나 출력 폴더에서 그 <channel>.json을 지워 새로 시작합니다.공개
updates.url에 닿는 누구나 릴리스를 읽을 수 있고, 업데이터는 인증 정보를 보내지 않습니다. 데스크톱 릴리스는 앱 전체이므로 내장 서버의 private/와 env 파일도 들어 있습니다.예시
pack-update
Android·iOS 웹 번들 업데이트를 서명 없이 묶습니다. 키를 이 컴퓨터 밖에 두는 서명자를 위한 것입니다.
files/<sha256>, bundle.json, manifest.template.json을 쓰고, 매니페스트의 channel·sequence·bundle은 서명자가 채웁니다. 서명자는 올리는 바이트 그대로에 서명하고 files/를 먼저 올립니다. 이 컴퓨터의 키로 하는 것이 publish-update입니다.형식
옵션
--platformStringios | android
업데이트할 앱입니다.
--targetString
akan.config.ts의 native.targets 키 또는 all입니다. 타깃이 여럿이면 물어봅니다.--envString기본값 maindebug | develop | main | local
앱이 연결할 백엔드 환경입니다.
--outString
기본값은
dist/native/<app>/<target>/updates/<platform>입니다.--againstString
이 번들이 돌아야 할 스토어 빌드의
bundle.json입니다. compat.json을 쓰고, 새 바이너리가 필요하면 실패합니다.--writeBoolean기본값 true
먼저
akan sync를 실행해 생성 파일을 최신으로 맞춥니다.--allow-local-releaseBoolean기본값 false-l
--env local로 만든 릴리스를 허용합니다.예시
모든 명령에 공통인 규칙
- 앱 지정.
<app>은apps/아래 폴더 이름입니다. 생략하면 CLI가 고르라고 묻고, 앱이 하나뿐이면 그 앱을 씁니다. - 불리언 옵션.
--fast처럼 이름만 쓰면 true입니다. 끄려면 값을 붙입니다:--write false. - 짧은 플래그. 옵션은 첫 글자로도 씁니다(
--write는-w). 다른 글자를 쓰는 옵션은 표에 따로 적혀 있고,--verbose(-v)는 모든 명령에서 씁니다. --write는 sync를 먼저 실행합니다. 기본으로 켜져 있어 명령 전에 생성 파일이 최신이 됩니다. 건너뛰려면--write false를 줍니다.- 데이터베이스 모드.
start,build,script,console,db-export,db-import는 셸의AKAN_DATABASE_MODE를 쓰고, 없으면 앱이 처음으로 선언한 모드를 씁니다. 셸에서 고른 모드는 앱이 선언한 것이어야 합니다.
줄임 명령
| 줄임 명령 | 실행되는 명령 |
|---|---|
| akan b | akan build |
| akan t | akan typecheck |
| akan s | akan start |
| akan bi | akan build-ios |
| akan ba | akan build-android |
| akan bd | akan build-desktop |
| akan si | akan start-ios |
| akan sa | akan start-android |
| akan sd | akan start-desktop |