TECH NOTE · AUTOMATION OPS
bundle.active를 false로 둬도 Tauri 빌드가 아이콘을 요구합니다. generate_context!가 컴파일 시점에 설정을 읽기 때문이고, icon을 빈 배열로 둬도 통하지 않습니다.
번들을 껐는데 아이콘을 찾는다
Tauri로 최소 예제를 하나 만들었다. 창 하나 띄우는 게 전부라 배포할 일이 없어서 번들을 껐다.
{
"bundle": {
"active": false
}
}
그런데 빌드가 실패했다.
error: proc macro panicked
= help: message: failed to open icon
/Users/.../overlay-window/icons/icon.png: No such file or directory
번들을 안 만드는데 아이콘을 왜 찾는가. 그리고 왜 컴파일 오류인가.
`generate_context!`가 빌드 시점에 읽는다
bundle.active는 번들을 만들 것인가를 정하는 값이다. .app이나 .msi를 굽는 단계에만 영향을 준다.
아이콘을 요구하는 건 다른 곳이다.
fn main() {
tauri::Builder::default()
.run(tauri::generate_context!())
.expect("failed to start");
}
generate_context!는 매크로다. 컴파일 시점에 tauri.conf.json을 읽어 설정을 코드에 박아 넣는다. 그 과정에서 아이콘 경로를 확인하고, 파일이 없으면 매크로가 패닉한다.
오류 첫 줄이 proc macro panicked인 이유가 이것이다. 런타임 오류도, 번들 단계 오류도 아니다.
번들 설정을 껐다고 매크로가 아이콘을 안 읽지는 않는다. 둘은 다른 단계다.
`"icon": []`로 비워도 안 된다
가장 먼저 시도한 것이 이거였다. 목록을 비우면 확인할 게 없어지지 않을까.
{
"bundle": {
"active": false,
"icon": []
}
}
똑같이 실패한다. 오류 메시지도 같다. 목록이 비어 있으면 매크로가 기본 경로(icons/icon.png)를 본다.
빈 목록은 “아이콘 없음”이 아니라 “지정 안 함”으로 읽힌다.
실제 파일을 넣는 수밖에 없다
결국 아이콘을 만들었다. 최소 예제라 그림이 필요 없는데도 그렇다.
icons/32x32.png
icons/128x128.png
icons/256x256.png
icons/icon.png
icon.png가 기본 경로라 이것만 있으면 빌드는 통과한다. 나머지는 나중에 번들을 켤 때를 대비해 같이 만들어 뒀다.
내용은 아무거나 상관없다. 단색 원 하나로 충분하다.
from PIL import Image, ImageDraw
for size in (32, 128, 256, 512):
img = Image.new("RGBA", (size, size), (0, 0, 0, 0))
draw = ImageDraw.Draw(img)
pad = size // 8
draw.ellipse([pad, pad, size - pad, size - pad], fill=(76, 139, 245, 255))
name = "icon.png" if size == 512 else f"{size}x{size}.png"
img.save(f"icons/{name}")
이 네 줄짜리 스크립트를 저장소에 같이 두면 다른 사람이 받아서 빌드할 때도 막히지 않는다.
왜 헷갈리나
오류 메시지가 원인을 반대로 가리킨다.
failed to open icon을 보면 아이콘 설정을 의심하게 된다. 그래서 bundle.icon을 만지는데, 정작 그 값은 이 시점에 거의 관여하지 않는다.
설정 파일의 어느 절에 있느냐와 언제 읽히느냐가 다르다. bundle 아래 적혀 있으니 번들 단계 값이라고 생각하지만, 매크로는 파일 전체를 읽고 자기가 필요한 것을 가져간다.
Tauri 2 기준이고, 버전에 따라 이 동작이 달라질 수 있다.
최소 예제를 만들 때 자주 만난다
실무 앱에서는 잘 안 겪는다. 프로젝트를 create-tauri-app으로 시작하면 아이콘이 처음부터 들어 있기 때문이다.
문제는 예제를 손으로 만들 때다. 창 하나 띄우는 코드를 보여주려고 Cargo.toml과 tauri.conf.json과 main.rs만 적으면 빌드가 안 된다. 본질과 상관없는 파일 네 개가 더 필요하다.
받는 사람 입장에서도 마찬가지다. 예제를 클론해서 cargo run을 했는데 아이콘 오류가 나면 자기 환경 문제라고 생각한다.
정리
bundle.active: false는 아이콘 확인을 끄지 않는다. 다른 단계다generate_context!가 컴파일 시점에 설정을 읽으며 아이콘 경로를 본다"icon": []로 비우면 기본 경로icons/icon.png를 찾는다- 실제 파일을 넣어야 한다. 내용은 아무거나 된다
- 예제 저장소라면 아이콘 생성 스크립트를 같이 두는 편이 낫다
오류 메시지가 proc macro panicked로 시작하면 런타임이 아니라 빌드 시점에 설정을 읽다 난 문제다. 그 관점으로 보면 찾는 범위가 확 좁아진다.