claude-mpm 5.4.59__py3-none-any.whl → 5.4.64__py3-none-any.whl
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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +5 -0
- claude_mpm/cli/startup.py +14 -9
- claude_mpm/scripts/start_activity_logging.py +0 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +8 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/METADATA +1 -1
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/RECORD +128 -11
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.64.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tauri-build-deploy
|
|
3
|
+
description: Build configuration, release optimization, code signing, updater setup, and deployment strategies for Tauri applications
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: development
|
|
6
|
+
author: Claude MPM Team
|
|
7
|
+
license: MIT
|
|
8
|
+
progressive_disclosure:
|
|
9
|
+
entry_point:
|
|
10
|
+
summary: "Production deployment: build optimization, code signing, auto-updater, CI/CD integration, platform-specific packaging"
|
|
11
|
+
when_to_use: "Preparing Tauri apps for production release, implementing auto-updates, or setting up CI/CD pipelines"
|
|
12
|
+
quick_start: "1. Configure tauri.conf.json 2. Set up code signing 3. Implement updater 4. Optimize build 5. CI/CD pipeline"
|
|
13
|
+
context_limit: 600
|
|
14
|
+
tags:
|
|
15
|
+
- tauri
|
|
16
|
+
- build
|
|
17
|
+
- deployment
|
|
18
|
+
- release
|
|
19
|
+
- code-signing
|
|
20
|
+
- updater
|
|
21
|
+
requires_tools: []
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Tauri Build and Deployment
|
|
25
|
+
|
|
26
|
+
## Build Configuration
|
|
27
|
+
|
|
28
|
+
### Basic tauri.conf.json Structure
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"build": {
|
|
33
|
+
"beforeDevCommand": "npm run dev",
|
|
34
|
+
"beforeBuildCommand": "npm run build",
|
|
35
|
+
"devPath": "http://localhost:5173",
|
|
36
|
+
"distDir": "../dist",
|
|
37
|
+
"withGlobalTauri": false
|
|
38
|
+
},
|
|
39
|
+
"package": {
|
|
40
|
+
"productName": "MyApp",
|
|
41
|
+
"version": "1.0.0"
|
|
42
|
+
},
|
|
43
|
+
"tauri": {
|
|
44
|
+
"allowlist": {
|
|
45
|
+
"all": false,
|
|
46
|
+
"fs": {
|
|
47
|
+
"all": false,
|
|
48
|
+
"readFile": true,
|
|
49
|
+
"writeFile": true,
|
|
50
|
+
"scope": ["$APPDATA/*"]
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"bundle": {
|
|
54
|
+
"active": true,
|
|
55
|
+
"identifier": "com.mycompany.myapp",
|
|
56
|
+
"icon": [
|
|
57
|
+
"icons/32x32.png",
|
|
58
|
+
"icons/128x128.png",
|
|
59
|
+
"icons/icon.icns",
|
|
60
|
+
"icons/icon.ico"
|
|
61
|
+
],
|
|
62
|
+
"resources": ["resources/*"],
|
|
63
|
+
"externalBin": [],
|
|
64
|
+
"copyright": "",
|
|
65
|
+
"category": "DeveloperTool",
|
|
66
|
+
"shortDescription": "",
|
|
67
|
+
"longDescription": "",
|
|
68
|
+
"deb": {
|
|
69
|
+
"depends": []
|
|
70
|
+
},
|
|
71
|
+
"macOS": {
|
|
72
|
+
"frameworks": [],
|
|
73
|
+
"minimumSystemVersion": "10.13",
|
|
74
|
+
"exceptionDomain": "",
|
|
75
|
+
"signingIdentity": null,
|
|
76
|
+
"entitlements": null
|
|
77
|
+
},
|
|
78
|
+
"windows": {
|
|
79
|
+
"certificateThumbprint": null,
|
|
80
|
+
"digestAlgorithm": "sha256",
|
|
81
|
+
"timestampUrl": ""
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Production Build Optimization
|
|
89
|
+
|
|
90
|
+
**Cargo.toml configuration**:
|
|
91
|
+
```toml
|
|
92
|
+
[profile.release]
|
|
93
|
+
opt-level = "z" # Optimize for size
|
|
94
|
+
lto = true # Link-time optimization
|
|
95
|
+
codegen-units = 1 # Better optimization
|
|
96
|
+
panic = "abort" # Smaller binary
|
|
97
|
+
strip = true # Remove symbols
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Frontend optimization**:
|
|
101
|
+
```json
|
|
102
|
+
// vite.config.ts
|
|
103
|
+
export default {
|
|
104
|
+
build: {
|
|
105
|
+
minify: 'terser',
|
|
106
|
+
terserOptions: {
|
|
107
|
+
compress: {
|
|
108
|
+
drop_console: true,
|
|
109
|
+
drop_debugger: true
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
rollupOptions: {
|
|
113
|
+
output: {
|
|
114
|
+
manualChunks: {
|
|
115
|
+
vendor: ['react', 'react-dom']
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Code Signing
|
|
124
|
+
|
|
125
|
+
### macOS Code Signing
|
|
126
|
+
|
|
127
|
+
**1. Certificate Setup**:
|
|
128
|
+
```bash
|
|
129
|
+
# Import certificate to keychain
|
|
130
|
+
security import certificate.p12 -k ~/Library/Keychains/login.keychain
|
|
131
|
+
|
|
132
|
+
# Verify certificate
|
|
133
|
+
security find-identity -v -p codesigning
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**2. Configure tauri.conf.json**:
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"tauri": {
|
|
140
|
+
"bundle": {
|
|
141
|
+
"macOS": {
|
|
142
|
+
"signingIdentity": "Developer ID Application: Your Name (TEAM_ID)",
|
|
143
|
+
"entitlements": "src-tauri/entitlements.plist",
|
|
144
|
+
"exceptionDomain": null
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**3. entitlements.plist**:
|
|
152
|
+
```xml
|
|
153
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
154
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
155
|
+
<plist version="1.0">
|
|
156
|
+
<dict>
|
|
157
|
+
<key>com.apple.security.cs.allow-jit</key>
|
|
158
|
+
<true/>
|
|
159
|
+
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
|
160
|
+
<true/>
|
|
161
|
+
<key>com.apple.security.cs.disable-library-validation</key>
|
|
162
|
+
<true/>
|
|
163
|
+
<key>com.apple.security.network.client</key>
|
|
164
|
+
<true/>
|
|
165
|
+
</dict>
|
|
166
|
+
</plist>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**4. Notarization**:
|
|
170
|
+
```bash
|
|
171
|
+
# Build and sign
|
|
172
|
+
npm run tauri build
|
|
173
|
+
|
|
174
|
+
# Create zip for notarization
|
|
175
|
+
ditto -c -k --keepParent "src-tauri/target/release/bundle/macos/MyApp.app" MyApp.zip
|
|
176
|
+
|
|
177
|
+
# Submit to Apple
|
|
178
|
+
xcrun notarytool submit MyApp.zip \
|
|
179
|
+
--apple-id "your@email.com" \
|
|
180
|
+
--password "app-specific-password" \
|
|
181
|
+
--team-id "TEAM_ID" \
|
|
182
|
+
--wait
|
|
183
|
+
|
|
184
|
+
# Staple notarization
|
|
185
|
+
xcrun stapler staple "src-tauri/target/release/bundle/macos/MyApp.app"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Windows Code Signing
|
|
189
|
+
|
|
190
|
+
**1. Configure tauri.conf.json**:
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"tauri": {
|
|
194
|
+
"bundle": {
|
|
195
|
+
"windows": {
|
|
196
|
+
"certificateThumbprint": "YOUR_CERT_THUMBPRINT",
|
|
197
|
+
"digestAlgorithm": "sha256",
|
|
198
|
+
"timestampUrl": "http://timestamp.digicert.com"
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**2. Sign with signtool**:
|
|
206
|
+
```powershell
|
|
207
|
+
# Find certificate thumbprint
|
|
208
|
+
Get-ChildItem -Path Cert:\CurrentUser\My
|
|
209
|
+
|
|
210
|
+
# Sign executable
|
|
211
|
+
signtool sign /sha1 THUMBPRINT /tr http://timestamp.digicert.com /td sha256 /fd sha256 MyApp.exe
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Auto-Updater
|
|
215
|
+
|
|
216
|
+
### Backend Updater Configuration
|
|
217
|
+
|
|
218
|
+
**tauri.conf.json**:
|
|
219
|
+
```json
|
|
220
|
+
{
|
|
221
|
+
"tauri": {
|
|
222
|
+
"updater": {
|
|
223
|
+
"active": true,
|
|
224
|
+
"endpoints": [
|
|
225
|
+
"https://releases.myapp.com/{{target}}/{{current_version}}"
|
|
226
|
+
],
|
|
227
|
+
"dialog": true,
|
|
228
|
+
"pubkey": "YOUR_PUBLIC_KEY_HERE"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Generate Signing Keys
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
# Install Tauri CLI
|
|
238
|
+
cargo install tauri-cli
|
|
239
|
+
|
|
240
|
+
# Generate keypair
|
|
241
|
+
tauri signer generate -w ~/.tauri/myapp.key
|
|
242
|
+
|
|
243
|
+
# Output:
|
|
244
|
+
# Private key: ~/.tauri/myapp.key
|
|
245
|
+
# Public key: dW50cnVzdGVkIGNvbW1lbnQ6...
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Signing Releases
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# Build release
|
|
252
|
+
npm run tauri build
|
|
253
|
+
|
|
254
|
+
# Sign the update
|
|
255
|
+
tauri signer sign target/release/bundle/macos/MyApp.app.tar.gz \
|
|
256
|
+
-k ~/.tauri/myapp.key \
|
|
257
|
+
-p ""
|
|
258
|
+
|
|
259
|
+
# Creates MyApp.app.tar.gz.sig
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Update Server Response
|
|
263
|
+
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"version": "1.0.1",
|
|
267
|
+
"notes": "Bug fixes and performance improvements",
|
|
268
|
+
"pub_date": "2024-01-15T12:00:00Z",
|
|
269
|
+
"platforms": {
|
|
270
|
+
"darwin-x86_64": {
|
|
271
|
+
"signature": "dGhlIG1lc3NhZ2U=",
|
|
272
|
+
"url": "https://releases.myapp.com/MyApp_1.0.1_x64.app.tar.gz"
|
|
273
|
+
},
|
|
274
|
+
"darwin-aarch64": {
|
|
275
|
+
"signature": "dGhlIG1lc3NhZ2U=",
|
|
276
|
+
"url": "https://releases.myapp.com/MyApp_1.0.1_aarch64.app.tar.gz"
|
|
277
|
+
},
|
|
278
|
+
"windows-x86_64": {
|
|
279
|
+
"signature": "dGhlIG1lc3NhZ2U=",
|
|
280
|
+
"url": "https://releases.myapp.com/MyApp_1.0.1_x64.msi.zip"
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Frontend Updater Implementation
|
|
287
|
+
|
|
288
|
+
```rust
|
|
289
|
+
use tauri::updater::UpdateResponse;
|
|
290
|
+
|
|
291
|
+
#[tauri::command]
|
|
292
|
+
async fn check_for_updates(app: tauri::AppHandle) -> Result<Option<UpdateInfo>, String> {
|
|
293
|
+
let update_resp = app.updater()
|
|
294
|
+
.check()
|
|
295
|
+
.await
|
|
296
|
+
.map_err(|e| e.to_string())?;
|
|
297
|
+
|
|
298
|
+
if update_resp.is_update_available() {
|
|
299
|
+
Ok(Some(UpdateInfo {
|
|
300
|
+
version: update_resp.latest_version().to_string(),
|
|
301
|
+
date: update_resp.date().map(|d| d.to_string()),
|
|
302
|
+
body: update_resp.body().map(|b| b.to_string()),
|
|
303
|
+
}))
|
|
304
|
+
} else {
|
|
305
|
+
Ok(None)
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
#[tauri::command]
|
|
310
|
+
async fn install_update(app: tauri::AppHandle) -> Result<(), String> {
|
|
311
|
+
let update_resp = app.updater()
|
|
312
|
+
.check()
|
|
313
|
+
.await
|
|
314
|
+
.map_err(|e| e.to_string())?;
|
|
315
|
+
|
|
316
|
+
if update_resp.is_update_available() {
|
|
317
|
+
update_resp.download_and_install()
|
|
318
|
+
.await
|
|
319
|
+
.map_err(|e| e.to_string())?;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
Ok(())
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
#[derive(serde::Serialize)]
|
|
326
|
+
struct UpdateInfo {
|
|
327
|
+
version: String,
|
|
328
|
+
date: Option<String>,
|
|
329
|
+
body: Option<String>,
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Frontend usage**:
|
|
334
|
+
```typescript
|
|
335
|
+
import { invoke } from '@tauri-apps/api/core';
|
|
336
|
+
import { relaunch } from '@tauri-apps/api/process';
|
|
337
|
+
|
|
338
|
+
async function checkUpdates() {
|
|
339
|
+
const update = await invoke<UpdateInfo | null>('check_for_updates');
|
|
340
|
+
|
|
341
|
+
if (update) {
|
|
342
|
+
const install = confirm(
|
|
343
|
+
`Update ${update.version} available!\n\n${update.body}\n\nInstall now?`
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
if (install) {
|
|
347
|
+
await invoke('install_update');
|
|
348
|
+
await relaunch();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## CI/CD Integration
|
|
355
|
+
|
|
356
|
+
### GitHub Actions Workflow
|
|
357
|
+
|
|
358
|
+
```yaml
|
|
359
|
+
name: Release
|
|
360
|
+
|
|
361
|
+
on:
|
|
362
|
+
push:
|
|
363
|
+
tags:
|
|
364
|
+
- 'v*'
|
|
365
|
+
|
|
366
|
+
jobs:
|
|
367
|
+
release:
|
|
368
|
+
strategy:
|
|
369
|
+
fail-fast: false
|
|
370
|
+
matrix:
|
|
371
|
+
platform: [macos-latest, ubuntu-20.04, windows-latest]
|
|
372
|
+
|
|
373
|
+
runs-on: ${{ matrix.platform }}
|
|
374
|
+
|
|
375
|
+
steps:
|
|
376
|
+
- uses: actions/checkout@v3
|
|
377
|
+
|
|
378
|
+
- name: Setup Node
|
|
379
|
+
uses: actions/setup-node@v3
|
|
380
|
+
with:
|
|
381
|
+
node-version: 18
|
|
382
|
+
|
|
383
|
+
- name: Setup Rust
|
|
384
|
+
uses: dtolnay/rust-toolchain@stable
|
|
385
|
+
|
|
386
|
+
- name: Install dependencies (Ubuntu)
|
|
387
|
+
if: matrix.platform == 'ubuntu-20.04'
|
|
388
|
+
run: |
|
|
389
|
+
sudo apt-get update
|
|
390
|
+
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
|
|
391
|
+
|
|
392
|
+
- name: Install frontend dependencies
|
|
393
|
+
run: npm ci
|
|
394
|
+
|
|
395
|
+
- name: Build app
|
|
396
|
+
run: npm run tauri build
|
|
397
|
+
env:
|
|
398
|
+
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
399
|
+
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
400
|
+
|
|
401
|
+
- name: Upload Release Assets
|
|
402
|
+
uses: softprops/action-gh-release@v1
|
|
403
|
+
with:
|
|
404
|
+
files: |
|
|
405
|
+
src-tauri/target/release/bundle/macos/*.dmg
|
|
406
|
+
src-tauri/target/release/bundle/macos/*.app.tar.gz
|
|
407
|
+
src-tauri/target/release/bundle/macos/*.app.tar.gz.sig
|
|
408
|
+
src-tauri/target/release/bundle/deb/*.deb
|
|
409
|
+
src-tauri/target/release/bundle/appimage/*.AppImage
|
|
410
|
+
src-tauri/target/release/bundle/msi/*.msi
|
|
411
|
+
src-tauri/target/release/bundle/msi/*.msi.zip
|
|
412
|
+
src-tauri/target/release/bundle/msi/*.msi.zip.sig
|
|
413
|
+
env:
|
|
414
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Platform-Specific Builds
|
|
418
|
+
|
|
419
|
+
**macOS Universal Binary**:
|
|
420
|
+
```bash
|
|
421
|
+
# Install targets
|
|
422
|
+
rustup target add x86_64-apple-darwin aarch64-apple-darwin
|
|
423
|
+
|
|
424
|
+
# Build for both architectures
|
|
425
|
+
npm run tauri build -- --target universal-apple-darwin
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**Windows ARM**:
|
|
429
|
+
```bash
|
|
430
|
+
# Install target
|
|
431
|
+
rustup target add aarch64-pc-windows-msvc
|
|
432
|
+
|
|
433
|
+
# Build
|
|
434
|
+
npm run tauri build -- --target aarch64-pc-windows-msvc
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
**Linux AppImage**:
|
|
438
|
+
```bash
|
|
439
|
+
# Install dependencies
|
|
440
|
+
sudo apt-get install libfuse2
|
|
441
|
+
|
|
442
|
+
# Build
|
|
443
|
+
npm run tauri build -- --bundles appimage
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## Environment-Specific Configuration
|
|
447
|
+
|
|
448
|
+
### Development vs Production
|
|
449
|
+
|
|
450
|
+
**config/dev.conf.json**:
|
|
451
|
+
```json
|
|
452
|
+
{
|
|
453
|
+
"build": {
|
|
454
|
+
"devPath": "http://localhost:5173",
|
|
455
|
+
"beforeDevCommand": "npm run dev"
|
|
456
|
+
},
|
|
457
|
+
"tauri": {
|
|
458
|
+
"allowlist": {
|
|
459
|
+
"all": true // Permissive for development
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**config/prod.conf.json**:
|
|
466
|
+
```json
|
|
467
|
+
{
|
|
468
|
+
"build": {
|
|
469
|
+
"distDir": "../dist",
|
|
470
|
+
"beforeBuildCommand": "npm run build"
|
|
471
|
+
},
|
|
472
|
+
"tauri": {
|
|
473
|
+
"allowlist": {
|
|
474
|
+
"all": false, // Restrictive for production
|
|
475
|
+
"fs": {
|
|
476
|
+
"scope": ["$APPDATA/*"]
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
**Build script**:
|
|
484
|
+
```bash
|
|
485
|
+
#!/bin/bash
|
|
486
|
+
|
|
487
|
+
if [ "$NODE_ENV" = "production" ]; then
|
|
488
|
+
cp config/prod.conf.json src-tauri/tauri.conf.json
|
|
489
|
+
else
|
|
490
|
+
cp config/dev.conf.json src-tauri/tauri.conf.json
|
|
491
|
+
fi
|
|
492
|
+
|
|
493
|
+
npm run tauri build
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
## Resource Bundling
|
|
497
|
+
|
|
498
|
+
### Including External Files
|
|
499
|
+
|
|
500
|
+
**tauri.conf.json**:
|
|
501
|
+
```json
|
|
502
|
+
{
|
|
503
|
+
"tauri": {
|
|
504
|
+
"bundle": {
|
|
505
|
+
"resources": [
|
|
506
|
+
"resources/*",
|
|
507
|
+
"templates/*.html",
|
|
508
|
+
"assets/fonts/*"
|
|
509
|
+
],
|
|
510
|
+
"externalBin": [
|
|
511
|
+
"binaries/ffmpeg",
|
|
512
|
+
"binaries/imagemagick"
|
|
513
|
+
]
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
**Accessing bundled resources**:
|
|
520
|
+
```rust
|
|
521
|
+
use tauri::Manager;
|
|
522
|
+
|
|
523
|
+
#[tauri::command]
|
|
524
|
+
async fn read_bundled_resource(
|
|
525
|
+
app: tauri::AppHandle,
|
|
526
|
+
path: String,
|
|
527
|
+
) -> Result<String, String> {
|
|
528
|
+
let resource_path = app.path_resolver()
|
|
529
|
+
.resolve_resource(&path)
|
|
530
|
+
.ok_or("Resource not found")?;
|
|
531
|
+
|
|
532
|
+
tokio::fs::read_to_string(resource_path)
|
|
533
|
+
.await
|
|
534
|
+
.map_err(|e| e.to_string())
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
## Best Practices
|
|
539
|
+
|
|
540
|
+
1. **Optimize bundle size** - Use LTO, strip symbols, minimize frontend
|
|
541
|
+
2. **Sign all releases** - Code signing for trust and security
|
|
542
|
+
3. **Implement auto-updater** - Keep users on latest version
|
|
543
|
+
4. **Use CI/CD** - Automate builds for all platforms
|
|
544
|
+
5. **Test on all platforms** - macOS, Windows, Linux variations
|
|
545
|
+
6. **Version consistently** - Sync package.json, Cargo.toml, tauri.conf.json
|
|
546
|
+
7. **Secure signing keys** - Use environment variables, never commit
|
|
547
|
+
8. **Generate release notes** - Document changes for users
|
|
548
|
+
9. **Monitor update success** - Track adoption rates
|
|
549
|
+
10. **Rollback capability** - Keep previous versions available
|
|
550
|
+
|
|
551
|
+
## Common Pitfalls
|
|
552
|
+
|
|
553
|
+
❌ **Hardcoding dev URLs in production**:
|
|
554
|
+
```json
|
|
555
|
+
// WRONG - dev URL in production config
|
|
556
|
+
{
|
|
557
|
+
"build": {
|
|
558
|
+
"distDir": "http://localhost:5173"
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// CORRECT
|
|
563
|
+
{
|
|
564
|
+
"build": {
|
|
565
|
+
"distDir": "../dist"
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
❌ **Committing private keys**:
|
|
571
|
+
```bash
|
|
572
|
+
# WRONG - private key in repo
|
|
573
|
+
git add .tauri/myapp.key
|
|
574
|
+
|
|
575
|
+
# CORRECT - add to .gitignore
|
|
576
|
+
echo ".tauri/*.key" >> .gitignore
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
❌ **Not testing signed builds**:
|
|
580
|
+
```bash
|
|
581
|
+
# WRONG - only testing debug builds
|
|
582
|
+
|
|
583
|
+
# CORRECT - test release builds
|
|
584
|
+
npm run tauri build
|
|
585
|
+
# Then manually test the built app
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
## Summary
|
|
589
|
+
|
|
590
|
+
- **Build optimization** with Cargo profile and frontend minification
|
|
591
|
+
- **Code signing** for macOS (notarization) and Windows (signtool)
|
|
592
|
+
- **Auto-updater** with signed releases and update server
|
|
593
|
+
- **CI/CD integration** with GitHub Actions for all platforms
|
|
594
|
+
- **Platform-specific builds** for universal binaries and ARM
|
|
595
|
+
- **Environment configs** separate dev and production settings
|
|
596
|
+
- **Resource bundling** for assets and external binaries
|
|
597
|
+
- **Security** with key management and signing verification
|
|
598
|
+
- **Testing** release builds on all target platforms
|
|
599
|
+
- **Monitoring** update adoption and rollback capability
|