@kood/claude-code 0.6.6 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -1
- package/package.json +1 -1
- package/templates/.claude/agents/analyst.md +5 -0
- package/templates/.claude/agents/architect.md +5 -0
- package/templates/.claude/agents/build-fixer.md +1 -0
- package/templates/.claude/agents/code-reviewer.md +1 -0
- package/templates/.claude/agents/critic.md +4 -0
- package/templates/.claude/agents/deep-executor.md +1 -0
- package/templates/.claude/agents/dependency-manager.md +2 -0
- package/templates/.claude/agents/deployment-validator.md +2 -0
- package/templates/.claude/agents/designer.md +2 -0
- package/templates/.claude/agents/document-writer.md +3 -0
- package/templates/.claude/agents/explore.md +1 -0
- package/templates/.claude/agents/git-operator.md +2 -0
- package/templates/.claude/agents/implementation-executor.md +2 -0
- package/templates/.claude/agents/ko-to-en-translator.md +3 -0
- package/templates/.claude/agents/lint-fixer.md +2 -0
- package/templates/.claude/agents/planner.md +3 -0
- package/templates/.claude/agents/pm.md +349 -0
- package/templates/.claude/agents/qa-tester.md +1 -0
- package/templates/.claude/agents/refactor-advisor.md +4 -0
- package/templates/.claude/agents/researcher.md +9 -1
- package/templates/.claude/agents/scientist.md +1 -0
- package/templates/.claude/agents/security-reviewer.md +1 -0
- package/templates/.claude/agents/tdd-guide.md +1 -0
- package/templates/.claude/agents/vision.md +1 -0
- package/templates/.claude/instructions/agent-patterns/agent-teams-usage.md +376 -0
- package/templates/.claude/instructions/sourcing/reliable-search.md +49 -2
- package/templates/.claude/scripts/agent-teams/check-availability.sh +238 -0
- package/templates/.claude/scripts/agent-teams/setup-tmux.sh +125 -0
- package/templates/.claude/skills/agent-teams-setup/SKILL.md +460 -0
- package/templates/.claude/skills/brainstorm/SKILL.md +1 -0
- package/templates/.claude/skills/bug-fix/SKILL.md +1 -0
- package/templates/.claude/skills/crawler/SKILL.md +2 -0
- package/templates/.claude/skills/docs-creator/SKILL.md +1 -0
- package/templates/.claude/skills/docs-fetch/SKILL.md +6 -4
- package/templates/.claude/skills/docs-refactor/SKILL.md +1 -0
- package/templates/.claude/skills/elon-musk/SKILL.md +1 -0
- package/templates/.claude/skills/execute/SKILL.md +1 -0
- package/templates/.claude/skills/feedback/SKILL.md +1 -0
- package/templates/.claude/skills/figma-to-code/SKILL.md +1 -0
- package/templates/.claude/skills/genius-thinking/SKILL.md +1 -0
- package/templates/.claude/skills/global-uiux-design/SKILL.md +1 -0
- package/templates/.claude/skills/korea-uiux-design/SKILL.md +1 -0
- package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/plan/SKILL.md +1 -0
- package/templates/.claude/skills/prd/SKILL.md +1 -0
- package/templates/.claude/skills/project-optimizer/AGENTS.md +275 -0
- package/templates/.claude/skills/project-optimizer/SKILL.md +375 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-config-centralize.md +66 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-hot-path.md +35 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-interface-segregation.md +51 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-module-boundary.md +42 -0
- package/templates/.claude/skills/project-optimizer/rules/build-cache.md +57 -0
- package/templates/.claude/skills/project-optimizer/rules/build-code-split.md +56 -0
- package/templates/.claude/skills/project-optimizer/rules/build-incremental.md +65 -0
- package/templates/.claude/skills/project-optimizer/rules/build-minify.md +61 -0
- package/templates/.claude/skills/project-optimizer/rules/build-tree-shake.md +60 -0
- package/templates/.claude/skills/project-optimizer/rules/code-complexity.md +65 -0
- package/templates/.claude/skills/project-optimizer/rules/code-dead-elimination.md +32 -0
- package/templates/.claude/skills/project-optimizer/rules/code-duplication.md +54 -0
- package/templates/.claude/skills/project-optimizer/rules/code-error-handling.md +75 -0
- package/templates/.claude/skills/project-optimizer/rules/code-naming.md +52 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-defer-await.md +54 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-parallel.md +90 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-pipeline.md +68 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-pool.md +68 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-lightweight-alt.md +37 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-peer-align.md +44 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-security-audit.md +45 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-unused-removal.md +25 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-version-pin.md +40 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-ci-speed.md +47 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-dev-server.md +35 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-lint-config.md +36 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-test-coverage.md +34 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-type-safety.md +49 -0
- package/templates/.claude/skills/project-optimizer/rules/io-batch-queries.md +67 -0
- package/templates/.claude/skills/project-optimizer/rules/io-cache-layer.md +67 -0
- package/templates/.claude/skills/project-optimizer/rules/io-connection-reuse.md +67 -0
- package/templates/.claude/skills/project-optimizer/rules/io-serialize-minimal.md +61 -0
- package/templates/.claude/skills/project-optimizer/rules/io-stream.md +75 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-bounded-cache.md +65 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-large-data.md +64 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-lazy-init.md +78 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-leak-prevention.md +79 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-pool-reuse.md +70 -0
- package/templates/.claude/skills/ralph/SKILL.md +1 -0
- package/templates/.claude/skills/refactor/SKILL.md +1 -0
- package/templates/.claude/skills/research/SKILL.md +1 -0
- package/templates/.claude/skills/sql-optimizer/SKILL.md +438 -0
- package/templates/.claude/skills/sql-optimizer/orm-patterns.md +218 -0
- package/templates/.claude/skills/startup-validator/SKILL.md +1 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +53 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +94 -27
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +42 -19
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-optimistic-updates.md +109 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-suspense-query.md +74 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-use-hook.md +81 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-react-compiler.md +81 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-beforeload-auth.md +121 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-file-conventions.md +104 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-link-navigation.md +119 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-nested-layouts.md +155 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-path-params.md +89 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-pending-component.md +110 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-preload-strategy.md +91 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-router-context.md +120 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-search-params.md +114 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +1 -1
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-error-boundaries.md +79 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-middleware.md +85 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +56 -21
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-streaming.md +84 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-validator.md +71 -0
- package/templates/.claude/skills/tauri-react-best-practices/AGENTS.md +527 -0
- package/templates/.claude/skills/tauri-react-best-practices/SKILL.md +571 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-barrel-imports.md +140 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-cargo-profile.md +96 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-frontend-treeshake.md +242 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-lazy-components.md +255 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-remove-unused-commands.md +160 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-ci-pipeline.md +269 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-signing.md +207 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-updater.md +226 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-async-commands.md +172 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-batch-commands.md +133 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-binary-response.md +198 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-channel-streaming.md +186 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-error-handling.md +250 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-type-safe.md +227 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-derived-state.md +231 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-functional-setstate.md +191 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-index-maps.md +276 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-lazy-state-init.md +196 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-lifecycle.md +265 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-mobile-compat.md +199 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-permission-scope.md +193 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-error-boundary.md +239 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-event-listener.md +151 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-file-src.md +155 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-invoke-hook.md +139 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-optimistic-update.md +211 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-capability-split.md +205 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-csp.md +207 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-least-privilege.md +106 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-no-wildcard.md +253 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-scope-paths.md +160 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-async-mutex.md +270 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-mutex-pattern.md +265 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-react-sync.md +375 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-single-container.md +275 -0
- package/templates/tanstack-start/docs/architecture.md +238 -167
- package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +777 -38
- package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +549 -37
- package/templates/tanstack-start/docs/library/tanstack-router/index.md +895 -111
- package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +641 -43
- package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +889 -38
- package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +891 -29
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +972 -36
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +1525 -881
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +1099 -20
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +796 -30
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +953 -35
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +371 -15
- package/templates/tauri/CLAUDE.md +189 -0
- package/templates/tauri/docs/guides/distribution.md +261 -0
- package/templates/tauri/docs/guides/getting-started.md +302 -0
- package/templates/tauri/docs/guides/mobile.md +288 -0
- package/templates/tauri/docs/library/tauri/index.md +510 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Distribution
|
|
2
|
+
|
|
3
|
+
> Tauri v2 빌드, 코드 서명, 배포 가이드
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 빌드 명령어
|
|
8
|
+
|
|
9
|
+
### 데스크톱
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# 기본 빌드 (현재 플랫폼)
|
|
13
|
+
npx tauri build
|
|
14
|
+
|
|
15
|
+
# 특정 번들 포맷
|
|
16
|
+
npx tauri build --bundles msi # Windows MSI
|
|
17
|
+
npx tauri build --bundles nsis # Windows NSIS
|
|
18
|
+
npx tauri build --bundles dmg # macOS DMG
|
|
19
|
+
npx tauri build --bundles app # macOS App Bundle
|
|
20
|
+
npx tauri build --bundles appimage # Linux AppImage
|
|
21
|
+
npx tauri build --bundles deb # Linux Debian
|
|
22
|
+
npx tauri build --bundles rpm # Linux RPM
|
|
23
|
+
|
|
24
|
+
# macOS Universal (ARM + Intel)
|
|
25
|
+
npx tauri build --bundles app --target universal-apple-darwin
|
|
26
|
+
|
|
27
|
+
# 디버그 빌드
|
|
28
|
+
npx tauri build --debug
|
|
29
|
+
|
|
30
|
+
# 빌드만 (번들링 스킵)
|
|
31
|
+
npx tauri build --no-bundle
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 모바일
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Android
|
|
38
|
+
npx tauri android build -- --aab # AAB (Play Store)
|
|
39
|
+
npx tauri android build -- --apk # APK (사이드로딩)
|
|
40
|
+
npx tauri android build -- --aab --target aarch64 # 특정 아키텍처
|
|
41
|
+
|
|
42
|
+
# iOS
|
|
43
|
+
npx tauri ios build # 일반 IPA
|
|
44
|
+
npx tauri ios build --export-method app-store-connect # App Store
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Windows 배포
|
|
50
|
+
|
|
51
|
+
### 인스톨러 형식
|
|
52
|
+
|
|
53
|
+
| 형식 | 특징 |
|
|
54
|
+
|------|------|
|
|
55
|
+
| **NSIS** | 크로스 컴파일 가능, 커스텀 UI |
|
|
56
|
+
| **MSI** | WiX 기반, Windows 전용 컴파일 |
|
|
57
|
+
|
|
58
|
+
### WebView2 설치 모드
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
// tauri.conf.json > bundle > windows
|
|
62
|
+
{
|
|
63
|
+
"webviewInstallMode": {
|
|
64
|
+
"type": "downloadBootstrapper"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| 모드 | 인터넷 | 크기 증가 | 설명 |
|
|
70
|
+
|------|--------|----------|------|
|
|
71
|
+
| `downloadBootstrapper` | 필요 | 없음 | 기본값, 최소 인스톨러 |
|
|
72
|
+
| `embedBootstrapper` | 필요 | ~1.8MB | Windows 7 호환 |
|
|
73
|
+
| `offlineInstaller` | 불필요 | ~127MB | 오프라인 환경 |
|
|
74
|
+
| `skip` | - | 없음 | 비권장 |
|
|
75
|
+
|
|
76
|
+
### NSIS 설정
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"bundle": {
|
|
81
|
+
"windows": {
|
|
82
|
+
"nsis": {
|
|
83
|
+
"oneClick": false,
|
|
84
|
+
"allowToChangeInstallationDirectory": true,
|
|
85
|
+
"createDesktopShortcut": true,
|
|
86
|
+
"createStartMenuShortcut": true,
|
|
87
|
+
"installMode": "both"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Windows 코드 서명
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
// tauri.conf.json > bundle > windows
|
|
98
|
+
{
|
|
99
|
+
"certificateThumbprint": "A1B1A2B2...",
|
|
100
|
+
"digestAlgorithm": "sha256",
|
|
101
|
+
"timestampUrl": "http://timestamp.comodoca.com"
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**인증서 준비:**
|
|
106
|
+
```bash
|
|
107
|
+
# PFX 변환
|
|
108
|
+
openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx
|
|
109
|
+
|
|
110
|
+
# Thumbprint 확인: certmgr.msc > Details
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## macOS 배포
|
|
116
|
+
|
|
117
|
+
### DMG 설정
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
// tauri.conf.json > bundle > macOS > dmg
|
|
121
|
+
{
|
|
122
|
+
"background": "./images/dmg-background.png",
|
|
123
|
+
"windowSize": { "width": 660, "height": 400 },
|
|
124
|
+
"appPosition": { "x": 180, "y": 220 },
|
|
125
|
+
"applicationFolderPosition": { "x": 480, "y": 220 }
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### macOS 코드 서명
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# 서명 ID 확인
|
|
133
|
+
security find-identity -v -p codesigning
|
|
134
|
+
|
|
135
|
+
# 환경 변수 (CI/CD)
|
|
136
|
+
export APPLE_CERTIFICATE=<base64-encoded-p12>
|
|
137
|
+
export APPLE_CERTIFICATE_PASSWORD=<password>
|
|
138
|
+
export APPLE_SIGNING_IDENTITY="Developer ID Application: Company (TEAM123)"
|
|
139
|
+
|
|
140
|
+
# Notarization
|
|
141
|
+
export APPLE_API_ISSUER=<issuer-id>
|
|
142
|
+
export APPLE_API_KEY=<key-id>
|
|
143
|
+
export APPLE_API_KEY_PATH=~/.appstoreconnect/private_keys/AuthKey_<KEY_ID>.p8
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### macOS App Store 제출
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# 1. Universal 빌드
|
|
150
|
+
npx tauri build --bundles app --target universal-apple-darwin
|
|
151
|
+
|
|
152
|
+
# 2. PKG 생성
|
|
153
|
+
xcrun productbuild --component MyApp.app /Applications \
|
|
154
|
+
--sign "Mac Installer Distribution: Company (TEAM123)" MyApp.pkg
|
|
155
|
+
|
|
156
|
+
# 3. 업로드
|
|
157
|
+
xcrun altool --upload-app -f MyApp.pkg -t macos \
|
|
158
|
+
--apiKey $KEY_ID --apiIssuer $ISSUER_ID
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**필수 Entitlements:**
|
|
162
|
+
```xml
|
|
163
|
+
<!-- Entitlements.plist -->
|
|
164
|
+
<key>com.apple.security.app-sandbox</key>
|
|
165
|
+
<true/>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Linux 배포
|
|
171
|
+
|
|
172
|
+
| 포맷 | 명령어 | 대상 |
|
|
173
|
+
|------|--------|------|
|
|
174
|
+
| AppImage | `--bundles appimage` | 범용 |
|
|
175
|
+
| Debian | `--bundles deb` | Ubuntu, Debian |
|
|
176
|
+
| RPM | `--bundles rpm` | Fedora, RHEL |
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## GitHub Actions CI/CD
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
name: Build & Release
|
|
184
|
+
on:
|
|
185
|
+
push:
|
|
186
|
+
branches: [release]
|
|
187
|
+
|
|
188
|
+
jobs:
|
|
189
|
+
build:
|
|
190
|
+
permissions:
|
|
191
|
+
contents: write
|
|
192
|
+
strategy:
|
|
193
|
+
fail-fast: false
|
|
194
|
+
matrix:
|
|
195
|
+
include:
|
|
196
|
+
- platform: macos-latest
|
|
197
|
+
args: '--target universal-apple-darwin'
|
|
198
|
+
- platform: ubuntu-22.04
|
|
199
|
+
args: ''
|
|
200
|
+
- platform: windows-latest
|
|
201
|
+
args: ''
|
|
202
|
+
|
|
203
|
+
runs-on: ${{ matrix.platform }}
|
|
204
|
+
steps:
|
|
205
|
+
- uses: actions/checkout@v4
|
|
206
|
+
|
|
207
|
+
- uses: actions/setup-node@v4
|
|
208
|
+
with:
|
|
209
|
+
node-version: lts/*
|
|
210
|
+
cache: npm
|
|
211
|
+
|
|
212
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
213
|
+
with:
|
|
214
|
+
targets: aarch64-apple-darwin
|
|
215
|
+
|
|
216
|
+
- name: Install Linux deps
|
|
217
|
+
if: startsWith(matrix.platform, 'ubuntu-')
|
|
218
|
+
run: |
|
|
219
|
+
sudo apt-get update
|
|
220
|
+
sudo apt-get install -y libwebkit2gtk-4.1-dev \
|
|
221
|
+
libappindicator3-dev librsvg2-dev patchelf
|
|
222
|
+
|
|
223
|
+
- run: npm install
|
|
224
|
+
|
|
225
|
+
- uses: tauri-apps/tauri-action@v0
|
|
226
|
+
env:
|
|
227
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
228
|
+
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
|
229
|
+
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
|
230
|
+
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
|
231
|
+
with:
|
|
232
|
+
tagName: v__VERSION__
|
|
233
|
+
releaseName: v__VERSION__
|
|
234
|
+
releaseDraft: true
|
|
235
|
+
args: ${{ matrix.args }}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 빌드 최적화
|
|
241
|
+
|
|
242
|
+
### Cargo 프로필 설정
|
|
243
|
+
|
|
244
|
+
```toml
|
|
245
|
+
# src-tauri/Cargo.toml
|
|
246
|
+
[profile.release]
|
|
247
|
+
strip = true # 디버그 심볼 제거
|
|
248
|
+
lto = true # Link-Time Optimization
|
|
249
|
+
opt-level = "s" # 사이즈 최적화 ("z"는 더 작지만 느림)
|
|
250
|
+
codegen-units = 1 # 최적화 극대화 (빌드 느려짐)
|
|
251
|
+
panic = "abort" # 패닉 시 즉시 종료 (바이너리 축소)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### 번들 사이즈 참고
|
|
255
|
+
|
|
256
|
+
| 구성 | 대략적 크기 |
|
|
257
|
+
|------|-----------|
|
|
258
|
+
| 최소 Tauri 앱 | ~600KB |
|
|
259
|
+
| React + Vite | ~2-5MB |
|
|
260
|
+
| + Plugin 몇 개 | ~5-15MB |
|
|
261
|
+
| Electron 동급 앱 | ~150-300MB |
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
> Tauri v2 + React + TypeScript + Vite 프로젝트 시작 가이드
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
### 모든 플랫폼 공통
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Rust 설치
|
|
13
|
+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
|
14
|
+
|
|
15
|
+
# Node.js (LTS)
|
|
16
|
+
# https://nodejs.org/ 에서 설치
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### macOS
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Xcode Command Line Tools
|
|
23
|
+
xcode-select --install
|
|
24
|
+
# 또는 App Store에서 Xcode 설치 (iOS 개발 시 필수)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Windows
|
|
28
|
+
|
|
29
|
+
1. **Visual Studio Build Tools** 설치
|
|
30
|
+
- "Desktop development with C++" 워크로드 선택
|
|
31
|
+
- MSVC 툴체인 기본 선택 확인
|
|
32
|
+
2. **WebView2 Runtime** (Windows 10 v1803+ 기본 포함)
|
|
33
|
+
3. **VBSCRIPT** feature (MSI 패키지 빌드 시)
|
|
34
|
+
|
|
35
|
+
### Linux (Debian/Ubuntu)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
sudo apt update
|
|
39
|
+
sudo apt install -y libwebkit2gtk-4.1-dev build-essential curl wget \
|
|
40
|
+
libssl-dev libgtk-3-dev librsvg2-dev libappindicator3-dev patchelf
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 프로젝트 생성
|
|
46
|
+
|
|
47
|
+
### 방법 1: create-tauri-app (권장)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# npm
|
|
51
|
+
npm create tauri-app@latest
|
|
52
|
+
|
|
53
|
+
# 대화형 프롬프트:
|
|
54
|
+
# - Project name: my-app
|
|
55
|
+
# - Identifier: com.example.myapp
|
|
56
|
+
# - Frontend language: TypeScript / JavaScript
|
|
57
|
+
# - Package manager: npm (또는 pnpm, yarn)
|
|
58
|
+
# - UI template: React
|
|
59
|
+
# - UI flavor: TypeScript
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 방법 2: 기존 Vite 프로젝트에 추가
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# 1. Vite + React + TS 프로젝트 생성
|
|
66
|
+
npm create vite@latest my-app -- --template react-ts
|
|
67
|
+
cd my-app
|
|
68
|
+
npm install
|
|
69
|
+
|
|
70
|
+
# 2. Tauri CLI 설치
|
|
71
|
+
npm add -D @tauri-apps/cli@latest
|
|
72
|
+
|
|
73
|
+
# 3. Tauri 초기화
|
|
74
|
+
npx tauri init
|
|
75
|
+
# - App name: my-app
|
|
76
|
+
# - Window title: My App
|
|
77
|
+
# - Web assets location: ../dist
|
|
78
|
+
# - Dev server URL: http://localhost:5173
|
|
79
|
+
# - Dev command: npm run dev
|
|
80
|
+
# - Build command: npm run build
|
|
81
|
+
|
|
82
|
+
# 4. Tauri API 패키지
|
|
83
|
+
npm add @tauri-apps/api
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 개발 시작
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 개발 서버 + Tauri 앱 실행
|
|
92
|
+
npx tauri dev
|
|
93
|
+
|
|
94
|
+
# 또는 package.json에 스크립트 추가
|
|
95
|
+
# "tauri": "tauri"
|
|
96
|
+
npm run tauri dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**개발 모드 특징:**
|
|
100
|
+
- Vite HMR (프론트엔드 변경 → 즉시 반영)
|
|
101
|
+
- Rust 코드 변경 → 자동 재컴파일
|
|
102
|
+
- DevTools 접근 가능
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 프로젝트 구조
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
my-app/
|
|
110
|
+
├── src/ # React + TypeScript (프론트엔드)
|
|
111
|
+
│ ├── main.tsx # React 엔트리
|
|
112
|
+
│ ├── App.tsx # 루트 컴포넌트
|
|
113
|
+
│ ├── App.css
|
|
114
|
+
│ └── components/
|
|
115
|
+
├── src-tauri/ # Rust (백엔드)
|
|
116
|
+
│ ├── src/
|
|
117
|
+
│ │ ├── main.rs # 데스크톱 엔트리
|
|
118
|
+
│ │ └── lib.rs # 공유 로직 (모바일 지원)
|
|
119
|
+
│ ├── capabilities/
|
|
120
|
+
│ │ └── default.json # 기본 권한
|
|
121
|
+
│ ├── icons/ # 앱 아이콘
|
|
122
|
+
│ ├── Cargo.toml # Rust 의존성
|
|
123
|
+
│ ├── tauri.conf.json # Tauri 설정
|
|
124
|
+
│ └── build.rs # 빌드 스크립트
|
|
125
|
+
├── public/ # 정적 파일
|
|
126
|
+
├── index.html
|
|
127
|
+
├── package.json
|
|
128
|
+
├── tsconfig.json
|
|
129
|
+
└── vite.config.ts
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Vite 설정
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// vite.config.ts
|
|
138
|
+
import { defineConfig } from 'vite';
|
|
139
|
+
import react from '@vitejs/plugin-react';
|
|
140
|
+
|
|
141
|
+
const host = process.env.TAURI_DEV_HOST;
|
|
142
|
+
|
|
143
|
+
export default defineConfig({
|
|
144
|
+
plugins: [react()],
|
|
145
|
+
clearScreen: false,
|
|
146
|
+
server: {
|
|
147
|
+
port: 5173,
|
|
148
|
+
strictPort: true, // Tauri가 기대하는 포트 보장
|
|
149
|
+
host: host || false, // 모바일 물리 디바이스 개발 시
|
|
150
|
+
hmr: host
|
|
151
|
+
? { protocol: 'ws', host, port: 1421 }
|
|
152
|
+
: undefined,
|
|
153
|
+
watch: {
|
|
154
|
+
ignored: ['**/src-tauri/**'], // Rust 재빌드 트리거 방지
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
envPrefix: ['VITE_', 'TAURI_ENV_*'],
|
|
158
|
+
build: {
|
|
159
|
+
target: process.env.TAURI_ENV_PLATFORM === 'windows'
|
|
160
|
+
? 'chrome105'
|
|
161
|
+
: 'safari13',
|
|
162
|
+
minify: !process.env.TAURI_ENV_DEBUG ? 'esbuild' : false,
|
|
163
|
+
sourcemap: !!process.env.TAURI_ENV_DEBUG,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Tauri 설정 (tauri.conf.json)
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"productName": "my-app",
|
|
175
|
+
"version": "0.1.0",
|
|
176
|
+
"identifier": "com.example.myapp",
|
|
177
|
+
"build": {
|
|
178
|
+
"beforeDevCommand": "npm run dev",
|
|
179
|
+
"beforeBuildCommand": "npm run build",
|
|
180
|
+
"devUrl": "http://localhost:5173",
|
|
181
|
+
"frontendDist": "../dist"
|
|
182
|
+
},
|
|
183
|
+
"app": {
|
|
184
|
+
"windows": [
|
|
185
|
+
{
|
|
186
|
+
"title": "My App",
|
|
187
|
+
"width": 1024,
|
|
188
|
+
"height": 768,
|
|
189
|
+
"resizable": true,
|
|
190
|
+
"fullscreen": false
|
|
191
|
+
}
|
|
192
|
+
],
|
|
193
|
+
"security": {
|
|
194
|
+
"csp": {
|
|
195
|
+
"default-src": "'self' customprotocol: asset:",
|
|
196
|
+
"connect-src": "ipc: http://ipc.localhost",
|
|
197
|
+
"img-src": "'self' asset: http://asset.localhost blob: data:",
|
|
198
|
+
"style-src": "'unsafe-inline' 'self'"
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"bundle": {
|
|
203
|
+
"active": true,
|
|
204
|
+
"icon": [
|
|
205
|
+
"icons/32x32.png",
|
|
206
|
+
"icons/128x128.png",
|
|
207
|
+
"icons/128x128@2x.png",
|
|
208
|
+
"icons/icon.icns",
|
|
209
|
+
"icons/icon.ico"
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 첫 번째 Command 만들기
|
|
218
|
+
|
|
219
|
+
### 1. Rust Command 정의
|
|
220
|
+
|
|
221
|
+
```rust
|
|
222
|
+
// src-tauri/src/lib.rs
|
|
223
|
+
#[tauri::command]
|
|
224
|
+
fn greet(name: &str) -> String {
|
|
225
|
+
format!("Hello, {}! You've been greeted from Rust!", name)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
|
229
|
+
pub fn run() {
|
|
230
|
+
tauri::Builder::default()
|
|
231
|
+
.invoke_handler(tauri::generate_handler![greet])
|
|
232
|
+
.run(tauri::generate_context!())
|
|
233
|
+
.expect("error while running tauri application");
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```rust
|
|
238
|
+
// src-tauri/src/main.rs
|
|
239
|
+
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
|
240
|
+
|
|
241
|
+
fn main() {
|
|
242
|
+
my_app_lib::run()
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### 2. 프론트엔드에서 호출
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
// src/App.tsx
|
|
250
|
+
import { useState } from 'react';
|
|
251
|
+
import { invoke } from '@tauri-apps/api/core';
|
|
252
|
+
|
|
253
|
+
function App() {
|
|
254
|
+
const [greeting, setGreeting] = useState('');
|
|
255
|
+
const [name, setName] = useState('');
|
|
256
|
+
|
|
257
|
+
async function handleGreet() {
|
|
258
|
+
const result = await invoke<string>('greet', { name });
|
|
259
|
+
setGreeting(result);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return (
|
|
263
|
+
<div>
|
|
264
|
+
<input value={name} onChange={(e) => setName(e.target.value)} />
|
|
265
|
+
<button onClick={handleGreet}>Greet</button>
|
|
266
|
+
<p>{greeting}</p>
|
|
267
|
+
</div>
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export default App;
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 3. Capability 추가 (필요 시)
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
// src-tauri/capabilities/default.json
|
|
278
|
+
{
|
|
279
|
+
"identifier": "default",
|
|
280
|
+
"description": "기본 앱 권한",
|
|
281
|
+
"windows": ["main"],
|
|
282
|
+
"permissions": [
|
|
283
|
+
"core:default"
|
|
284
|
+
]
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## CLI 명령어
|
|
291
|
+
|
|
292
|
+
| 명령어 | 설명 |
|
|
293
|
+
|--------|------|
|
|
294
|
+
| `npx tauri dev` | 개발 모드 실행 |
|
|
295
|
+
| `npx tauri build` | 프로덕션 빌드 |
|
|
296
|
+
| `npx tauri icon <path>` | 앱 아이콘 생성 |
|
|
297
|
+
| `npx tauri info` | 시스템 정보 출력 |
|
|
298
|
+
| `npx tauri init` | Tauri 프로젝트 초기화 |
|
|
299
|
+
| `npx tauri android init` | Android 프로젝트 초기화 |
|
|
300
|
+
| `npx tauri ios init` | iOS 프로젝트 초기화 |
|
|
301
|
+
| `npx tauri android dev` | Android 개발 모드 |
|
|
302
|
+
| `npx tauri ios dev` | iOS 개발 모드 |
|