콘텐츠로 건너뛰기
Codex

Tauri 빌드가 아이콘을 못 찾아 실패할 때

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.tomltauri.conf.jsonmain.rs만 적으면 빌드가 안 된다. 본질과 상관없는 파일 네 개가 더 필요하다.

받는 사람 입장에서도 마찬가지다. 예제를 클론해서 cargo run을 했는데 아이콘 오류가 나면 자기 환경 문제라고 생각한다.

정리

  • bundle.active: false는 아이콘 확인을 끄지 않는다. 다른 단계다
  • generate_context!컴파일 시점에 설정을 읽으며 아이콘 경로를 본다
  • "icon": []로 비우면 기본 경로 icons/icon.png를 찾는다
  • 실제 파일을 넣어야 한다. 내용은 아무거나 된다
  • 예제 저장소라면 아이콘 생성 스크립트를 같이 두는 편이 낫다

오류 메시지가 proc macro panicked로 시작하면 런타임이 아니라 빌드 시점에 설정을 읽다 난 문제다. 그 관점으로 보면 찾는 범위가 확 좁아진다.

이 블로그 더 보기

이 블로그는 실제 프로젝트를 AI와 함께 굴리면서 남긴 기록입니다.

  • 새 글은 RSS로 받아볼 수 있습니다.
  • 시리즈 전체는 여기에 정리해 두었습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다