codeply-cli 0.3.0 → 0.4.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.
Files changed (375) hide show
  1. package/THIRD_PARTY_NOTICES.md +63 -63
  2. package/bin/codeply.js +129 -6
  3. package/lib/agent.mjs +2139 -2139
  4. package/lib/ai.mjs +6 -6
  5. package/lib/apply-patch.js +217 -217
  6. package/lib/arity-table.json +138 -138
  7. package/lib/arity.js +70 -70
  8. package/lib/auth.mjs +6 -6
  9. package/lib/cloud.mjs +708 -0
  10. package/lib/commands.js +103 -103
  11. package/lib/design-library/assemble-artifact.mjs +21 -21
  12. package/lib/design-library/cleanup.mjs +45 -45
  13. package/lib/design-library/index.json +22379 -22379
  14. package/lib/design-library/make-table-data.mjs +39 -39
  15. package/lib/diagnostics.js +192 -192
  16. package/lib/edit-engine.js +364 -364
  17. package/lib/github-agent.mjs +311 -290
  18. package/lib/history.js +75 -75
  19. package/lib/mcp.js +258 -258
  20. package/lib/native-tools.mjs +189 -189
  21. package/lib/oauth-connectors.js +2 -1
  22. package/lib/permissions.js +109 -109
  23. package/lib/plugins.js +353 -353
  24. package/lib/server.mjs +457 -457
  25. package/lib/session-db.js +220 -220
  26. package/lib/share.js +168 -168
  27. package/lib/skills.js +416 -416
  28. package/lib/snapshot.js +146 -146
  29. package/lib/terminal-hints.js +154 -154
  30. package/lib/tools.mjs +2012 -2012
  31. package/lib/typecheck-worker.js +147 -147
  32. package/lib/web-tools.js +158 -158
  33. package/package.json +49 -47
  34. package/skills/SOURCE.md +58 -58
  35. package/skills/accessibility/SKILL.md +147 -147
  36. package/skills/agent-architecture-audit/SKILL.md +257 -257
  37. package/skills/agent-eval/SKILL.md +147 -147
  38. package/skills/agent-harness-construction/SKILL.md +74 -74
  39. package/skills/agent-introspection-debugging/SKILL.md +154 -154
  40. package/skills/agent-payment-x402/SKILL.md +225 -225
  41. package/skills/agent-self-evaluation/SKILL.md +182 -182
  42. package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -71
  43. package/skills/agent-self-evaluation/references/hook-integration.md +64 -64
  44. package/skills/agent-sort/SKILL.md +216 -216
  45. package/skills/agentic-engineering/SKILL.md +64 -64
  46. package/skills/agentic-os/SKILL.md +388 -388
  47. package/skills/ai-first-engineering/SKILL.md +52 -52
  48. package/skills/ai-regression-testing/SKILL.md +386 -386
  49. package/skills/android-clean-architecture/SKILL.md +340 -340
  50. package/skills/angular-developer/SKILL.md +155 -155
  51. package/skills/angular-developer/references/angular-animations.md +160 -160
  52. package/skills/angular-developer/references/angular-aria.md +410 -410
  53. package/skills/angular-developer/references/cli.md +86 -86
  54. package/skills/angular-developer/references/component-harnesses.md +59 -59
  55. package/skills/angular-developer/references/component-styling.md +91 -91
  56. package/skills/angular-developer/references/components.md +117 -117
  57. package/skills/angular-developer/references/creating-services.md +97 -97
  58. package/skills/angular-developer/references/data-resolvers.md +69 -69
  59. package/skills/angular-developer/references/define-routes.md +67 -67
  60. package/skills/angular-developer/references/defining-providers.md +72 -72
  61. package/skills/angular-developer/references/di-fundamentals.md +120 -120
  62. package/skills/angular-developer/references/e2e-testing.md +56 -56
  63. package/skills/angular-developer/references/effects.md +83 -83
  64. package/skills/angular-developer/references/hierarchical-injectors.md +43 -43
  65. package/skills/angular-developer/references/host-elements.md +80 -80
  66. package/skills/angular-developer/references/injection-context.md +63 -63
  67. package/skills/angular-developer/references/inputs.md +101 -101
  68. package/skills/angular-developer/references/linked-signal.md +59 -59
  69. package/skills/angular-developer/references/loading-strategies.md +61 -61
  70. package/skills/angular-developer/references/mcp.md +108 -108
  71. package/skills/angular-developer/references/navigate-to-routes.md +69 -69
  72. package/skills/angular-developer/references/outputs.md +86 -86
  73. package/skills/angular-developer/references/reactive-forms.md +122 -122
  74. package/skills/angular-developer/references/rendering-strategies.md +44 -44
  75. package/skills/angular-developer/references/resource.md +77 -77
  76. package/skills/angular-developer/references/route-animations.md +56 -56
  77. package/skills/angular-developer/references/route-guards.md +52 -52
  78. package/skills/angular-developer/references/router-lifecycle.md +45 -45
  79. package/skills/angular-developer/references/router-testing.md +87 -87
  80. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
  81. package/skills/angular-developer/references/signal-forms.md +795 -795
  82. package/skills/angular-developer/references/signals-overview.md +94 -94
  83. package/skills/angular-developer/references/tailwind-css.md +69 -69
  84. package/skills/angular-developer/references/template-driven-forms.md +114 -114
  85. package/skills/angular-developer/references/testing-fundamentals.md +65 -65
  86. package/skills/api-connector-builder/SKILL.md +121 -121
  87. package/skills/api-design/SKILL.md +524 -524
  88. package/skills/architecture-decision-records/SKILL.md +180 -180
  89. package/skills/article-writing/SKILL.md +80 -80
  90. package/skills/automation-audit-ops/SKILL.md +143 -143
  91. package/skills/autonomous-agent-harness/SKILL.md +274 -274
  92. package/skills/autonomous-loops/SKILL.md +611 -611
  93. package/skills/backend-patterns/SKILL.md +562 -562
  94. package/skills/benchmark/SKILL.md +95 -95
  95. package/skills/benchmark-methodology/SKILL.md +191 -191
  96. package/skills/benchmark-optimization-loop/SKILL.md +71 -71
  97. package/skills/blender-motion-state-inspection/SKILL.md +165 -165
  98. package/skills/blueprint/SKILL.md +106 -106
  99. package/skills/brand-discovery/SKILL.md +145 -145
  100. package/skills/brand-discovery/references/10_purpose-why.md +40 -40
  101. package/skills/brand-discovery/references/20_positioning.md +44 -44
  102. package/skills/brand-discovery/references/30_audience-niche.md +52 -52
  103. package/skills/brand-discovery/references/40_personality-archetype.md +57 -57
  104. package/skills/brand-discovery/references/50_voice-tone.md +59 -59
  105. package/skills/brand-discovery/references/60_narrative-story.md +50 -50
  106. package/skills/brand-discovery/references/70_founder-tension.md +49 -49
  107. package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -133
  108. package/skills/brand-voice/SKILL.md +98 -98
  109. package/skills/brand-voice/references/voice-profile-schema.md +55 -55
  110. package/skills/browser-qa/SKILL.md +105 -105
  111. package/skills/bun-runtime/SKILL.md +85 -85
  112. package/skills/canary-watch/SKILL.md +108 -108
  113. package/skills/carrier-relationship-management/SKILL.md +212 -212
  114. package/skills/cisco-ios-patterns/SKILL.md +164 -164
  115. package/skills/ck/SKILL.md +148 -148
  116. package/skills/claude-devfleet/SKILL.md +112 -112
  117. package/skills/click-path-audit/SKILL.md +245 -245
  118. package/skills/clickhouse-io/SKILL.md +445 -445
  119. package/skills/code-tour/SKILL.md +254 -254
  120. package/skills/codebase-onboarding/SKILL.md +234 -234
  121. package/skills/codehealth-mcp/SKILL.md +167 -167
  122. package/skills/coding-standards/SKILL.md +551 -551
  123. package/skills/competitive-platform-analysis/SKILL.md +214 -214
  124. package/skills/competitive-report-structure/SKILL.md +162 -162
  125. package/skills/compose-multiplatform-patterns/SKILL.md +300 -300
  126. package/skills/config-gc/SKILL.md +120 -120
  127. package/skills/configure-ecc/SKILL.md +385 -385
  128. package/skills/connections-optimizer/SKILL.md +190 -190
  129. package/skills/content-engine/SKILL.md +132 -132
  130. package/skills/content-hash-cache-pattern/SKILL.md +162 -162
  131. package/skills/context-budget/SKILL.md +136 -136
  132. package/skills/continuous-agent-loop/SKILL.md +46 -46
  133. package/skills/continuous-learning/SKILL.md +132 -132
  134. package/skills/continuous-learning-v2/SKILL.md +361 -361
  135. package/skills/contract-first/SKILL.md +287 -287
  136. package/skills/cost-aware-llm-pipeline/SKILL.md +184 -184
  137. package/skills/cost-tracking/SKILL.md +97 -97
  138. package/skills/council/SKILL.md +204 -204
  139. package/skills/cpp-coding-standards/SKILL.md +724 -724
  140. package/skills/cpp-testing/SKILL.md +325 -325
  141. package/skills/crosspost/SKILL.md +112 -112
  142. package/skills/csharp-testing/SKILL.md +322 -322
  143. package/skills/customer-billing-ops/SKILL.md +141 -141
  144. package/skills/customs-trade-compliance/SKILL.md +263 -263
  145. package/skills/dart-flutter-patterns/SKILL.md +564 -564
  146. package/skills/dashboard-builder/SKILL.md +109 -109
  147. package/skills/data-scraper-agent/SKILL.md +765 -765
  148. package/skills/data-throughput-accelerator/SKILL.md +74 -74
  149. package/skills/database-migrations/SKILL.md +430 -430
  150. package/skills/deep-research/SKILL.md +160 -160
  151. package/skills/defi-amm-security/SKILL.md +167 -167
  152. package/skills/delivery-gate/SKILL.md +126 -126
  153. package/skills/deployment-patterns/SKILL.md +428 -428
  154. package/skills/design-system/SKILL.md +83 -83
  155. package/skills/django-celery/SKILL.md +458 -458
  156. package/skills/django-patterns/SKILL.md +735 -735
  157. package/skills/django-security/SKILL.md +644 -644
  158. package/skills/django-tdd/SKILL.md +730 -730
  159. package/skills/django-verification/SKILL.md +470 -470
  160. package/skills/dmux-workflows/SKILL.md +192 -192
  161. package/skills/docker-patterns/SKILL.md +365 -365
  162. package/skills/documentation-lookup/SKILL.md +91 -91
  163. package/skills/dotnet-patterns/SKILL.md +322 -322
  164. package/skills/dynamic-workflow-mode/SKILL.md +124 -124
  165. package/skills/e2e-testing/SKILL.md +327 -327
  166. package/skills/ecc-guide/SKILL.md +190 -190
  167. package/skills/ecc-recipes/SKILL.md +149 -149
  168. package/skills/ecc-tools-cost-audit/SKILL.md +161 -161
  169. package/skills/email-ops/SKILL.md +122 -122
  170. package/skills/energy-procurement/SKILL.md +228 -228
  171. package/skills/enterprise-agent-ops/SKILL.md +51 -51
  172. package/skills/error-handling/SKILL.md +377 -377
  173. package/skills/eval-harness/SKILL.md +271 -271
  174. package/skills/evm-token-decimals/SKILL.md +131 -131
  175. package/skills/exa-search/SKILL.md +108 -108
  176. package/skills/fal-ai-media/SKILL.md +289 -289
  177. package/skills/fastapi-patterns/SKILL.md +514 -514
  178. package/skills/finance-billing-ops/SKILL.md +128 -128
  179. package/skills/flox-environments/SKILL.md +497 -497
  180. package/skills/flutter-dart-code-review/SKILL.md +436 -436
  181. package/skills/foundation-models-on-device/SKILL.md +243 -243
  182. package/skills/frontend-a11y/SKILL.md +446 -446
  183. package/skills/frontend-design-direction/SKILL.md +93 -93
  184. package/skills/frontend-patterns/SKILL.md +657 -657
  185. package/skills/frontend-slides/SKILL.md +185 -185
  186. package/skills/fsharp-testing/SKILL.md +281 -281
  187. package/skills/gan-style-harness/SKILL.md +279 -279
  188. package/skills/gateguard/SKILL.md +133 -133
  189. package/skills/generating-python-installer/SKILL.md +820 -820
  190. package/skills/git-workflow/SKILL.md +716 -716
  191. package/skills/github-ops/SKILL.md +145 -145
  192. package/skills/golang-patterns/SKILL.md +676 -676
  193. package/skills/golang-testing/SKILL.md +721 -721
  194. package/skills/google-workspace-ops/SKILL.md +96 -96
  195. package/skills/growth-log/SKILL.md +128 -128
  196. package/skills/healthcare-cdss-patterns/SKILL.md +246 -246
  197. package/skills/healthcare-emr-patterns/SKILL.md +160 -160
  198. package/skills/healthcare-eval-harness/SKILL.md +208 -208
  199. package/skills/healthcare-phi-compliance/SKILL.md +146 -146
  200. package/skills/hermes-imports/SKILL.md +89 -89
  201. package/skills/hexagonal-architecture/SKILL.md +277 -277
  202. package/skills/hipaa-compliance/SKILL.md +79 -79
  203. package/skills/homelab-network-readiness/SKILL.md +170 -170
  204. package/skills/homelab-network-setup/SKILL.md +130 -130
  205. package/skills/homelab-pihole-dns/SKILL.md +275 -275
  206. package/skills/homelab-vlan-segmentation/SKILL.md +312 -312
  207. package/skills/homelab-wireguard-vpn/SKILL.md +306 -306
  208. package/skills/hookify-rules/SKILL.md +128 -128
  209. package/skills/inherit-legacy-style/SKILL.md +157 -157
  210. package/skills/intent-driven-development/SKILL.md +360 -360
  211. package/skills/inventory-demand-planning/SKILL.md +247 -247
  212. package/skills/investor-materials/SKILL.md +97 -97
  213. package/skills/investor-outreach/SKILL.md +92 -92
  214. package/skills/ios-icon-gen/SKILL.md +158 -158
  215. package/skills/iterative-retrieval/SKILL.md +212 -212
  216. package/skills/ito-basket-compare/SKILL.md +64 -64
  217. package/skills/ito-compute/SKILL.md +129 -129
  218. package/skills/ito-data-atlas-agent/SKILL.md +64 -64
  219. package/skills/ito-market-intelligence/SKILL.md +61 -61
  220. package/skills/ito-trade-planner/SKILL.md +68 -68
  221. package/skills/java-coding-standards/SKILL.md +384 -384
  222. package/skills/jira-integration/SKILL.md +303 -303
  223. package/skills/jpa-patterns/SKILL.md +152 -152
  224. package/skills/knowledge-ops/SKILL.md +155 -155
  225. package/skills/kotlin-coroutines-flows/SKILL.md +285 -285
  226. package/skills/kotlin-exposed-patterns/SKILL.md +720 -720
  227. package/skills/kotlin-ktor-patterns/SKILL.md +690 -690
  228. package/skills/kotlin-patterns/SKILL.md +712 -712
  229. package/skills/kotlin-testing/SKILL.md +825 -825
  230. package/skills/kubernetes-patterns/SKILL.md +756 -756
  231. package/skills/laravel-patterns/SKILL.md +416 -416
  232. package/skills/laravel-plugin-discovery/SKILL.md +230 -230
  233. package/skills/laravel-security/SKILL.md +948 -948
  234. package/skills/laravel-tdd/SKILL.md +675 -675
  235. package/skills/laravel-verification/SKILL.md +180 -180
  236. package/skills/latency-critical-systems/SKILL.md +75 -75
  237. package/skills/lead-intelligence/SKILL.md +322 -322
  238. package/skills/liquid-glass-design/SKILL.md +279 -279
  239. package/skills/llm-trading-agent-security/SKILL.md +147 -147
  240. package/skills/logistics-exception-management/SKILL.md +222 -222
  241. package/skills/loop-design-check/SKILL.md +143 -143
  242. package/skills/mailtrap-email-integration/SKILL.md +77 -77
  243. package/skills/make-interfaces-feel-better/SKILL.md +152 -152
  244. package/skills/manim-video/SKILL.md +90 -90
  245. package/skills/market-research/SKILL.md +76 -76
  246. package/skills/marketing-campaign/SKILL.md +114 -114
  247. package/skills/mcp-server-patterns/SKILL.md +70 -70
  248. package/skills/messages-ops/SKILL.md +105 -105
  249. package/skills/ml-adoption-playbook/SKILL.md +57 -57
  250. package/skills/mle-workflow/SKILL.md +348 -348
  251. package/skills/motion-advanced/SKILL.md +596 -596
  252. package/skills/motion-foundations/SKILL.md +299 -299
  253. package/skills/motion-patterns/SKILL.md +434 -434
  254. package/skills/motion-ui/SKILL.md +576 -576
  255. package/skills/mysql-patterns/SKILL.md +413 -413
  256. package/skills/nanoclaw-repl/SKILL.md +34 -34
  257. package/skills/nestjs-patterns/SKILL.md +231 -231
  258. package/skills/netmiko-ssh-automation/SKILL.md +174 -174
  259. package/skills/network-bgp-diagnostics/SKILL.md +168 -168
  260. package/skills/network-config-validation/SKILL.md +211 -211
  261. package/skills/network-interface-health/SKILL.md +153 -153
  262. package/skills/nextjs-turbopack/SKILL.md +58 -58
  263. package/skills/nodejs-keccak256/SKILL.md +103 -103
  264. package/skills/nutrient-document-processing/SKILL.md +168 -168
  265. package/skills/nuxt4-patterns/SKILL.md +101 -101
  266. package/skills/openclaw-persona-forge/SKILL.md +289 -289
  267. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
  268. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
  269. package/skills/openclaw-persona-forge/references/error-handling.md +53 -53
  270. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
  271. package/skills/openclaw-persona-forge/references/naming-system.md +39 -39
  272. package/skills/openclaw-persona-forge/references/output-template.md +166 -166
  273. package/skills/opensource-pipeline/SKILL.md +256 -256
  274. package/skills/orch-add-feature/SKILL.md +45 -45
  275. package/skills/orch-build-mvp/SKILL.md +49 -49
  276. package/skills/orch-change-feature/SKILL.md +43 -43
  277. package/skills/orch-fix-defect/SKILL.md +43 -43
  278. package/skills/orch-pipeline/SKILL.md +121 -121
  279. package/skills/orch-refine-code/SKILL.md +44 -44
  280. package/skills/parallel-execution-optimizer/SKILL.md +74 -74
  281. package/skills/perl-patterns/SKILL.md +505 -505
  282. package/skills/perl-security/SKILL.md +504 -504
  283. package/skills/perl-testing/SKILL.md +476 -476
  284. package/skills/plan-canvas/SKILL.md +153 -153
  285. package/skills/plan-orchestrate/SKILL.md +263 -263
  286. package/skills/plankton-code-quality/SKILL.md +237 -237
  287. package/skills/postgres-patterns/SKILL.md +148 -148
  288. package/skills/prediction-market-oracle-research/SKILL.md +64 -64
  289. package/skills/prediction-market-risk-review/SKILL.md +61 -61
  290. package/skills/premium-web-design/SKILL.md +154 -154
  291. package/skills/prisma-patterns/SKILL.md +401 -401
  292. package/skills/product-capability/SKILL.md +142 -142
  293. package/skills/product-lens/SKILL.md +93 -93
  294. package/skills/production-audit/SKILL.md +207 -207
  295. package/skills/production-scheduling/SKILL.md +238 -238
  296. package/skills/project-flow-ops/SKILL.md +112 -112
  297. package/skills/prompt-optimizer/SKILL.md +398 -398
  298. package/skills/python-patterns/SKILL.md +751 -751
  299. package/skills/python-testing/SKILL.md +817 -817
  300. package/skills/pytorch-patterns/SKILL.md +397 -397
  301. package/skills/quality-nonconformance/SKILL.md +260 -260
  302. package/skills/quarkus-patterns/SKILL.md +723 -723
  303. package/skills/quarkus-security/SKILL.md +468 -468
  304. package/skills/quarkus-tdd/SKILL.md +812 -812
  305. package/skills/quarkus-verification/SKILL.md +480 -480
  306. package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -68
  307. package/skills/react-native-patterns/SKILL.md +326 -326
  308. package/skills/react-patterns/SKILL.md +342 -342
  309. package/skills/react-performance/SKILL.md +575 -575
  310. package/skills/react-testing/SKILL.md +424 -424
  311. package/skills/recsys-pipeline-architect/SKILL.md +115 -115
  312. package/skills/recursive-decision-ledger/SKILL.md +81 -81
  313. package/skills/redis-patterns/SKILL.md +404 -404
  314. package/skills/regex-vs-llm-structured-text/SKILL.md +221 -221
  315. package/skills/remotion-video-creation/SKILL.md +43 -43
  316. package/skills/repo-scan/SKILL.md +79 -79
  317. package/skills/research-ops/SKILL.md +113 -113
  318. package/skills/returns-reverse-logistics/SKILL.md +240 -240
  319. package/skills/rules-distill/SKILL.md +265 -265
  320. package/skills/rust-patterns/SKILL.md +500 -500
  321. package/skills/rust-testing/SKILL.md +501 -501
  322. package/skills/safety-guard/SKILL.md +76 -76
  323. package/skills/santa-method/SKILL.md +307 -307
  324. package/skills/scientific-db-pubmed-database/SKILL.md +176 -176
  325. package/skills/scientific-db-uspto-database/SKILL.md +178 -178
  326. package/skills/scientific-pkg-gget/SKILL.md +167 -167
  327. package/skills/scientific-thinking-literature-review/SKILL.md +193 -193
  328. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -161
  329. package/skills/search-first/SKILL.md +183 -183
  330. package/skills/security-bounty-hunter/SKILL.md +100 -100
  331. package/skills/security-review/SKILL.md +504 -504
  332. package/skills/security-scan/SKILL.md +166 -166
  333. package/skills/seo/SKILL.md +155 -155
  334. package/skills/skill-comply/SKILL.md +59 -59
  335. package/skills/skill-scout/SKILL.md +141 -141
  336. package/skills/skill-stocktake/SKILL.md +195 -195
  337. package/skills/social-graph-ranker/SKILL.md +155 -155
  338. package/skills/social-publisher/SKILL.md +130 -130
  339. package/skills/springboot-patterns/SKILL.md +315 -315
  340. package/skills/springboot-security/SKILL.md +273 -273
  341. package/skills/springboot-tdd/SKILL.md +159 -159
  342. package/skills/springboot-verification/SKILL.md +232 -232
  343. package/skills/strategic-compact/SKILL.md +142 -142
  344. package/skills/swift-actor-persistence/SKILL.md +144 -144
  345. package/skills/swift-concurrency-6-2/SKILL.md +216 -216
  346. package/skills/swift-protocol-di-testing/SKILL.md +191 -191
  347. package/skills/swiftui-patterns/SKILL.md +259 -259
  348. package/skills/taste/SKILL.md +264 -264
  349. package/skills/taste/references/genre-taxonomy.md +87 -87
  350. package/skills/tdd-workflow/SKILL.md +583 -583
  351. package/skills/team-agent-orchestration/SKILL.md +111 -111
  352. package/skills/team-builder/SKILL.md +169 -169
  353. package/skills/terminal-ops/SKILL.md +110 -110
  354. package/skills/tinystruct-patterns/SKILL.md +279 -279
  355. package/skills/tinystruct-patterns/references/architecture.md +90 -90
  356. package/skills/tinystruct-patterns/references/data-handling.md +60 -60
  357. package/skills/tinystruct-patterns/references/database.md +99 -99
  358. package/skills/tinystruct-patterns/references/routing.md +64 -64
  359. package/skills/tinystruct-patterns/references/system-usage.md +97 -97
  360. package/skills/tinystruct-patterns/references/testing.md +72 -72
  361. package/skills/token-budget-advisor/SKILL.md +134 -134
  362. package/skills/ui-demo/SKILL.md +466 -466
  363. package/skills/ui-to-vue/SKILL.md +135 -135
  364. package/skills/uncloud/SKILL.md +344 -344
  365. package/skills/unified-memory/SKILL.md +170 -170
  366. package/skills/unified-notifications-ops/SKILL.md +188 -188
  367. package/skills/verification-loop/SKILL.md +129 -129
  368. package/skills/video-editing/SKILL.md +311 -311
  369. package/skills/videodb/SKILL.md +375 -375
  370. package/skills/visa-doc-translate/SKILL.md +117 -117
  371. package/skills/vite-patterns/SKILL.md +450 -450
  372. package/skills/vue-patterns/SKILL.md +471 -471
  373. package/skills/windows-desktop-e2e/SKILL.md +888 -888
  374. package/skills/workspace-surface-audit/SKILL.md +126 -126
  375. package/skills/x-api/SKILL.md +235 -235
