compose-multiplatform-core-extended
Compose Multiplatform with desktop windows that need no AWT, on GraalVM native image and on Kotlin/Native, and a Gradle plugin that ships the same app as a JVM app, one native-image executable or one Kotlin/Native executable.GraalVM native image와 Kotlin/Native에서 AWT 없이 동작하는 데스크톱 창을 갖춘 Compose Multiplatform, 그리고 같은 앱을 JVM 앱, native-image 실행 파일 하나, Kotlin/Native 실행 파일 하나 중 어느 쪽으로든 내보내는 Gradle 플러그인.
compose-multiplatform-core-extended · compose-multiplatform-extended
Overview개요
Two forks that work as a pair. compose-multiplatform-core-extended forks JetBrains' Compose Multiplatform libraries; compose-multiplatform-extended forks the Compose Gradle plugin. Both keep the upstream repository root and upstream public API as they are. The fork's own work sits in platform source sets inside the Compose modules and under extended/, on the extended branch, which is based on JetBrains' release/1.11 (Compose 1.11).
짝을 이루는 두 포크입니다. compose-multiplatform-core-extended는 JetBrains의 Compose Multiplatform 라이브러리를, compose-multiplatform-extended는 Compose Gradle 플러그인을 포크합니다. 둘 다 업스트림 저장소 루트와 업스트림 공개 API를 그대로 둡니다. 포크가 더한 것은 Compose 모듈 안의 플랫폼 소스 세트와 extended/ 아래에 있고, 작업 브랜치 extended는 JetBrains의 release/1.11(Compose 1.11) 위에 쌓여 있습니다.
The problem it solves푸는 문제
Upstream Compose for desktop runs on the JVM, draws its windows through AWT and ships the app with a Java runtime beside it. That makes the download larger, leaves a runtime to keep updated, and rules out a closed-world GraalVM native image, because AWT does not fit one. JetBrains also ships no Kotlin/Native desktop targets for Linux or Windows. A Python app on python-multiplatform should be able to ship as one small native executable on every desktop, like it does on mobile.
업스트림 Compose 데스크톱은 JVM에서 돌고, 창을 AWT로 그리며, 앱 옆에 Java 런타임을 담아 내보냅니다. 내려받는 크기가 커지고, 런타임을 계속 갱신해야 하며, AWT가 맞지 않아 닫힌 세계인 GraalVM native image로 만들 수 없습니다. JetBrains는 Linux와 Windows용 Kotlin/Native 데스크톱 타깃도 배포하지 않습니다. python-multiplatform 위의 Python 앱은 모바일에서처럼 모든 데스크톱에서도 작은 네이티브 실행 파일 하나로 나갈 수 있어야 합니다.
The library fork라이브러리 포크
- AWT-free desktop windows on two paths. On macOS both paths work: a Kotlin/Native window on AppKit and Metal, and a GraalVM native-image window. On Linux (X11) the native-image window works and the Kotlin/Native window module has landed. Windows is in progress.
- One shared window module,
org.thisisthepy.compose.window: the window state machine, minimum size, event normalisation, frame-request coalescing, IME composition state, dark mode and DPI, in common code that depends only on the Kotlin standard library. Both paths use it. - Kotlin/Native targets JetBrains does not ship:
linuxX64,linuxArm64andmingwX64source sets for the Compose UI modules, with a skiko built formingwX64. - skiko without JAWT, packed as a static archive a native image links in, for macOS arm64, Linux x64 and Windows x64. On Windows, Skia's ICU data is compiled into the archive, so the executable needs no data file beside it.
- Clipboard and pointer icons without AWT, and a native text context menu on macOS.
- Design systems: Material 3, Cupertino, Fluent, GNOME, Breeze, Deepin and the Liquid Glass material, imported as an independent project in
extended/design-systems. Publishing them asorg.thisisthepy.compose.*libraries is planned. - An upstream public-API guard: a workflow compares the Compose modules' public API with upstream, so existing Compose code keeps compiling. The fork's own API lives in separate modules under
extended/.
- 두 경로의 AWT 없는 데스크톱 창. macOS는 두 경로 모두 동작합니다. AppKit과 Metal 위의 Kotlin/Native 창, 그리고 GraalVM native-image 창입니다. Linux(X11)는 native-image 창이 동작하고 Kotlin/Native 창 모듈이 들어왔습니다. Windows는 진행 중입니다.
- 공유 창 모듈
org.thisisthepy.compose.window: 창 상태 기계, 최소 크기, 이벤트 정규화, 프레임 요청 병합, IME 조합 상태, 다크 모드와 DPI가 Kotlin 표준 라이브러리에만 의존하는 공통 코드에 있고, 두 경로가 함께 씁니다. - JetBrains가 배포하지 않는 Kotlin/Native 타깃: Compose UI 모듈의
linuxX64,linuxArm64,mingwX64소스 세트, 그리고mingwX64용으로 빌드한 skiko. - JAWT 없는 skiko: native image가 링크하는 정적 아카이브로 묶었습니다(macOS arm64, Linux x64, Windows x64). Windows에서는 Skia의 ICU 데이터를 아카이브에 컴파일해 넣어서 실행 파일 옆에 데이터 파일이 필요 없습니다.
- AWT 없는 클립보드와 포인터 아이콘, 그리고 macOS의 네이티브 텍스트 컨텍스트 메뉴.
- 디자인 시스템: Material 3, Cupertino, Fluent, GNOME, Breeze, Deepin과 Liquid Glass 재질을
extended/design-systems에 독립 프로젝트로 가져왔습니다.org.thisisthepy.compose.*라이브러리로 배포하는 일은 계획입니다. - 업스트림 공개 API 가드: 워크플로가 Compose 모듈의 공개 API를 업스트림과 비교하므로 기존 Compose 코드가 계속 컴파일됩니다. 포크 자체의 API는
extended/아래 별도 모듈에 있습니다.
The plugin fork플러그인 포크
compose-multiplatform-extended extends the Compose Gradle plugin so that one compose.desktop configuration ships the app three ways. Name, version, vendor, icon and resources are written once, in nativeDistributions.
| Output | Result | Task |
|---|---|---|
ApplicationOutput.Jvm | An app with a Java runtime beside it, as upstream | packageDistributionForCurrentOS |
ApplicationOutput.NativeImage | One GraalVM native-image executable, no runtime beside it (macOS arm64, Linux x64, Windows x64) | packageNativeImage |
ApplicationOutput.KotlinNative | One Kotlin/Native executable per target, packaged with the upstream TargetFormat names | packageKotlinNative |
windowing = ApplicationWindowing.AwtFree takes the window from the extended window module instead of AWT. Kotlin/Native apps package as .app, .dmg and .pkg on macOS, .AppImage, .deb and .rpm on Linux, and .exe and .msi on Windows, with Velopack building the direct-download formats and their update feeds. A second plugin, org.thisisthepy.kotlin.native.desktop, packages command-line programs that have no Compose and no window. The upstream compose DSL is unchanged; the new settings only add.
compose-multiplatform-extended는 Compose Gradle 플러그인을 확장해서, compose.desktop 설정 하나로 앱을 세 가지 방식으로 내보냅니다. 이름, 버전, 제작사, 아이콘, 리소스는 nativeDistributions에 한 번만 적습니다.
| 출력 | 결과 | 태스크 |
|---|---|---|
ApplicationOutput.Jvm | Java 런타임을 옆에 둔 앱, 업스트림 그대로 | packageDistributionForCurrentOS |
ApplicationOutput.NativeImage | 런타임 없는 GraalVM native-image 실행 파일 하나 (macOS arm64, Linux x64, Windows x64) | packageNativeImage |
ApplicationOutput.KotlinNative | 타깃마다 Kotlin/Native 실행 파일 하나, 업스트림 TargetFormat 이름으로 패키징 | packageKotlinNative |
windowing = ApplicationWindowing.AwtFree를 쓰면 창이 AWT 대신 extended 창 모듈에서 옵니다. Kotlin/Native 앱은 macOS에서 .app, .dmg, .pkg, Linux에서 .AppImage, .deb, .rpm, Windows에서 .exe, .msi로 패키징하고, 직접 배포 형식과 업데이트 피드는 Velopack이 만듭니다. 두 번째 플러그인 org.thisisthepy.kotlin.native.desktop은 Compose도 창도 없는 명령줄 프로그램을 패키징합니다. 업스트림 compose DSL은 그대로이고, 새 설정은 추가만 합니다.
Where it fits생태계 안의 위치
python-multiplatform's GraalVM native-image path and its Kotlin/Native desktop path both need a Compose window without AWT; this is where that window comes from. The plugin fork gives those apps their packaging. pythonx-compose's Material 3 and design systems, and pythonx-platform's device features, are planned to come from here as Kotlin libraries that Python reaches through python-multiplatform's binder under their own names.
python-multiplatform의 GraalVM native-image 경로와 Kotlin/Native 데스크톱 경로는 둘 다 AWT 없는 Compose 창이 필요하고, 그 창이 여기서 나옵니다. 플러그인 포크는 그런 앱의 패키징을 맡습니다. pythonx-compose의 Material 3와 디자인 시스템, pythonx-platform의 기기 기능도 여기서 Kotlin 라이브러리로 나오고, Python은 python-multiplatform의 바인더로 그 이름 그대로 닿을 계획입니다.
Where it stands현재 상태
- Working: AWT-free windows on macOS (both paths) and on Linux X11 (native image); the Linux and MinGW source sets; static skiko for native image; the upstream API guard;
packageNativeImage. - In progress: the shared Win32 window for Windows; running the
mingwX64renderer on Windows itself (so far it ran under Wine); a parity test that runs the same checks on both window paths. - Planned:
org.thisisthepy.composeMaven coordinates (today the fork publishes under JetBrains' own groups to the local Maven repository only); the design systems as libraries; a multiplatform OS notification API.
- 동작: macOS(두 경로)와 Linux X11(native image)의 AWT 없는 창, Linux·MinGW 소스 세트, native image용 정적 skiko, 업스트림 API 가드,
packageNativeImage. - 진행 중: Windows용 공유 Win32 창,
mingwX64렌더러를 Windows에서 직접 실행하는 확인(지금까지는 Wine에서만), 두 창 경로에 같은 검사를 돌리는 패리티 테스트. - 계획:
org.thisisthepy.composeMaven 좌표(지금은 JetBrains 그룹 그대로 로컬 Maven 저장소에만 배포), 디자인 시스템 라이브러리화, 멀티플랫폼 OS 알림 API.