91 lines
2.7 KiB
Markdown
91 lines
2.7 KiB
Markdown
---
|
||
title: reflect-skip Skip Fuse — Pitfalls
|
||
created: '2026-05-20'
|
||
updated: '2026-05-22'
|
||
last_synced: '2026-05-22'
|
||
type: reference
|
||
namespace: personal
|
||
tags:
|
||
- reflect
|
||
- skip
|
||
- swiftui
|
||
- kotlin
|
||
- pitfall
|
||
confidence: 0.9
|
||
---
|
||
# reflect-skip Skip Fuse — Adding a New SwiftUI View
|
||
|
||
## Problem
|
||
|
||
При добавлении нового SwiftUI View-файла в `Sources/ReflectApp/Views/` Skip Fuse **не создаёт Kotlin-стаб автоматически**. Приложение крашится с `ClassNotFoundException` при запуске.
|
||
|
||
## Fix — создать Kotlin-стаб вручную
|
||
|
||
Нужно создать стаб в **обоих** местах:
|
||
|
||
1. `DerivedData/.../reflect-skip.output/ReflectApp/skipstone/ReflectApp/src/main/kotlin/reflect/app/`
|
||
2. `.build/plugins/outputs/reflect-skip/ReflectApp/destination/skipstone/ReflectApp/src/main/kotlin/reflect/app/`
|
||
|
||
**Шаблон:** скопировать `OnboardingView.kt`, заменить:
|
||
- Имя класса
|
||
- `@State` vars
|
||
|
||
Constructor принимает closure-параметры.
|
||
|
||
После создания стабов:
|
||
|
||
```bash
|
||
skip gradle assembleDebug
|
||
```
|
||
|
||
## Package.swift — обязательная структура
|
||
|
||
Без этих секций Xcode падает с "Missing package product 'ReflectApp'":
|
||
|
||
```swift
|
||
// Package.swift — обязательные поля
|
||
products: [
|
||
.library(name: "ReflectApp", targets: ["ReflectApp"])
|
||
],
|
||
targets: [
|
||
.target(
|
||
name: "ReflectApp",
|
||
path: "Sources/ReflectApp",
|
||
dependencies: [
|
||
.product(name: "SkipFuse", package: "skip-fuse"),
|
||
.product(name: "SkipUI", package: "skip-ui"),
|
||
// НЕ добавлять skip-fuse-ui как отдельную зависимость
|
||
],
|
||
plugins: [.plugin(name: "skipstone", package: "skip")]
|
||
)
|
||
]
|
||
```
|
||
|
||
**Pitfall:** `skip-fuse-ui` как отдельный product не существует — нужны `skip-fuse` + `skip-ui` раздельно.
|
||
|
||
## Прочие питфоллы
|
||
|
||
- `@State private` → менять на `internal` в Kotlin-стабе
|
||
- `case none` в enum крашит JNI — избегать
|
||
- `ViewModifier` → инлайнить в тело View
|
||
- `PRODUCT_NAME=ReflectApp` в Build Settings не менять
|
||
- `@AppStorage` поля добавлять вручную в Kotlin-стаб
|
||
|
||
## Deploy & Signing
|
||
|
||
```bash
|
||
# Build and publish (~15s Gradle):
|
||
./build-and-publish.sh
|
||
```
|
||
|
||
Android signing keystore: `~/.android/signing/nolvu-release.jks` (alias: nolvu2026)
|
||
|
||
## Проект
|
||
|
||
`~/Developer/reflect-skip`
|
||
|
||
## Связанные страницы
|
||
|
||
- [[tech/hermes-eagle-mac]] — Hermes на Eagle, openclaw-claude-proxy
|
||
- [[tech/hermes-docker-kraken]] — Hermes на Кракене (Docker)
|