@@ -1,820 +1,820 @@
1
- ---
2
- name: generating-python-installer
3
- description: "Commercial-grade Python installer expert for Windows: Nuitka extreme compilation, dist slimming, DLL footprint analysis, and Inno Setup packaging to ship the smallest, fastest installers. Use only for advanced packaging/optimization (minimal size, fast startup), not basic script-to-exe conversion. 中文触发:Nuitka 极限优化、Python 商业打包、极限编译 Python、dist 瘦身、DLL 分析、最小安装包、最快启动、商业级打包风格"
4
- ---
5
-
6
- # Generating Python Installer (Commercial-Grade)
7
-
8
- You are a **Python commercial deployment expert**. Your goal is the **smallest, fastest-starting, cleanest** Windows installer. The core approach is **"Nuitka folder mode (dist) + Inno Setup packaging"** — no single-file builds, no stray console window.
9
-
10
- ## When to Activate
11
-
12
- Activate when the user explicitly asks for **advanced** Python packaging or size/startup optimization on Windows:
13
-
14
- - Nuitka extreme / commercial-grade compilation, smallest-size or fastest-startup builds
15
- - `dist` folder slimming, DLL footprint analysis, 32-bit vs 64-bit size tradeoffs
16
- - Inno Setup packaging with full metadata and a clean, residue-free uninstall
17
-
18
- This skill targets advanced size/startup optimization — not basic one-file "script to exe" conversion.
19
-
20
- ## How It Works
21
-
22
- 1. **Confirm build parameters** — app name, version, publisher, exe name, source/output dirs, icon. Never auto-fill; ask the user.
23
- 2. **Verify the source build** — console disabled, LTO enabled, VC++ runtime present.
24
- 3. **Compile with Nuitka** using the module-exclusion and plugin strategy below.
25
- 4. **Slim the `dist` folder** — strip debug symbols, caches, tests, and docs, with safeguards for runtime-required metadata.
26
- 5. **Analyze DLLs** to find and trim the largest dependencies.
27
- 6. **Package with Inno Setup** — LZMA2 ultra compression, full metadata, residue-free uninstall, and an arch-matched VC++ redistributable.
28
-
29
- ## Examples
30
-
31
- - "用 Nuitka 把这个 PySide2 项目打成最小体积的商业安装包" → run the full workflow: recommend 32-bit, exclude WebEngine/3D/Charts, slim `dist`, package with Inno Setup.
32
- - "我的 exe 有 400 MB,怎么瘦身到一半" → analyze DLLs, switch to `opencv-python-headless`, drop `opengl32sw`, apply `dist` slimming.
33
- - "安装后在纯净系统打不开" → ensure the matching-arch VC++ redistributable is bundled in the Inno Setup script.
34
-
35
- ---
36
-
37
- ## 核心理念
38
-
39
- 坚持 **"Nuitka 文件夹模式(dist) + Inno Setup 封装"** 方案。拒绝单文件版,拒绝黑窗。
40
-
41
- ---
42
-
43
- ## 实战参考案例(生产级 PySide2 桌面应用,323 MB,含 OpenCV / Playwright)
44
-
45
- ### 项目概况
46
- - **总体积**: 323 MB
47
- - **打包工具**: PyInstaller 4.7 (32位)
48
- - **主要依赖**: PySide2 (22.52 MB), OpenCV (62.38 MB), Playwright (76.74 MB)
49
- - **Python 版本**: Python 3.8 (32位)
50
- - **DLL 数量**: 71 个,总计 93.23 MB
51
-
52
- ### 关键优化策略
53
- 1. PASS: **使用 32 位 Python** → 体积减少 20-30%
54
- 2. PASS: **base_library.zip 压缩标准库** → 0.74 MB
55
- 3. PASS: **精简模块排除** → 无 pytest/unittest/setuptools
56
- 4. PASS: **精简 Qt 插件** → 只保留必要插件
57
-
58
- ### 体积分布
59
-
60
- | 组件 | 体积 | 占比 | 优化建议 |
61
- |------|------|------|---------|
62
- | playwright | 76.74 MB | 23.8% | 非必要可移除 |
63
- | OpenCV | 62.38 MB | 19.3% | 用 opencv-python-headless |
64
- | PySide2 | 22.52 MB | 7.0% | 排除 WebEngine/3D/Charts |
65
- | 其他依赖 | 161.36 MB | 49.9% | - |
66
-
67
- ### 预期效果对比
68
-
69
- | 项目类型 | Nuitka 原始 | 优化后 | 参考项目实测 |
70
- |---------|------------|--------|----------------|
71
- | Tkinter + 标准库 | 150-250 MB | **80-120 MB** | - |
72
- | PyQt/PySide | 200-400 MB | **120-250 MB** | 323 MB (含 OpenCV 等) |
73
- | 含 numpy/pandas | 300-600 MB | **180-350 MB** | - |
74
-
75
- ---
76
-
77
- ## 核心工作流 (Workflow) - WARNING: 严格执行
78
-
79
- 当用户请求打包时,按照以下步骤操作:
80
-
81
- **步骤 1:强制参数确认(FAIL: 禁止使用默认值)**
82
-
83
- > **WARNING: 重要规则:以下所有参数必须逐一向用户确认,禁止自动填充或使用默认值!**
84
-
85
- 必须向用户询问并确认以下信息(*等待用户明确回复后才能继续*):
86
-
87
- | 参数 | 说明 | 示例 |
88
- |------|------|------|
89
- | **软件名称** (App Name) | 软件显示名称 | `红墨批注` |
90
- | **版本号** (Version) | 语义化版本号 | `1.0.0` |
91
- | **发布者/公司名** (Publisher) | 控制面板显示的发布者 | `YourCompany` |
92
- | **主程序** (Exe Name) | 主可执行文件名 | `RedInk.exe` |
93
- | **源路径** (Source Dir) | Nuitka dist 文件夹绝对路径 | `D:\project\dist` |
94
- | **输出路径** (Output Dir) | 安装包生成位置 | `D:\project\output` |
95
- | **图标路径** (Icon Path) | .ico 文件绝对路径(可选但推荐) | `D:\project\icon.ico` |
96
- | **官网地址** (URL) | 可选,用于控制面板链接 | `https://example.com` |
97
-
98
- **询问模板:**
99
- > "请提供以下打包参数,我需要您逐一确认:
100
- > 1. 软件名称:
101
- > 2. 版本号:
102
- > 3. 发布者/公司名:
103
- > 4. 主程序文件名(如 xxx.exe):
104
- > 5. 源路径(Nuitka dist 文件夹):
105
- > 6. 输出路径(安装包保存位置):
106
- > 7. 图标路径(.ico 文件,可留空):
107
- > 8. 官网地址(可留空):
108
- >
109
- > 请逐一填写,或回复"跳过"表示使用空值。"
110
-
111
- **步骤 2:源文件质量与编译检查(关键)**
112
- 在生成代码之前,必须向用户发出以下**关键确认**(因为 Inno Setup 只是打包工具,无法改变程序本身的运行属性):
113
-
114
- > "WARNING: **编译参数检查**:
115
- > 1. **去黑窗**:请确认您的 dist 文件夹是使用 `nuitka --windows-console-mode=disable` 编译的。(否则安装后依然会有黑框)
116
- > 2. **高性能**:请确认是否使用了 `--lto=yes`。(否则启动速度可能不理想)
117
- > 3. **运行库**:请确保 dist 文件夹内已包含必要的 VC++ 运行库,防止在纯净系统上无法运行。
118
- >
119
- > **确认源文件已准备好请回复"确认",否则请先重新编译。**"
120
-
121
- **步骤 3:生成代码**
122
- 用户确认后,输出包含 **完整元数据** 和 **卸载图标修复** 的代码。
123
-
124
- ---
125
-
126
- ## Nuitka 极限优化编译(基于 参考项目经验)
127
-
128
- ### 一、32 位 vs 64 位选择策略
129
-
130
- **参考项目使用 32 位 Python 的原因**:
131
-
132
- | 组件 | 64位体积 | 32位体积 | 节省 |
133
- |------|---------|---------|------|
134
- | python3x.dll | ~4.5 MB | ~3.8 MB | 15% |
135
- | Qt5Core.dll | ~8 MB | ~5 MB | 37% |
136
- | numpy | ~30 MB | ~20 MB | 33% |
137
- | **总体** | 基准 | **-20~30%** | - |
138
-
139
- **推荐使用 32 位条件**:
140
- - PASS: 程序内存占用 < 2GB
141
- - PASS: 不处理超大文件(< 2GB)
142
- - PASS: 目标用户是普通办公电脑
143
-
144
- **32 位编译方法**:
145
- ```bash
146
- # 1. 安装 32 位 Python(和 64 位可以共存)
147
- # 下载地址:https://www.python.org/downloads/windows/
148
-
149
- # 2. 用 32 位 Python 安装依赖
150
- py -3.12-32 -m pip install -r requirements.txt
151
-
152
- # 3. 用 32 位 Python 编译
153
- py -3.12-32 -m nuitka --standalone ...你的参数
154
- ```
155
-
156
- ### 二、模块排除清单(参考项目验证过的)
157
-
158
- **安全排除列表**(运行时不需要):
159
- ```
160
- unittest,test,pytest,_pytest,doctest,pdb,pdbpp,
161
- setuptools,pip,distutils,pkg_resources,
162
- email.mime,http.server,xmlrpc,pydoc
163
- ```
164
-
165
- **预期效果**:节省 **30-50 MB**
166
-
167
- ### 三、GUI 框架专用优化
168
-
169
- #### Tkinter 极限优化(推荐,最轻量)
170
- ```bash
171
- nuitka --standalone --windows-console-mode=disable ^
172
- --lto=yes ^
173
- --jobs=8 ^
174
- --enable-plugin=tk-inter ^
175
- --enable-plugin=anti-bloat ^
176
- --noinclude-pytest-mode=nofollow ^
177
- --noinclude-setuptools-mode=nofollow ^
178
- --nofollow-import-to=unittest,test,pytest,_pytest,doctest,pdb,pdbpp ^
179
- --nofollow-import-to=setuptools,pip,distutils,pkg_resources ^
180
- --nofollow-import-to=email.mime,http.server,xmlrpc,pydoc ^
181
- --python-flag=no_docstrings ^
182
- --output-dir=dist ^
183
- --windows-icon-from-ico=icon.ico ^
184
- --remove-output ^
185
- main.py
186
- ```
187
-
188
- **预期体积**:80-120 MB(优化后)
189
-
190
- #### PyQt5 / PySide2 优化
191
- ```bash
192
- nuitka --standalone --windows-console-mode=disable ^
193
- --lto=yes ^
194
- --jobs=8 ^
195
- --enable-plugin=pyqt5 ^
196
- --enable-plugin=anti-bloat ^
197
- --noinclude-pytest-mode=nofollow ^
198
- --noinclude-setuptools-mode=nofollow ^
199
- --nofollow-import-to=unittest,test,pytest,_pytest,doctest,pdb ^
200
- --nofollow-import-to=setuptools,pip,distutils,pkg_resources ^
201
- --nofollow-import-to=PyQt5.QtWebEngine,PyQt5.QtWebEngineWidgets ^
202
- --nofollow-import-to=PyQt5.Qt3D,PyQt5.QtCharts ^
203
- --python-flag=no_docstrings ^
204
- --include-qt-plugins=sensible,styles,platforms ^
205
- --output-dir=dist ^
206
- --windows-icon-from-ico=icon.ico ^
207
- --remove-output ^
208
- main.py
209
- ```
210
-
211
- **预期体积**:120-250 MB(优化后)
212
-
213
- ### 四、一键编译脚本模板
214
-
215
- **保存为 `build_optimized.bat`(项目根目录)**:
216
-
217
- ```batch
218
- @echo off
219
- chcp 65001 >nul
220
- setlocal enabledelayedexpansion
221
-
222
- echo ========================================
223
- echo Nuitka 极限优化编译(参考 参考项目)
224
- echo ========================================
225
-
226
- REM === 配置区域(请修改为你的实际值) ===
227
- set APP_NAME=你的软件名
228
- set MAIN_FILE=main.py
229
- set ICON_FILE=icon.ico
230
-
231
- REM === 自动检测 CPU 核心数 ===
232
- REM 用 Windows 自带环境变量(wmic 在 Win11 22H2+ 已移除,探不到会让 --jobs=0 单线程编译)
233
- set CPU_CORES=%NUMBER_OF_PROCESSORS%
234
- if not defined CPU_CORES set CPU_CORES=4
235
- set /a BUILD_JOBS=%CPU_CORES%
236
-
237
- REM === 参考项目的模块排除清单 ===
238
- set EXCLUDE_MODULES=unittest,test,pytest,_pytest,doctest,pdb,pdbpp
239
- set EXCLUDE_MODULES=%EXCLUDE_MODULES%,setuptools,pip,distutils,pkg_resources
240
- set EXCLUDE_MODULES=%EXCLUDE_MODULES%,email.mime,http.server,xmlrpc,pydoc
241
-
242
- echo.
243
- echo [1/4] 清理旧编译...
244
- if exist dist rd /s /q dist
245
- if exist build rd /s /q build
246
-
247
- echo.
248
- echo [2/4] Nuitka 编译中(应用 参考项目优化策略)...
249
- echo - CPU 核心: %CPU_CORES% (使用 %BUILD_JOBS% 线程)
250
- echo - 模块排除: %EXCLUDE_MODULES%
251
- echo.
252
-
253
- nuitka --standalone ^
254
- --windows-console-mode=disable ^
255
- --lto=yes ^
256
- --jobs=%BUILD_JOBS% ^
257
- --enable-plugin=anti-bloat ^
258
- --enable-plugin=tk-inter ^
259
- --noinclude-pytest-mode=nofollow ^
260
- --noinclude-setuptools-mode=nofollow ^
261
- --nofollow-import-to=%EXCLUDE_MODULES% ^
262
- --python-flag=no_docstrings ^
263
- --output-dir=dist ^
264
- --windows-icon-from-ico=%ICON_FILE% ^
265
- --remove-output ^
266
- %MAIN_FILE%
267
-
268
- if %errorlevel% neq 0 (
269
- echo.
270
- echo [错误] 编译失败!
271
- pause
272
- exit /b 1
273
- )
274
-
275
- echo.
276
- echo [3/4] 统计编译结果...
277
- for /f %%a in ('powershell -NoProfile -Command "(Get-ChildItem -LiteralPath 'dist\%APP_NAME%.dist' -Recurse -File | Measure-Object -Property Length -Sum).Sum"') do set TOTAL_SIZE=%%a
278
- set TOTAL_SIZE=%TOTAL_SIZE:,=%
279
- set /a SIZE_MB=%TOTAL_SIZE% / 1048576
280
- echo - 编译后体积: %SIZE_MB% MB
281
-
282
- echo.
283
- echo [4/4] 执行瘦身清理(参考 参考项目策略)...
284
- powershell -ExecutionPolicy Bypass -File slim_dist.ps1 -DistPath "dist\%APP_NAME%.dist"
285
-
286
- echo.
287
- echo ========================================
288
- echo 编译完成!
289
- echo ========================================
290
- pause
291
- ```
292
-
293
- ### 五、dist 瘦身脚本(参考项目级别清理)
294
-
295
- **保存为 `slim_dist.ps1`(和 build_optimized.bat 同目录)**:
296
-
297
- ```powershell
298
- param(
299
- [string]$DistPath
300
- )
301
-
302
- $ErrorActionPreference = "Continue" # 不静默吞错:删除失败会显示出来,避免假成功
303
-
304
- Write-Host "`n========================================" -ForegroundColor Cyan
305
- Write-Host "dist 瘦身清理(参考 参考项目策略)" -ForegroundColor Cyan
306
- Write-Host "========================================" -ForegroundColor Cyan
307
-
308
- if (-not (Test-Path $DistPath)) {
309
- Write-Host "[错误] 找不到目录: $DistPath" -ForegroundColor Red
310
- exit 1
311
- }
312
-
313
- # 统计初始体积
314
- $InitialSize = (Get-ChildItem -Path $DistPath -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
315
- Write-Host "`n初始体积: $([math]::Round($InitialSize, 2)) MB" -ForegroundColor Yellow
316
-
317
- # 参考项目特征:没有 .pdb, .pyi, __pycache__, test 等
318
- Write-Host "`n[应用 参考项目的清理策略...]" -ForegroundColor Green
319
-
320
- # 1. 删除调试符号
321
- Write-Host "`n[1/7] 删除 .pdb 调试符号..." -ForegroundColor Green
322
- $pdbFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pdb -File
323
- $pdbSize = ($pdbFiles | Measure-Object -Property Length -Sum).Sum / 1MB
324
- if ($pdbFiles.Count -gt 0) {
325
- $pdbFiles | Remove-Item -Force
326
- Write-Host " 删除 $($pdbFiles.Count) 个文件,节省 $([math]::Round($pdbSize, 2)) MB"
327
- } else {
328
- Write-Host " 未发现 .pdb 文件(已优化)" -ForegroundColor Gray
329
- }
330
-
331
- # 2. 删除类型提示
332
- Write-Host "`n[2/7] 删除 .pyi 类型提示..." -ForegroundColor Green
333
- $pyiFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pyi -File
334
- $pyiSize = ($pyiFiles | Measure-Object -Property Length -Sum).Sum / 1MB
335
- if ($pyiFiles.Count -gt 0) {
336
- $pyiFiles | Remove-Item -Force
337
- Write-Host " 删除 $($pyiFiles.Count) 个文件,节省 $([math]::Round($pyiSize, 2)) MB"
338
- } else {
339
- Write-Host " 未发现 .pyi 文件(已优化)" -ForegroundColor Gray
340
- }
341
-
342
- # 3. 删除 __pycache__
343
- Write-Host "`n[3/7] 删除 __pycache__ 缓存..." -ForegroundColor Green
344
- $pycacheDirs = Get-ChildItem -Path $DistPath -Recurse -Directory -Filter "__pycache__"
345
- $pycacheSize = 0
346
- foreach ($dir in $pycacheDirs) {
347
- $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
348
- $pycacheSize += $size
349
- Remove-Item -Path $dir.FullName -Recurse -Force
350
- }
351
- if ($pycacheDirs.Count -gt 0) {
352
- Write-Host " 删除 $($pycacheDirs.Count) 个目录,节省 $([math]::Round($pycacheSize / 1MB, 2)) MB"
353
- } else {
354
- Write-Host " 未发现 __pycache__(已优化)" -ForegroundColor Gray
355
- }
356
-
357
- # 4. 删除测试目录
358
- Write-Host "`n[4/7] 删除 test/tests 测试目录..." -ForegroundColor Green
359
- $testDirs = Get-ChildItem -Path $DistPath -Recurse -Directory | Where-Object { $_.Name -match '^tests?$' }
360
- $testSize = 0
361
- foreach ($dir in $testDirs) {
362
- $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
363
- $testSize += $size
364
- Remove-Item -Path $dir.FullName -Recurse -Force
365
- }
366
- if ($testDirs.Count -gt 0) {
367
- Write-Host " 删除 $($testDirs.Count) 个目录,节省 $([math]::Round($testSize / 1MB, 2)) MB"
368
- } else {
369
- Write-Host " 未发现测试目录(已优化)" -ForegroundColor Gray
370
- }
371
-
372
- # 5. 删除文档和示例
373
- Write-Host "`n[5/7] 删除 docs/examples 文档目录..." -ForegroundColor Green
374
- $docDirs = Get-ChildItem -Path $DistPath -Recurse -Directory | Where-Object { $_.Name -match '^(docs|examples|samples|demo)$' }
375
- $docSize = 0
376
- foreach ($dir in $docDirs) {
377
- $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
378
- $docSize += $size
379
- Remove-Item -Path $dir.FullName -Recurse -Force
380
- }
381
- if ($docDirs.Count -gt 0) {
382
- Write-Host " 删除 $($docDirs.Count) 个目录,节省 $([math]::Round($docSize / 1MB, 2)) MB"
383
- } else {
384
- Write-Host " 未发现文档目录(已优化)" -ForegroundColor Gray
385
- }
386
-
387
- # 6. 删除 .pyc 文件
388
- Write-Host "`n[6/7] 删除 .pyc 字节码..." -ForegroundColor Green
389
- $pycFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pyc -File
390
- $pycSize = ($pycFiles | Measure-Object -Property Length -Sum).Sum / 1MB
391
- if ($pycFiles.Count -gt 0) {
392
- $pycFiles | Remove-Item -Force
393
- Write-Host " 删除 $($pycFiles.Count) 个文件,节省 $([math]::Round($pycSize, 2)) MB"
394
- } else {
395
- Write-Host " 未发现 .pyc 文件(已优化)" -ForegroundColor Gray
396
- }
397
-
398
- # 7. 精简 .dist-info 元数据
399
- Write-Host "`n[7/7] 精简 .dist-info 元数据..." -ForegroundColor Green
400
- $distInfoDirs = Get-ChildItem -Path $DistPath -Recurse -Directory -Filter "*.dist-info"
401
- $removedCount = 0
402
- $removedSize = 0
403
- foreach ($infoDir in $distInfoDirs) {
404
- # 仅删安装期记账文件;保留 METADATA 与 entry_points.txt(运行期被 importlib.metadata 读取,删除会破坏插件发现)
405
- $filesToRemove = @("RECORD", "INSTALLER", "direct_url.json")
406
- foreach ($fileName in $filesToRemove) {
407
- $file = Join-Path $infoDir.FullName $fileName
408
- if (Test-Path $file) {
409
- $size = (Get-Item $file).Length
410
- $removedSize += $size
411
- Remove-Item $file -Force
412
- $removedCount++
413
- }
414
- }
415
- }
416
- if ($removedCount -gt 0) {
417
- Write-Host " 删除 $removedCount 个元数据文件,节省 $([math]::Round($removedSize / 1MB, 2)) MB"
418
- } else {
419
- Write-Host " 未发现可清理的元数据(已优化)" -ForegroundColor Gray
420
- }
421
-
422
- # 统计最终体积
423
- $FinalSize = (Get-ChildItem -Path $DistPath -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
424
- $SavedSize = $InitialSize - $FinalSize
425
- $SavedPercent = if ($InitialSize -gt 0) { ($SavedSize / $InitialSize) * 100 } else { 0 }
426
-
427
- Write-Host "`n========================================" -ForegroundColor Cyan
428
- Write-Host "清理完成!" -ForegroundColor Green
429
- Write-Host "========================================" -ForegroundColor Cyan
430
- Write-Host "初始体积: $([math]::Round($InitialSize, 2)) MB" -ForegroundColor Yellow
431
- Write-Host "最终体积: $([math]::Round($FinalSize, 2)) MB" -ForegroundColor Green
432
- Write-Host "节省空间: $([math]::Round($SavedSize, 2)) MB ($([math]::Round($SavedPercent, 1))%)" -ForegroundColor Cyan
433
- Write-Host "========================================`n" -ForegroundColor Cyan
434
-
435
- # 对比 参考项目
436
- Write-Host "[对比参考]" -ForegroundColor Yellow
437
- Write-Host "参考项目总体积: 323 MB (包含 PyQt, OpenCV, Playwright 等重量级库)" -ForegroundColor Gray
438
- Write-Host "如果你的项目是纯 Tkinter + 标准库,目标应该在 80-150 MB" -ForegroundColor Gray
439
- ```
440
-
441
- **预期效果**:节省 **15-30%** 体积
442
-
443
- ### 六、DLL 依赖分析工具
444
-
445
- **保存为 `analyze_dlls.py`(用于找出体积大户)**:
446
-
447
- ```python
448
- """
449
- DLL 依赖分析工具
450
- 参考 参考项目的 DLL 管理策略,帮助识别体积大户和优化建议
451
- """
452
- import sys
453
- from pathlib import Path
454
-
455
- def analyze_dlls(dist_path: str):
456
- """分析 dist 目录中的 DLL 依赖"""
457
- dist_dir = Path(dist_path)
458
-
459
- if not dist_dir.exists():
460
- print(f"[错误] 目录不存在: {dist_path}")
461
- return
462
-
463
- print("=" * 70)
464
- print("DLL 依赖分析(参考 参考项目策略)")
465
- print("=" * 70)
466
-
467
- # 收集所有 DLL
468
- dll_files = list(dist_dir.rglob("*.dll"))
469
-
470
- if not dll_files:
471
- print("\n未发现 DLL 文件")
472
- return
473
-
474
- # 按大小排序
475
- dll_data = [(dll, dll.stat().st_size) for dll in dll_files]
476
- dll_data.sort(key=lambda x: x[1], reverse=True)
477
-
478
- total_size = sum(size for _, size in dll_data)
479
-
480
- print(f"\n总 DLL 数量: {len(dll_files)}")
481
- print(f"总 DLL 体积: {total_size / 1024 / 1024:.2f} MB\n")
482
-
483
- # 参考项目对比
484
- print("[对比参考] 参考项目的 DLL 情况:")
485
- print(" - 总数量: 71 个")
486
- print(" - 总体积: 93.23 MB")
487
- print(" - 最大的: libopenblas (26.85 MB), opengl32sw (15.25 MB)\n")
488
-
489
- # 分析大于 3MB 的 DLL
490
- large_dlls = [(dll, size) for dll, size in dll_data if size > 3 * 1024 * 1024]
491
-
492
- if large_dlls:
493
- print("=" * 70)
494
- print("WARNING: 大于 3MB 的 DLL(需重点关注)")
495
- print("=" * 70)
496
-
497
- for dll, size in large_dlls:
498
- size_mb = size / 1024 / 1024
499
- relative_path = dll.relative_to(dist_dir)
500
- name_lower = dll.name.lower()
501
-
502
- print(f"\n{size_mb:8.2f} MB {dll.name}")
503
- print(f" 位置: {relative_path.parent}")
504
-
505
- # 优化建议
506
- suggestions = get_optimization_suggestion(name_lower)
507
- if suggestions:
508
- for suggestion in suggestions:
509
- print(f" {suggestion}")
510
-
511
- # 检查冗余 DLL
512
- print("\n" + "=" * 70)
513
- print(" 冗余检查")
514
- print("=" * 70)
515
-
516
- # 检查调试版本
517
- debug_dlls = [dll for dll, _ in dll_data if dll.stem.endswith('d')]
518
- if debug_dlls:
519
- print(f"\nWARNING: 发现 {len(debug_dlls)} 个调试版本 DLL(可以删除):")
520
- for dll in debug_dlls:
521
- print(f" - {dll.name}")
522
- else:
523
- print("\nPASS: 未发现调试版本 DLL(已优化)")
524
-
525
- # VC++ Runtime
526
- vc_runtimes = [dll for dll, _ in dll_data if 'vcruntime' in dll.name.lower() or 'msvcp' in dll.name.lower()]
527
- if vc_runtimes:
528
- print(f"\n[VC++ Runtime 库] 发现 {len(vc_runtimes)} 个:")
529
- for dll in vc_runtimes:
530
- size_mb = dll.stat().st_size / 1024 / 1024
531
- print(f" - {dll.name} ({size_mb:.2f} MB)")
532
- print(" 这些是必需的,参考项目也包含了这些文件")
533
-
534
- # 全部 DLL 列表
535
- print("\n" + "=" * 70)
536
- print(" 完整 DLL 列表(按体积排序,前 20)")
537
- print("=" * 70)
538
- print(f"\n{'体积 (MB)':>10} {'文件名':<30} 位置")
539
- print("-" * 70)
540
-
541
- for dll, size in dll_data[:20]:
542
- size_mb = size / 1024 / 1024
543
- relative_path = dll.relative_to(dist_dir)
544
- location = str(relative_path.parent) if relative_path.parent != Path('.') else "根目录"
545
- print(f"{size_mb:10.2f} {dll.name:<30} {location}")
546
-
547
- if len(dll_data) > 20:
548
- remaining_size = sum(size for _, size in dll_data[20:]) / 1024 / 1024
549
- print(f"... 还有 {len(dll_data) - 20} 个 DLL,共 {remaining_size:.2f} MB")
550
-
551
-
552
- def get_optimization_suggestion(dll_name: str) -> list:
553
- """根据 DLL 名称给出优化建议"""
554
- suggestions = []
555
-
556
- if "openblas" in dll_name or "mkl" in dll_name:
557
- suggestions.append("数学运算库,参考项目的 libopenblas 有 26.85 MB")
558
- suggestions.append("如不需要高性能计算可考虑轻量版")
559
-
560
- elif "opencv" in dll_name or "ffmpeg" in dll_name:
561
- suggestions.append("OpenCV 相关,参考项目的 opencv_videoio_ffmpeg 有 18.48 MB")
562
- suggestions.append("考虑用 opencv-python-headless")
563
-
564
- elif "qt5" in dll_name or "qt6" in dll_name or "pyside" in dll_name:
565
- suggestions.append("Qt 库,参考项目的 Qt5Core 有 5.13 MB")
566
- suggestions.append("可排除不需要的模块(WebEngine, 3D, Charts)")
567
-
568
- elif "opengl" in dll_name and "sw" in dll_name:
569
- suggestions.append("OpenGL 软件渲染器,参考项目保留了 15.25 MB")
570
- suggestions.append("通常可以删除(使用硬件渲染)")
571
-
572
- elif "d3dcompiler" in dll_name:
573
- suggestions.append("DirectX 编译器,参考项目有 3.53 MB")
574
-
575
- elif "mfc140" in dll_name:
576
- suggestions.append("MFC 库,参考项目有 4.89 MB")
577
-
578
- return suggestions
579
-
580
-
581
- if __name__ == "__main__":
582
- if len(sys.argv) < 2:
583
- print("用法: python analyze_dlls.py <dist目录路径>")
584
- print("示例: python analyze_dlls.py dist/main.dist")
585
- sys.exit(1)
586
-
587
- analyze_dlls(sys.argv[1])
588
- ```
589
-
590
- **使用方法**:
591
- ```bash
592
- python analyze_dlls.py dist/你的软件名.dist
593
- ```
594
-
595
- ---
596
-
597
- ## 完整优化工作流
598
-
599
- ### 步骤 1:修改编译脚本配置
600
-
601
- 编辑 `build_optimized.bat`,修改这 3 行:
602
-
603
- ```batch
604
- set APP_NAME=你的软件名 REM 改成实际名称
605
- set MAIN_FILE=main.py REM 你的主程序文件
606
- set ICON_FILE=icon.ico REM 你的图标文件
607
- ```
608
-
609
- ### 步骤 2:一键编译+瘦身
610
-
611
- ```bash
612
- # 在项目根目录执行
613
- build_optimized.bat
614
- ```
615
-
616
- ### 步骤 3:分析 DLL 依赖
617
-
618
- ```bash
619
- python analyze_dlls.py dist/你的软件名.dist
620
- ```
621
-
622
- ### 步骤 4:根据分析结果优化
623
-
624
- **如果用了 OpenCV** → 改用无头版
625
- ```bash
626
- pip uninstall opencv-python
627
- pip install opencv-python-headless
628
- ```
629
-
630
- **如果用了 Qt** → 排除不需要的模块
631
- ```batch
632
- # 在编译命令中添加
633
- --nofollow-import-to=PyQt5.QtWebEngine,PyQt5.Qt3D,PyQt5.QtCharts
634
- ```
635
-
636
- **删除软件渲染器**(如果不需要)
637
- ```powershell
638
- # 在 dist 目录执行
639
- Remove-Item "opengl32sw.dll" -Force
640
- ```
641
-
642
- ---
643
-
644
- ## VC++ 运行库处理方案
645
-
646
- ### 方案一:静态链接(推荐)
647
- ```bash
648
- nuitka --static-libpython=yes ...
649
- ```
650
-
651
- ### 方案二:捆绑运行库安装(商业发布推荐)
652
- 在 Inno Setup 脚本中添加:
653
-
654
- ```iss
655
- ; WARNING: VC++ 运行库架构必须与 Python/Nuitka 构建架构一致。
656
- ; 本 skill 推荐 32 位 Python,故默认捆绑 vc_redist.x86.exe;
657
- ; 若用 64 位 Python 编译,请把下面两处改为 vc_redist.x64.exe。
658
- [Files]
659
- Source: "{#MySourceDir}\..\vc_redist.x86.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
660
-
661
- [Run]
662
- Filename: "{tmp}\vc_redist.x86.exe"; Parameters: "/quiet /norestart"; StatusMsg: "正在安装运行库..."; Flags: waituntilterminated
663
- ```
664
-
665
- > 下载地址:[Microsoft Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist)
666
-
667
- ---
668
-
669
- ## Inno Setup 脚本模板(商业终极版)
670
-
671
- ```iss
672
- ; =====================================================================
673
- ; WARNING: 商业级 Python 安装脚本 (Inno Setup 6.x)
674
- ; 特性:LZMA2 极限压缩 | 全中文 | 完整元数据 | 无残留卸载
675
- ; 参考:参考项目(323 MB, LZMA2 压缩)
676
- ; =====================================================================
677
-
678
- ; --- 1. 参数定义 ---
679
- #define MyAppName "{{APP_NAME}}"
680
- #define MyAppVersion "{{APP_VERSION}}"
681
- #define MyAppPublisher "{{PUBLISHER}}"
682
- #define MyAppURL "{{APP_URL}}"
683
- #define MyAppExeName "{{EXE_NAME}}"
684
- #define MySourceDir "{{SOURCE_DIR}}"
685
- #define MyOutputDir "{{OUTPUT_DIR}}"
686
- ;#define MyIconPath "{{ICON_PATH}}"
687
-
688
- [Setup]
689
- ; --- 身份识别 ---
690
- AppId={{GENERATE_RANDOM_GUID}}
691
- AppName={#MyAppName}
692
- AppVersion={#MyAppVersion}
693
- AppPublisher={#MyAppPublisher}
694
- AppPublisherURL={#MyAppURL}
695
- AppSupportURL={#MyAppURL}
696
- AppUpdatesURL={#MyAppURL}
697
-
698
- ; --- 安装路径与权限 ---
699
- DefaultDirName={autopf}\{#MyAppName}
700
- DefaultGroupName={#MyAppName}
701
- DisableDirPage=no
702
- DisableProgramGroupPage=no
703
- PrivilegesRequired=admin
704
-
705
- ; --- 输出设置 ---
706
- OutputDir={#MyOutputDir}
707
- OutputBaseFilename=Setup_{#MyAppName}_v{#MyAppVersion}
708
-
709
- ; --- 视觉体验 ---
710
- WizardStyle=modern
711
- #ifdef MyIconPath
712
- SetupIconFile={#MyIconPath}
713
- UninstallDisplayIcon={app}\{#MyAppExeName}
714
- #endif
715
-
716
- ; --- 核心压缩 (参考 参考项目) ---
717
- Compression=lzma2/ultra64
718
- SolidCompression=yes
719
- LZMAUseSeparateProcess=yes
720
-
721
- ; --- 架构 ---
722
- ; 注意:仅 64 位 Python 构建才设此项。本 skill 推荐 32 位 Python——
723
- ; 32 位构建请保持注释,使应用按 32 位安装并与上面捆绑的 vc_redist.x86.exe 匹配。
724
- ; 仅当用 64 位 Python 编译时才取消注释。
725
- ;ArchitecturesInstallIn64BitMode=x64compatible
726
-
727
- [Languages]
728
- Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
729
-
730
- [Files]
731
- Source: "{#MySourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
732
-
733
- [UninstallDelete]
734
- Type: filesandordirs; Name: "{app}\*"
735
-
736
- [Icons]
737
- Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
738
- Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
739
- Name: "{group}\卸载 {#MyAppName}"; Filename: "{uninstallexe}"
740
-
741
- [Tasks]
742
- Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
743
-
744
- [Run]
745
- Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
746
- ```
747
-
748
- ---
749
-
750
- ## 占位符说明
751
-
752
- | 占位符 | 说明 | 示例值 |
753
- |--------|------|--------|
754
- | `{{APP_NAME}}` | 软件显示名称 | `红墨批注` |
755
- | `{{APP_VERSION}}` | 版本号 | `1.0.0` |
756
- | `{{PUBLISHER}}` | 发布者/公司名 | `MyCompany` |
757
- | `{{APP_URL}}` | 官网地址 | `https://example.com` |
758
- | `{{EXE_NAME}}` | 主程序文件名 | `RedInk.exe` |
759
- | `{{SOURCE_DIR}}` | Nuitka dist 文件夹路径 | `D:\project\dist\RedInk.dist` |
760
- | `{{OUTPUT_DIR}}` | 安装包输出路径 | `D:\project\output` |
761
- | `{{ICON_PATH}}` | 图标文件路径 | `D:\project\icon.ico` |
762
- | `{{GENERATE_RANDOM_GUID}}` | **需生成唯一GUID** | 使用 Inno Setup "Tools > Generate GUID" |
763
-
764
- ---
765
-
766
- ## 常见问题 (FAQ)
767
-
768
- ### Q1: 安装后双击程序无反应?
769
- 1. 打开 CMD,手动运行 exe 查看错误信息
770
- 2. 检查是否缺少 VC++ 运行库
771
- 3. 检查 Nuitka 编译是否成功
772
-
773
- ### Q2: 安装包体积过大?
774
- **优化方法**:
775
- 1. 使用 32 位 Python 编译(节省 20-30%)
776
- 2. 应用 参考项目的模块排除清单
777
- 3. 启用 Anti-Bloat 插件
778
- 4. 执行 dist 文件夹瘦身脚本
779
- 5. 分析 DLL,移除不必要的大文件
780
-
781
- ### Q3: 杀毒软件误报?
782
- **解决方案**:
783
- - 提交到主流杀毒厂商进行白名单申请
784
- - 购买代码签名证书(推荐:Sectigo, DigiCert)
785
- - 避免使用 UPX 压缩
786
-
787
- ### Q4: 安装时提示 Windows 已保护你的电脑?
788
- - 购买 EV 代码签名证书(可立即获得信任)
789
- - 普通代码签名证书需要积累安装量后逐渐获得信任
790
-
791
- ---
792
-
793
- ## 实战问题处理记录(更新 2026-02-07)
794
-
795
- - **安装后提示缺少 python3xx.dll**:必须使用 Nuitka `--standalone`;确认 dist 内存在该 dll;不要打单文件版。
796
- - **安装后点击无反应**:GUI 启动期可能被重依赖阻塞;将重依赖延迟到"开始导出"再 import;添加日志排查。
797
- - **Nuitka + MinGW 在非 ASCII 路径报错**:把源码复制到 ASCII 目录再编译;设置 `PYTHONIOENCODING=utf-8`。
798
- - **Inno Setup 警告 `x64` 已弃用(仅 64 位构建需要 64 位安装模式时)**:改为 `ArchitecturesInstallIn64BitMode=x64compatible`;32 位构建无需此项。
799
- - **`--disable-console` 已废弃**:改用 `--windows-console-mode=disable`。
800
- - **dist 出现 `_nuitka_temp.exe`**:在 [Files] 中排除它。
801
-
802
- ---
803
-
804
- ## 优化效果预期
805
-
806
- | 优化组合 | 体积减少 | 启动提升 | 风险等级 |
807
- |----------|----------|----------|----------|
808
- | 基础编译 | 基准 | 基准 | 无 |
809
- | + `--lto=yes` | 5-10% | 10-20% | PASS: 无 |
810
- | + anti-bloat | 15-25% | - | PASS: 无 |
811
- | + 模块排除 | 20-35% | 5% | PASS: 无 |
812
- | + dist 瘦身 | 25-40% | - | PASS: 无 |
813
- | + 32 位编译 | 40-60% | - | PASS: 无 |
814
- | **全部组合** | **45-65%** | **15-25%** | PASS: **无风险** |
815
-
816
- > WARNING: **不建议使用 UPX 压缩**,虽然能进一步减小体积,但极易触发杀毒软件误报。
817
-
818
- ---
819
-
820
- **基于 参考项目实战经验优化,助你打造商业级安装包!**
1
+ ---
2
+ name: generating-python-installer
3
+ description: "Commercial-grade Python installer expert for Windows: Nuitka extreme compilation, dist slimming, DLL footprint analysis, and Inno Setup packaging to ship the smallest, fastest installers. Use only for advanced packaging/optimization (minimal size, fast startup), not basic script-to-exe conversion. 中文触发:Nuitka 极限优化、Python 商业打包、极限编译 Python、dist 瘦身、DLL 分析、最小安装包、最快启动、商业级打包风格"
4
+ ---
5
+
6
+ # Generating Python Installer (Commercial-Grade)
7
+
8
+ You are a **Python commercial deployment expert**. Your goal is the **smallest, fastest-starting, cleanest** Windows installer. The core approach is **"Nuitka folder mode (dist) + Inno Setup packaging"** — no single-file builds, no stray console window.
9
+
10
+ ## When to Activate
11
+
12
+ Activate when the user explicitly asks for **advanced** Python packaging or size/startup optimization on Windows:
13
+
14
+ - Nuitka extreme / commercial-grade compilation, smallest-size or fastest-startup builds
15
+ - `dist` folder slimming, DLL footprint analysis, 32-bit vs 64-bit size tradeoffs
16
+ - Inno Setup packaging with full metadata and a clean, residue-free uninstall
17
+
18
+ This skill targets advanced size/startup optimization — not basic one-file "script to exe" conversion.
19
+
20
+ ## How It Works
21
+
22
+ 1. **Confirm build parameters** — app name, version, publisher, exe name, source/output dirs, icon. Never auto-fill; ask the user.
23
+ 2. **Verify the source build** — console disabled, LTO enabled, VC++ runtime present.
24
+ 3. **Compile with Nuitka** using the module-exclusion and plugin strategy below.
25
+ 4. **Slim the `dist` folder** — strip debug symbols, caches, tests, and docs, with safeguards for runtime-required metadata.
26
+ 5. **Analyze DLLs** to find and trim the largest dependencies.
27
+ 6. **Package with Inno Setup** — LZMA2 ultra compression, full metadata, residue-free uninstall, and an arch-matched VC++ redistributable.
28
+
29
+ ## Examples
30
+
31
+ - "用 Nuitka 把这个 PySide2 项目打成最小体积的商业安装包" → run the full workflow: recommend 32-bit, exclude WebEngine/3D/Charts, slim `dist`, package with Inno Setup.
32
+ - "我的 exe 有 400 MB,怎么瘦身到一半" → analyze DLLs, switch to `opencv-python-headless`, drop `opengl32sw`, apply `dist` slimming.
33
+ - "安装后在纯净系统打不开" → ensure the matching-arch VC++ redistributable is bundled in the Inno Setup script.
34
+
35
+ ---
36
+
37
+ ## 核心理念
38
+
39
+ 坚持 **"Nuitka 文件夹模式(dist) + Inno Setup 封装"** 方案。拒绝单文件版,拒绝黑窗。
40
+
41
+ ---
42
+
43
+ ## 实战参考案例(生产级 PySide2 桌面应用,323 MB,含 OpenCV / Playwright)
44
+
45
+ ### 项目概况
46
+ - **总体积**: 323 MB
47
+ - **打包工具**: PyInstaller 4.7 (32位)
48
+ - **主要依赖**: PySide2 (22.52 MB), OpenCV (62.38 MB), Playwright (76.74 MB)
49
+ - **Python 版本**: Python 3.8 (32位)
50
+ - **DLL 数量**: 71 个,总计 93.23 MB
51
+
52
+ ### 关键优化策略
53
+ 1. PASS: **使用 32 位 Python** → 体积减少 20-30%
54
+ 2. PASS: **base_library.zip 压缩标准库** → 0.74 MB
55
+ 3. PASS: **精简模块排除** → 无 pytest/unittest/setuptools
56
+ 4. PASS: **精简 Qt 插件** → 只保留必要插件
57
+
58
+ ### 体积分布
59
+
60
+ | 组件 | 体积 | 占比 | 优化建议 |
61
+ |------|------|------|---------|
62
+ | playwright | 76.74 MB | 23.8% | 非必要可移除 |
63
+ | OpenCV | 62.38 MB | 19.3% | 用 opencv-python-headless |
64
+ | PySide2 | 22.52 MB | 7.0% | 排除 WebEngine/3D/Charts |
65
+ | 其他依赖 | 161.36 MB | 49.9% | - |
66
+
67
+ ### 预期效果对比
68
+
69
+ | 项目类型 | Nuitka 原始 | 优化后 | 参考项目实测 |
70
+ |---------|------------|--------|----------------|
71
+ | Tkinter + 标准库 | 150-250 MB | **80-120 MB** | - |
72
+ | PyQt/PySide | 200-400 MB | **120-250 MB** | 323 MB (含 OpenCV 等) |
73
+ | 含 numpy/pandas | 300-600 MB | **180-350 MB** | - |
74
+
75
+ ---
76
+
77
+ ## 核心工作流 (Workflow) - WARNING: 严格执行
78
+
79
+ 当用户请求打包时,按照以下步骤操作:
80
+
81
+ **步骤 1:强制参数确认(FAIL: 禁止使用默认值)**
82
+
83
+ > **WARNING: 重要规则:以下所有参数必须逐一向用户确认,禁止自动填充或使用默认值!**
84
+
85
+ 必须向用户询问并确认以下信息(*等待用户明确回复后才能继续*):
86
+
87
+ | 参数 | 说明 | 示例 |
88
+ |------|------|------|
89
+ | **软件名称** (App Name) | 软件显示名称 | `红墨批注` |
90
+ | **版本号** (Version) | 语义化版本号 | `1.0.0` |
91
+ | **发布者/公司名** (Publisher) | 控制面板显示的发布者 | `YourCompany` |
92
+ | **主程序** (Exe Name) | 主可执行文件名 | `RedInk.exe` |
93
+ | **源路径** (Source Dir) | Nuitka dist 文件夹绝对路径 | `D:\project\dist` |
94
+ | **输出路径** (Output Dir) | 安装包生成位置 | `D:\project\output` |
95
+ | **图标路径** (Icon Path) | .ico 文件绝对路径(可选但推荐) | `D:\project\icon.ico` |
96
+ | **官网地址** (URL) | 可选,用于控制面板链接 | `https://example.com` |
97
+
98
+ **询问模板:**
99
+ > "请提供以下打包参数,我需要您逐一确认:
100
+ > 1. 软件名称:
101
+ > 2. 版本号:
102
+ > 3. 发布者/公司名:
103
+ > 4. 主程序文件名(如 xxx.exe):
104
+ > 5. 源路径(Nuitka dist 文件夹):
105
+ > 6. 输出路径(安装包保存位置):
106
+ > 7. 图标路径(.ico 文件,可留空):
107
+ > 8. 官网地址(可留空):
108
+ >
109
+ > 请逐一填写,或回复"跳过"表示使用空值。"
110
+
111
+ **步骤 2:源文件质量与编译检查(关键)**
112
+ 在生成代码之前,必须向用户发出以下**关键确认**(因为 Inno Setup 只是打包工具,无法改变程序本身的运行属性):
113
+
114
+ > "WARNING: **编译参数检查**:
115
+ > 1. **去黑窗**:请确认您的 dist 文件夹是使用 `nuitka --windows-console-mode=disable` 编译的。(否则安装后依然会有黑框)
116
+ > 2. **高性能**:请确认是否使用了 `--lto=yes`。(否则启动速度可能不理想)
117
+ > 3. **运行库**:请确保 dist 文件夹内已包含必要的 VC++ 运行库,防止在纯净系统上无法运行。
118
+ >
119
+ > **确认源文件已准备好请回复"确认",否则请先重新编译。**"
120
+
121
+ **步骤 3:生成代码**
122
+ 用户确认后,输出包含 **完整元数据** 和 **卸载图标修复** 的代码。
123
+
124
+ ---
125
+
126
+ ## Nuitka 极限优化编译(基于 参考项目经验)
127
+
128
+ ### 一、32 位 vs 64 位选择策略
129
+
130
+ **参考项目使用 32 位 Python 的原因**:
131
+
132
+ | 组件 | 64位体积 | 32位体积 | 节省 |
133
+ |------|---------|---------|------|
134
+ | python3x.dll | ~4.5 MB | ~3.8 MB | 15% |
135
+ | Qt5Core.dll | ~8 MB | ~5 MB | 37% |
136
+ | numpy | ~30 MB | ~20 MB | 33% |
137
+ | **总体** | 基准 | **-20~30%** | - |
138
+
139
+ **推荐使用 32 位条件**:
140
+ - PASS: 程序内存占用 < 2GB
141
+ - PASS: 不处理超大文件(< 2GB)
142
+ - PASS: 目标用户是普通办公电脑
143
+
144
+ **32 位编译方法**:
145
+ ```bash
146
+ # 1. 安装 32 位 Python(和 64 位可以共存)
147
+ # 下载地址:https://www.python.org/downloads/windows/
148
+
149
+ # 2. 用 32 位 Python 安装依赖
150
+ py -3.12-32 -m pip install -r requirements.txt
151
+
152
+ # 3. 用 32 位 Python 编译
153
+ py -3.12-32 -m nuitka --standalone ...你的参数
154
+ ```
155
+
156
+ ### 二、模块排除清单(参考项目验证过的)
157
+
158
+ **安全排除列表**(运行时不需要):
159
+ ```
160
+ unittest,test,pytest,_pytest,doctest,pdb,pdbpp,
161
+ setuptools,pip,distutils,pkg_resources,
162
+ email.mime,http.server,xmlrpc,pydoc
163
+ ```
164
+
165
+ **预期效果**:节省 **30-50 MB**
166
+
167
+ ### 三、GUI 框架专用优化
168
+
169
+ #### Tkinter 极限优化(推荐,最轻量)
170
+ ```bash
171
+ nuitka --standalone --windows-console-mode=disable ^
172
+ --lto=yes ^
173
+ --jobs=8 ^
174
+ --enable-plugin=tk-inter ^
175
+ --enable-plugin=anti-bloat ^
176
+ --noinclude-pytest-mode=nofollow ^
177
+ --noinclude-setuptools-mode=nofollow ^
178
+ --nofollow-import-to=unittest,test,pytest,_pytest,doctest,pdb,pdbpp ^
179
+ --nofollow-import-to=setuptools,pip,distutils,pkg_resources ^
180
+ --nofollow-import-to=email.mime,http.server,xmlrpc,pydoc ^
181
+ --python-flag=no_docstrings ^
182
+ --output-dir=dist ^
183
+ --windows-icon-from-ico=icon.ico ^
184
+ --remove-output ^
185
+ main.py
186
+ ```
187
+
188
+ **预期体积**:80-120 MB(优化后)
189
+
190
+ #### PyQt5 / PySide2 优化
191
+ ```bash
192
+ nuitka --standalone --windows-console-mode=disable ^
193
+ --lto=yes ^
194
+ --jobs=8 ^
195
+ --enable-plugin=pyqt5 ^
196
+ --enable-plugin=anti-bloat ^
197
+ --noinclude-pytest-mode=nofollow ^
198
+ --noinclude-setuptools-mode=nofollow ^
199
+ --nofollow-import-to=unittest,test,pytest,_pytest,doctest,pdb ^
200
+ --nofollow-import-to=setuptools,pip,distutils,pkg_resources ^
201
+ --nofollow-import-to=PyQt5.QtWebEngine,PyQt5.QtWebEngineWidgets ^
202
+ --nofollow-import-to=PyQt5.Qt3D,PyQt5.QtCharts ^
203
+ --python-flag=no_docstrings ^
204
+ --include-qt-plugins=sensible,styles,platforms ^
205
+ --output-dir=dist ^
206
+ --windows-icon-from-ico=icon.ico ^
207
+ --remove-output ^
208
+ main.py
209
+ ```
210
+
211
+ **预期体积**:120-250 MB(优化后)
212
+
213
+ ### 四、一键编译脚本模板
214
+
215
+ **保存为 `build_optimized.bat`(项目根目录)**:
216
+
217
+ ```batch
218
+ @echo off
219
+ chcp 65001 >nul
220
+ setlocal enabledelayedexpansion
221
+
222
+ echo ========================================
223
+ echo Nuitka 极限优化编译(参考 参考项目)
224
+ echo ========================================
225
+
226
+ REM === 配置区域(请修改为你的实际值) ===
227
+ set APP_NAME=你的软件名
228
+ set MAIN_FILE=main.py
229
+ set ICON_FILE=icon.ico
230
+
231
+ REM === 自动检测 CPU 核心数 ===
232
+ REM 用 Windows 自带环境变量(wmic 在 Win11 22H2+ 已移除,探不到会让 --jobs=0 单线程编译)
233
+ set CPU_CORES=%NUMBER_OF_PROCESSORS%
234
+ if not defined CPU_CORES set CPU_CORES=4
235
+ set /a BUILD_JOBS=%CPU_CORES%
236
+
237
+ REM === 参考项目的模块排除清单 ===
238
+ set EXCLUDE_MODULES=unittest,test,pytest,_pytest,doctest,pdb,pdbpp
239
+ set EXCLUDE_MODULES=%EXCLUDE_MODULES%,setuptools,pip,distutils,pkg_resources
240
+ set EXCLUDE_MODULES=%EXCLUDE_MODULES%,email.mime,http.server,xmlrpc,pydoc
241
+
242
+ echo.
243
+ echo [1/4] 清理旧编译...
244
+ if exist dist rd /s /q dist
245
+ if exist build rd /s /q build
246
+
247
+ echo.
248
+ echo [2/4] Nuitka 编译中(应用 参考项目优化策略)...
249
+ echo - CPU 核心: %CPU_CORES% (使用 %BUILD_JOBS% 线程)
250
+ echo - 模块排除: %EXCLUDE_MODULES%
251
+ echo.
252
+
253
+ nuitka --standalone ^
254
+ --windows-console-mode=disable ^
255
+ --lto=yes ^
256
+ --jobs=%BUILD_JOBS% ^
257
+ --enable-plugin=anti-bloat ^
258
+ --enable-plugin=tk-inter ^
259
+ --noinclude-pytest-mode=nofollow ^
260
+ --noinclude-setuptools-mode=nofollow ^
261
+ --nofollow-import-to=%EXCLUDE_MODULES% ^
262
+ --python-flag=no_docstrings ^
263
+ --output-dir=dist ^
264
+ --windows-icon-from-ico=%ICON_FILE% ^
265
+ --remove-output ^
266
+ %MAIN_FILE%
267
+
268
+ if %errorlevel% neq 0 (
269
+ echo.
270
+ echo [错误] 编译失败!
271
+ pause
272
+ exit /b 1
273
+ )
274
+
275
+ echo.
276
+ echo [3/4] 统计编译结果...
277
+ for /f %%a in ('powershell -NoProfile -Command "(Get-ChildItem -LiteralPath 'dist\%APP_NAME%.dist' -Recurse -File | Measure-Object -Property Length -Sum).Sum"') do set TOTAL_SIZE=%%a
278
+ set TOTAL_SIZE=%TOTAL_SIZE:,=%
279
+ set /a SIZE_MB=%TOTAL_SIZE% / 1048576
280
+ echo - 编译后体积: %SIZE_MB% MB
281
+
282
+ echo.
283
+ echo [4/4] 执行瘦身清理(参考 参考项目策略)...
284
+ powershell -ExecutionPolicy Bypass -File slim_dist.ps1 -DistPath "dist\%APP_NAME%.dist"
285
+
286
+ echo.
287
+ echo ========================================
288
+ echo 编译完成!
289
+ echo ========================================
290
+ pause
291
+ ```
292
+
293
+ ### 五、dist 瘦身脚本(参考项目级别清理)
294
+
295
+ **保存为 `slim_dist.ps1`(和 build_optimized.bat 同目录)**:
296
+
297
+ ```powershell
298
+ param(
299
+ [string]$DistPath
300
+ )
301
+
302
+ $ErrorActionPreference = "Continue" # 不静默吞错:删除失败会显示出来,避免假成功
303
+
304
+ Write-Host "`n========================================" -ForegroundColor Cyan
305
+ Write-Host "dist 瘦身清理(参考 参考项目策略)" -ForegroundColor Cyan
306
+ Write-Host "========================================" -ForegroundColor Cyan
307
+
308
+ if (-not (Test-Path $DistPath)) {
309
+ Write-Host "[错误] 找不到目录: $DistPath" -ForegroundColor Red
310
+ exit 1
311
+ }
312
+
313
+ # 统计初始体积
314
+ $InitialSize = (Get-ChildItem -Path $DistPath -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
315
+ Write-Host "`n初始体积: $([math]::Round($InitialSize, 2)) MB" -ForegroundColor Yellow
316
+
317
+ # 参考项目特征:没有 .pdb, .pyi, __pycache__, test 等
318
+ Write-Host "`n[应用 参考项目的清理策略...]" -ForegroundColor Green
319
+
320
+ # 1. 删除调试符号
321
+ Write-Host "`n[1/7] 删除 .pdb 调试符号..." -ForegroundColor Green
322
+ $pdbFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pdb -File
323
+ $pdbSize = ($pdbFiles | Measure-Object -Property Length -Sum).Sum / 1MB
324
+ if ($pdbFiles.Count -gt 0) {
325
+ $pdbFiles | Remove-Item -Force
326
+ Write-Host " 删除 $($pdbFiles.Count) 个文件,节省 $([math]::Round($pdbSize, 2)) MB"
327
+ } else {
328
+ Write-Host " 未发现 .pdb 文件(已优化)" -ForegroundColor Gray
329
+ }
330
+
331
+ # 2. 删除类型提示
332
+ Write-Host "`n[2/7] 删除 .pyi 类型提示..." -ForegroundColor Green
333
+ $pyiFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pyi -File
334
+ $pyiSize = ($pyiFiles | Measure-Object -Property Length -Sum).Sum / 1MB
335
+ if ($pyiFiles.Count -gt 0) {
336
+ $pyiFiles | Remove-Item -Force
337
+ Write-Host " 删除 $($pyiFiles.Count) 个文件,节省 $([math]::Round($pyiSize, 2)) MB"
338
+ } else {
339
+ Write-Host " 未发现 .pyi 文件(已优化)" -ForegroundColor Gray
340
+ }
341
+
342
+ # 3. 删除 __pycache__
343
+ Write-Host "`n[3/7] 删除 __pycache__ 缓存..." -ForegroundColor Green
344
+ $pycacheDirs = Get-ChildItem -Path $DistPath -Recurse -Directory -Filter "__pycache__"
345
+ $pycacheSize = 0
346
+ foreach ($dir in $pycacheDirs) {
347
+ $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
348
+ $pycacheSize += $size
349
+ Remove-Item -Path $dir.FullName -Recurse -Force
350
+ }
351
+ if ($pycacheDirs.Count -gt 0) {
352
+ Write-Host " 删除 $($pycacheDirs.Count) 个目录,节省 $([math]::Round($pycacheSize / 1MB, 2)) MB"
353
+ } else {
354
+ Write-Host " 未发现 __pycache__(已优化)" -ForegroundColor Gray
355
+ }
356
+
357
+ # 4. 删除测试目录
358
+ Write-Host "`n[4/7] 删除 test/tests 测试目录..." -ForegroundColor Green
359
+ $testDirs = Get-ChildItem -Path $DistPath -Recurse -Directory | Where-Object { $_.Name -match '^tests?$' }
360
+ $testSize = 0
361
+ foreach ($dir in $testDirs) {
362
+ $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
363
+ $testSize += $size
364
+ Remove-Item -Path $dir.FullName -Recurse -Force
365
+ }
366
+ if ($testDirs.Count -gt 0) {
367
+ Write-Host " 删除 $($testDirs.Count) 个目录,节省 $([math]::Round($testSize / 1MB, 2)) MB"
368
+ } else {
369
+ Write-Host " 未发现测试目录(已优化)" -ForegroundColor Gray
370
+ }
371
+
372
+ # 5. 删除文档和示例
373
+ Write-Host "`n[5/7] 删除 docs/examples 文档目录..." -ForegroundColor Green
374
+ $docDirs = Get-ChildItem -Path $DistPath -Recurse -Directory | Where-Object { $_.Name -match '^(docs|examples|samples|demo)$' }
375
+ $docSize = 0
376
+ foreach ($dir in $docDirs) {
377
+ $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
378
+ $docSize += $size
379
+ Remove-Item -Path $dir.FullName -Recurse -Force
380
+ }
381
+ if ($docDirs.Count -gt 0) {
382
+ Write-Host " 删除 $($docDirs.Count) 个目录,节省 $([math]::Round($docSize / 1MB, 2)) MB"
383
+ } else {
384
+ Write-Host " 未发现文档目录(已优化)" -ForegroundColor Gray
385
+ }
386
+
387
+ # 6. 删除 .pyc 文件
388
+ Write-Host "`n[6/7] 删除 .pyc 字节码..." -ForegroundColor Green
389
+ $pycFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pyc -File
390
+ $pycSize = ($pycFiles | Measure-Object -Property Length -Sum).Sum / 1MB
391
+ if ($pycFiles.Count -gt 0) {
392
+ $pycFiles | Remove-Item -Force
393
+ Write-Host " 删除 $($pycFiles.Count) 个文件,节省 $([math]::Round($pycSize, 2)) MB"
394
+ } else {
395
+ Write-Host " 未发现 .pyc 文件(已优化)" -ForegroundColor Gray
396
+ }
397
+
398
+ # 7. 精简 .dist-info 元数据
399
+ Write-Host "`n[7/7] 精简 .dist-info 元数据..." -ForegroundColor Green
400
+ $distInfoDirs = Get-ChildItem -Path $DistPath -Recurse -Directory -Filter "*.dist-info"
401
+ $removedCount = 0
402
+ $removedSize = 0
403
+ foreach ($infoDir in $distInfoDirs) {
404
+ # 仅删安装期记账文件;保留 METADATA 与 entry_points.txt(运行期被 importlib.metadata 读取,删除会破坏插件发现)
405
+ $filesToRemove = @("RECORD", "INSTALLER", "direct_url.json")
406
+ foreach ($fileName in $filesToRemove) {
407
+ $file = Join-Path $infoDir.FullName $fileName
408
+ if (Test-Path $file) {
409
+ $size = (Get-Item $file).Length
410
+ $removedSize += $size
411
+ Remove-Item $file -Force
412
+ $removedCount++
413
+ }
414
+ }
415
+ }
416
+ if ($removedCount -gt 0) {
417
+ Write-Host " 删除 $removedCount 个元数据文件,节省 $([math]::Round($removedSize / 1MB, 2)) MB"
418
+ } else {
419
+ Write-Host " 未发现可清理的元数据(已优化)" -ForegroundColor Gray
420
+ }
421
+
422
+ # 统计最终体积
423
+ $FinalSize = (Get-ChildItem -Path $DistPath -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
424
+ $SavedSize = $InitialSize - $FinalSize
425
+ $SavedPercent = if ($InitialSize -gt 0) { ($SavedSize / $InitialSize) * 100 } else { 0 }
426
+
427
+ Write-Host "`n========================================" -ForegroundColor Cyan
428
+ Write-Host "清理完成!" -ForegroundColor Green
429
+ Write-Host "========================================" -ForegroundColor Cyan
430
+ Write-Host "初始体积: $([math]::Round($InitialSize, 2)) MB" -ForegroundColor Yellow
431
+ Write-Host "最终体积: $([math]::Round($FinalSize, 2)) MB" -ForegroundColor Green
432
+ Write-Host "节省空间: $([math]::Round($SavedSize, 2)) MB ($([math]::Round($SavedPercent, 1))%)" -ForegroundColor Cyan
433
+ Write-Host "========================================`n" -ForegroundColor Cyan
434
+
435
+ # 对比 参考项目
436
+ Write-Host "[对比参考]" -ForegroundColor Yellow
437
+ Write-Host "参考项目总体积: 323 MB (包含 PyQt, OpenCV, Playwright 等重量级库)" -ForegroundColor Gray
438
+ Write-Host "如果你的项目是纯 Tkinter + 标准库,目标应该在 80-150 MB" -ForegroundColor Gray
439
+ ```
440
+
441
+ **预期效果**:节省 **15-30%** 体积
442
+
443
+ ### 六、DLL 依赖分析工具
444
+
445
+ **保存为 `analyze_dlls.py`(用于找出体积大户)**:
446
+
447
+ ```python
448
+ """
449
+ DLL 依赖分析工具
450
+ 参考 参考项目的 DLL 管理策略,帮助识别体积大户和优化建议
451
+ """
452
+ import sys
453
+ from pathlib import Path
454
+
455
+ def analyze_dlls(dist_path: str):
456
+ """分析 dist 目录中的 DLL 依赖"""
457
+ dist_dir = Path(dist_path)
458
+
459
+ if not dist_dir.exists():
460
+ print(f"[错误] 目录不存在: {dist_path}")
461
+ return
462
+
463
+ print("=" * 70)
464
+ print("DLL 依赖分析(参考 参考项目策略)")
465
+ print("=" * 70)
466
+
467
+ # 收集所有 DLL
468
+ dll_files = list(dist_dir.rglob("*.dll"))
469
+
470
+ if not dll_files:
471
+ print("\n未发现 DLL 文件")
472
+ return
473
+
474
+ # 按大小排序
475
+ dll_data = [(dll, dll.stat().st_size) for dll in dll_files]
476
+ dll_data.sort(key=lambda x: x[1], reverse=True)
477
+
478
+ total_size = sum(size for _, size in dll_data)
479
+
480
+ print(f"\n总 DLL 数量: {len(dll_files)}")
481
+ print(f"总 DLL 体积: {total_size / 1024 / 1024:.2f} MB\n")
482
+
483
+ # 参考项目对比
484
+ print("[对比参考] 参考项目的 DLL 情况:")
485
+ print(" - 总数量: 71 个")
486
+ print(" - 总体积: 93.23 MB")
487
+ print(" - 最大的: libopenblas (26.85 MB), opengl32sw (15.25 MB)\n")
488
+
489
+ # 分析大于 3MB 的 DLL
490
+ large_dlls = [(dll, size) for dll, size in dll_data if size > 3 * 1024 * 1024]
491
+
492
+ if large_dlls:
493
+ print("=" * 70)
494
+ print("WARNING: 大于 3MB 的 DLL(需重点关注)")
495
+ print("=" * 70)
496
+
497
+ for dll, size in large_dlls:
498
+ size_mb = size / 1024 / 1024
499
+ relative_path = dll.relative_to(dist_dir)
500
+ name_lower = dll.name.lower()
501
+
502
+ print(f"\n{size_mb:8.2f} MB {dll.name}")
503
+ print(f" 位置: {relative_path.parent}")
504
+
505
+ # 优化建议
506
+ suggestions = get_optimization_suggestion(name_lower)
507
+ if suggestions:
508
+ for suggestion in suggestions:
509
+ print(f" {suggestion}")
510
+
511
+ # 检查冗余 DLL
512
+ print("\n" + "=" * 70)
513
+ print(" 冗余检查")
514
+ print("=" * 70)
515
+
516
+ # 检查调试版本
517
+ debug_dlls = [dll for dll, _ in dll_data if dll.stem.endswith('d')]
518
+ if debug_dlls:
519
+ print(f"\nWARNING: 发现 {len(debug_dlls)} 个调试版本 DLL(可以删除):")
520
+ for dll in debug_dlls:
521
+ print(f" - {dll.name}")
522
+ else:
523
+ print("\nPASS: 未发现调试版本 DLL(已优化)")
524
+
525
+ # VC++ Runtime
526
+ vc_runtimes = [dll for dll, _ in dll_data if 'vcruntime' in dll.name.lower() or 'msvcp' in dll.name.lower()]
527
+ if vc_runtimes:
528
+ print(f"\n[VC++ Runtime 库] 发现 {len(vc_runtimes)} 个:")
529
+ for dll in vc_runtimes:
530
+ size_mb = dll.stat().st_size / 1024 / 1024
531
+ print(f" - {dll.name} ({size_mb:.2f} MB)")
532
+ print(" 这些是必需的,参考项目也包含了这些文件")
533
+
534
+ # 全部 DLL 列表
535
+ print("\n" + "=" * 70)
536
+ print(" 完整 DLL 列表(按体积排序,前 20)")
537
+ print("=" * 70)
538
+ print(f"\n{'体积 (MB)':>10} {'文件名':<30} 位置")
539
+ print("-" * 70)
540
+
541
+ for dll, size in dll_data[:20]:
542
+ size_mb = size / 1024 / 1024
543
+ relative_path = dll.relative_to(dist_dir)
544
+ location = str(relative_path.parent) if relative_path.parent != Path('.') else "根目录"
545
+ print(f"{size_mb:10.2f} {dll.name:<30} {location}")
546
+
547
+ if len(dll_data) > 20:
548
+ remaining_size = sum(size for _, size in dll_data[20:]) / 1024 / 1024
549
+ print(f"... 还有 {len(dll_data) - 20} 个 DLL,共 {remaining_size:.2f} MB")
550
+
551
+
552
+ def get_optimization_suggestion(dll_name: str) -> list:
553
+ """根据 DLL 名称给出优化建议"""
554
+ suggestions = []
555
+
556
+ if "openblas" in dll_name or "mkl" in dll_name:
557
+ suggestions.append("数学运算库,参考项目的 libopenblas 有 26.85 MB")
558
+ suggestions.append("如不需要高性能计算可考虑轻量版")
559
+
560
+ elif "opencv" in dll_name or "ffmpeg" in dll_name:
561
+ suggestions.append("OpenCV 相关,参考项目的 opencv_videoio_ffmpeg 有 18.48 MB")
562
+ suggestions.append("考虑用 opencv-python-headless")
563
+
564
+ elif "qt5" in dll_name or "qt6" in dll_name or "pyside" in dll_name:
565
+ suggestions.append("Qt 库,参考项目的 Qt5Core 有 5.13 MB")
566
+ suggestions.append("可排除不需要的模块(WebEngine, 3D, Charts)")
567
+
568
+ elif "opengl" in dll_name and "sw" in dll_name:
569
+ suggestions.append("OpenGL 软件渲染器,参考项目保留了 15.25 MB")
570
+ suggestions.append("通常可以删除(使用硬件渲染)")
571
+
572
+ elif "d3dcompiler" in dll_name:
573
+ suggestions.append("DirectX 编译器,参考项目有 3.53 MB")
574
+
575
+ elif "mfc140" in dll_name:
576
+ suggestions.append("MFC 库,参考项目有 4.89 MB")
577
+
578
+ return suggestions
579
+
580
+
581
+ if __name__ == "__main__":
582
+ if len(sys.argv) < 2:
583
+ print("用法: python analyze_dlls.py <dist目录路径>")
584
+ print("示例: python analyze_dlls.py dist/main.dist")
585
+ sys.exit(1)
586
+
587
+ analyze_dlls(sys.argv[1])
588
+ ```
589
+
590
+ **使用方法**:
591
+ ```bash
592
+ python analyze_dlls.py dist/你的软件名.dist
593
+ ```
594
+
595
+ ---
596
+
597
+ ## 完整优化工作流
598
+
599
+ ### 步骤 1:修改编译脚本配置
600
+
601
+ 编辑 `build_optimized.bat`,修改这 3 行:
602
+
603
+ ```batch
604
+ set APP_NAME=你的软件名 REM 改成实际名称
605
+ set MAIN_FILE=main.py REM 你的主程序文件
606
+ set ICON_FILE=icon.ico REM 你的图标文件
607
+ ```
608
+
609
+ ### 步骤 2:一键编译+瘦身
610
+
611
+ ```bash
612
+ # 在项目根目录执行
613
+ build_optimized.bat
614
+ ```
615
+
616
+ ### 步骤 3:分析 DLL 依赖
617
+
618
+ ```bash
619
+ python analyze_dlls.py dist/你的软件名.dist
620
+ ```
621
+
622
+ ### 步骤 4:根据分析结果优化
623
+
624
+ **如果用了 OpenCV** → 改用无头版
625
+ ```bash
626
+ pip uninstall opencv-python
627
+ pip install opencv-python-headless
628
+ ```
629
+
630
+ **如果用了 Qt** → 排除不需要的模块
631
+ ```batch
632
+ # 在编译命令中添加
633
+ --nofollow-import-to=PyQt5.QtWebEngine,PyQt5.Qt3D,PyQt5.QtCharts
634
+ ```
635
+
636
+ **删除软件渲染器**(如果不需要)
637
+ ```powershell
638
+ # 在 dist 目录执行
639
+ Remove-Item "opengl32sw.dll" -Force
640
+ ```
641
+
642
+ ---
643
+
644
+ ## VC++ 运行库处理方案
645
+
646
+ ### 方案一:静态链接(推荐)
647
+ ```bash
648
+ nuitka --static-libpython=yes ...
649
+ ```
650
+
651
+ ### 方案二:捆绑运行库安装(商业发布推荐)
652
+ 在 Inno Setup 脚本中添加:
653
+
654
+ ```iss
655
+ ; WARNING: VC++ 运行库架构必须与 Python/Nuitka 构建架构一致。
656
+ ; 本 skill 推荐 32 位 Python,故默认捆绑 vc_redist.x86.exe;
657
+ ; 若用 64 位 Python 编译,请把下面两处改为 vc_redist.x64.exe。
658
+ [Files]
659
+ Source: "{#MySourceDir}\..\vc_redist.x86.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
660
+
661
+ [Run]
662
+ Filename: "{tmp}\vc_redist.x86.exe"; Parameters: "/quiet /norestart"; StatusMsg: "正在安装运行库..."; Flags: waituntilterminated
663
+ ```
664
+
665
+ > 下载地址:[Microsoft Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist)
666
+
667
+ ---
668
+
669
+ ## Inno Setup 脚本模板(商业终极版)
670
+
671
+ ```iss
672
+ ; =====================================================================
673
+ ; WARNING: 商业级 Python 安装脚本 (Inno Setup 6.x)
674
+ ; 特性:LZMA2 极限压缩 | 全中文 | 完整元数据 | 无残留卸载
675
+ ; 参考:参考项目(323 MB, LZMA2 压缩)
676
+ ; =====================================================================
677
+
678
+ ; --- 1. 参数定义 ---
679
+ #define MyAppName "{{APP_NAME}}"
680
+ #define MyAppVersion "{{APP_VERSION}}"
681
+ #define MyAppPublisher "{{PUBLISHER}}"
682
+ #define MyAppURL "{{APP_URL}}"
683
+ #define MyAppExeName "{{EXE_NAME}}"
684
+ #define MySourceDir "{{SOURCE_DIR}}"
685
+ #define MyOutputDir "{{OUTPUT_DIR}}"
686
+ ;#define MyIconPath "{{ICON_PATH}}"
687
+
688
+ [Setup]
689
+ ; --- 身份识别 ---
690
+ AppId={{GENERATE_RANDOM_GUID}}
691
+ AppName={#MyAppName}
692
+ AppVersion={#MyAppVersion}
693
+ AppPublisher={#MyAppPublisher}
694
+ AppPublisherURL={#MyAppURL}
695
+ AppSupportURL={#MyAppURL}
696
+ AppUpdatesURL={#MyAppURL}
697
+
698
+ ; --- 安装路径与权限 ---
699
+ DefaultDirName={autopf}\{#MyAppName}
700
+ DefaultGroupName={#MyAppName}
701
+ DisableDirPage=no
702
+ DisableProgramGroupPage=no
703
+ PrivilegesRequired=admin
704
+
705
+ ; --- 输出设置 ---
706
+ OutputDir={#MyOutputDir}
707
+ OutputBaseFilename=Setup_{#MyAppName}_v{#MyAppVersion}
708
+
709
+ ; --- 视觉体验 ---
710
+ WizardStyle=modern
711
+ #ifdef MyIconPath
712
+ SetupIconFile={#MyIconPath}
713
+ UninstallDisplayIcon={app}\{#MyAppExeName}
714
+ #endif
715
+
716
+ ; --- 核心压缩 (参考 参考项目) ---
717
+ Compression=lzma2/ultra64
718
+ SolidCompression=yes
719
+ LZMAUseSeparateProcess=yes
720
+
721
+ ; --- 架构 ---
722
+ ; 注意:仅 64 位 Python 构建才设此项。本 skill 推荐 32 位 Python——
723
+ ; 32 位构建请保持注释,使应用按 32 位安装并与上面捆绑的 vc_redist.x86.exe 匹配。
724
+ ; 仅当用 64 位 Python 编译时才取消注释。
725
+ ;ArchitecturesInstallIn64BitMode=x64compatible
726
+
727
+ [Languages]
728
+ Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
729
+
730
+ [Files]
731
+ Source: "{#MySourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
732
+
733
+ [UninstallDelete]
734
+ Type: filesandordirs; Name: "{app}\*"
735
+
736
+ [Icons]
737
+ Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
738
+ Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
739
+ Name: "{group}\卸载 {#MyAppName}"; Filename: "{uninstallexe}"
740
+
741
+ [Tasks]
742
+ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
743
+
744
+ [Run]
745
+ Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
746
+ ```
747
+
748
+ ---
749
+
750
+ ## 占位符说明
751
+
752
+ | 占位符 | 说明 | 示例值 |
753
+ |--------|------|--------|
754
+ | `{{APP_NAME}}` | 软件显示名称 | `红墨批注` |
755
+ | `{{APP_VERSION}}` | 版本号 | `1.0.0` |
756
+ | `{{PUBLISHER}}` | 发布者/公司名 | `MyCompany` |
757
+ | `{{APP_URL}}` | 官网地址 | `https://example.com` |
758
+ | `{{EXE_NAME}}` | 主程序文件名 | `RedInk.exe` |
759
+ | `{{SOURCE_DIR}}` | Nuitka dist 文件夹路径 | `D:\project\dist\RedInk.dist` |
760
+ | `{{OUTPUT_DIR}}` | 安装包输出路径 | `D:\project\output` |
761
+ | `{{ICON_PATH}}` | 图标文件路径 | `D:\project\icon.ico` |
762
+ | `{{GENERATE_RANDOM_GUID}}` | **需生成唯一GUID** | 使用 Inno Setup "Tools > Generate GUID" |
763
+
764
+ ---
765
+
766
+ ## 常见问题 (FAQ)
767
+
768
+ ### Q1: 安装后双击程序无反应?
769
+ 1. 打开 CMD,手动运行 exe 查看错误信息
770
+ 2. 检查是否缺少 VC++ 运行库
771
+ 3. 检查 Nuitka 编译是否成功
772
+
773
+ ### Q2: 安装包体积过大?
774
+ **优化方法**:
775
+ 1. 使用 32 位 Python 编译(节省 20-30%)
776
+ 2. 应用 参考项目的模块排除清单
777
+ 3. 启用 Anti-Bloat 插件
778
+ 4. 执行 dist 文件夹瘦身脚本
779
+ 5. 分析 DLL,移除不必要的大文件
780
+
781
+ ### Q3: 杀毒软件误报?
782
+ **解决方案**:
783
+ - 提交到主流杀毒厂商进行白名单申请
784
+ - 购买代码签名证书(推荐:Sectigo, DigiCert)
785
+ - 避免使用 UPX 压缩
786
+
787
+ ### Q4: 安装时提示 Windows 已保护你的电脑?
788
+ - 购买 EV 代码签名证书(可立即获得信任)
789
+ - 普通代码签名证书需要积累安装量后逐渐获得信任
790
+
791
+ ---
792
+
793
+ ## 实战问题处理记录(更新 2026-02-07)
794
+
795
+ - **安装后提示缺少 python3xx.dll**:必须使用 Nuitka `--standalone`;确认 dist 内存在该 dll;不要打单文件版。
796
+ - **安装后点击无反应**:GUI 启动期可能被重依赖阻塞;将重依赖延迟到"开始导出"再 import;添加日志排查。
797
+ - **Nuitka + MinGW 在非 ASCII 路径报错**:把源码复制到 ASCII 目录再编译;设置 `PYTHONIOENCODING=utf-8`。
798
+ - **Inno Setup 警告 `x64` 已弃用(仅 64 位构建需要 64 位安装模式时)**:改为 `ArchitecturesInstallIn64BitMode=x64compatible`;32 位构建无需此项。
799
+ - **`--disable-console` 已废弃**:改用 `--windows-console-mode=disable`。
800
+ - **dist 出现 `_nuitka_temp.exe`**:在 [Files] 中排除它。
801
+
802
+ ---
803
+
804
+ ## 优化效果预期
805
+
806
+ | 优化组合 | 体积减少 | 启动提升 | 风险等级 |
807
+ |----------|----------|----------|----------|
808
+ | 基础编译 | 基准 | 基准 | 无 |
809
+ | + `--lto=yes` | 5-10% | 10-20% | PASS: 无 |
810
+ | + anti-bloat | 15-25% | - | PASS: 无 |
811
+ | + 模块排除 | 20-35% | 5% | PASS: 无 |
812
+ | + dist 瘦身 | 25-40% | - | PASS: 无 |
813
+ | + 32 位编译 | 40-60% | - | PASS: 无 |
814
+ | **全部组合** | **45-65%** | **15-25%** | PASS: **无风险** |
815
+
816
+ > WARNING: **不建议使用 UPX 压缩**,虽然能进一步减小体积,但极易触发杀毒软件误报。
817
+
818
+ ---
819
+
820
+ **基于 参考项目实战经验优化,助你打造商业级安装包!**