Parallel builds on one machine can bundle each other's Python app (staging lives in the plugin's folder in the shared pub cache)
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 38/100
Direção de pesquisa
Start with src/serious_python/bin/package_command.dart, src/serious_python_darwin/darwin/sync_site_packages.sh and stage_spm.sh, then inspect src/serious_python_android/android/build.gradle.kts and the reproduction steps. Compare how iOS, macOS and Android stage generated app data in the shared pub cache. Done means concurrent builds cannot package another project's app or partially written artifacts; the issue offers several possible fixes but does not specify a single design.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
What happens
Two builds of serious_python apps that run at the same time on one machine can ship each other's Python app. Nothing fails or warns: the app installs, starts and runs the other project's code.
We hit it three times in one evening (serious_python 5.0.0 through flet build ios-simulator from Flet 1.1, Flutter 3.47.7, Xcode 27, iOS 26.5 simulator), building one Flet app from several git worktrees in parallel:
- a build's own
build/python-app/(itsSERIOUS_PYTHON_APP) held a new module,ui/badges.pyc, but the installedRunner.app/serious_python_darwin_serious_python_darwin.bundle/app/did not; ~/.pub-cache/hosted/pub.dev/serious_python_darwin-5.0.0/darwin/dist_ios/app/had been rewritten a minute after that build packaged its app, by a parallel build in another worktree, and the installed bundle matched that copy;- in another case the app crashed at start on the other worktree's config file; the traceback paths named the other worktree's
build/site-packages.
Why
serious_python stages each app inside the plugin's own package directory, and Flutter resolves plugins from the pub cache, which every Flutter project on the machine shares. The per-project inputs (SERIOUS_PYTHON_APP, SERIOUS_PYTHON_SITE_PACKAGES) are fine; the shared copy they are staged into is not.
iOS and macOS (code at 16bceeb, identical to the published 5.0.0):
- The
packagecommand stages the processed app toSERIOUS_PYTHON_APP(per project), then runsprepare_spm.shinside the plugin'sdarwin/directory, which_resolveDarwinDir()finds through the project'spackage_config.json, i.e. in the pub cache:
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python/bin/package_command.dart#L593-L602
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python/bin/package_command.dart#L689-L741 sync_site_packages.shrsyncs$SERIOUS_PYTHON_APPinto$script_dir/dist_ios/appanddist_macos/app, and the site-packages and the frameworks built from them intodist_ios/site-packagesanddist_ios/site-xcframeworks:
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python_darwin/darwin/sync_site_packages.sh#L9-L22- Under Swift Package Manager (Flutter's default since 3.44),
stage_spm.shcopiesdist_ios/{stdlib,site-packages,app}into the package'sSources/serious_python_darwin/Resources/and the extension frameworks intoextra-xcframeworks/, whichPackage.swiftbundles as.copy("Resources/app")and binary targets:
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python_darwin/darwin/stage_spm.sh#L33-L48
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python_darwin/darwin/serious_python_darwin/Package.swift#L94-L104 - Under CocoaPods, the podspec's resource bundle points at the same folder:
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python_darwin/darwin/serious_python_darwin.podspec#L76-L82 - Xcode copies those folders into the app later, during
flutter build, which takes minutes. Another project'spackagestep in that window overwrites them, and the first build bundles the second one's app (and its site-packages and frameworks, which differ when the requirements differ).
Android has the same race, with a shorter window. serious_python_android's Gradle tasks write app.zip, stdlib.zip, sitepackages.zip and extract.zip to file("src/main/assets") and the native libraries to src/main/jniLibs/<abi>, paths relative to the plugin's project directory, which is its folder in the pub cache:
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python_android/android/build.gradle.kts#L151
https://github.com/flet-dev/serious-python/blob/16bceeb92851022aec9ad6ef24616a0831dc2ba6/src/serious_python_android/android/build.gradle.kts#L423-L454
AGP merges them into the APK later in the same Gradle run, so two Gradle builds whose preBuild and asset merge overlap can package each other's app.zip (or a half-written one). On the machine above, ~/.pub-cache/hosted/pub.dev/serious_python_android-5.0.0/android/src/main/assets/app.zip is simply the last app any project built.
Steps to reproduce
- Two Flet apps (or two copies of one) whose
main.pydiffer, for example one that shows "A" and one that shows "B". - Start
flet build ios-simulatorin both, a few seconds apart, with the default~/.pub-cache. - In each project compare the packaged app with what the bundle holds:
One of them reports the other project's files (onlydiff -rq build/python-app build/ios-simulator/*.app/serious_python_darwin_serious_python_darwin.bundle/app.keepshould differ). Running both apps shows the same letter.
Workaround
A pub cache per project: PUB_CACHE=<project>/build/pub-cache flet build .... On APFS, mkdir -p build && cp -cR ~/.pub-cache build/pub-cache makes it in a few seconds without using disk space. With it, each bundle's app/ matched its own build/python-app/ (checked on iOS and Android).
Suggested fix
Stage per Flutter project, never in the plugin's own folder:
- Android: write the generated zips and libraries under the plugin's Gradle build directory, which Flutter already places inside each app's
build/, and add them as source directories, for exampleval assetsDir = layout.buildDirectory.dir("generated/serious_python/assets")withandroid.sourceSets["main"].assets.srcDir(assetsDir), and the same forjniLibs. No layout change for callers. - iOS and macOS: the app tree is the part that changes on every build, and a SwiftPM resource must live inside its package, so either:
- take the app out of the plugin package: copy
$SERIOUS_PYTHON_APPinto the app bundle at build time (a script phase reading the variable thatflet buildalready passes toflutter build), and let the runtime look forapp/there; or - stage into a per-project copy of the plugin's
darwin/directory (SERIOUS_PYTHON_DARWIN_DIRalready overrides where staging happens) and have the caller point Flutter at that copy, e.g.flet buildwriting adependency_overridespath underbuild/.
- take the app out of the plugin package: copy
- At least, detect it: record a hash of
SERIOUS_PYTHON_APPwhen staging and compare it with what was bundled at the end of the build (or haveflet buildcomparebuild/python-appwith the bundle'sapp/), and fail with a clear message instead of shipping the wrong app.
Written by Claude Code (AI agent).
- Linguagem predominante
- Dart
- Estrelas
- 325
- Forks
- 46
- Merge médio
- 19h 50min
- PRs com merge (30d)
- 4
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de flet-dev/serious-python
-
Bump minimum iOS to 15.0 and macOS 12.0Talvez já em andamento @FeodorFitsner assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 55/100
flet-dev/serious-python#254 ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
flet-dev/serious-python#226 ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
flet-dev/serious-python#169 ·
-
iOS Build Failure: Missing site-xcframeworks Directory in serious_python_darwin PhaseScriptExecutionAberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 42/100
flet-dev/serious-python#168 ·
-
Update docs for site-packagesTalvez livre de novo @FeodorFitsner assumiu há 575 dias e não há nenhum pull request aberto. Abertadocumentation
flet-dev/serious-python#157 · 1 comentário · 1 responsável ·
Todas as issues de flet-dev/serious-python
Issues semelhantes
-
[Bug] Windows:开启 Flutter windowing 后对话框被提升为原生窗口,首个 ShowWindow 死锁导致整个应用卡死(设置 → 远程访问端口 100% 复现)Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
AimesSoft/NipaPlay-Reload#1021 ·
Mantenedores costumam responder em até 1 dia
-
enhancement triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
fluttercommunity/plus_plugins#4004 ·
Mantenedores costumam responder em até 1 dia
-
agent:ready bug P2 · 中 健壮性 区域: 启动与合规 待验证 隐私与合规
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
ASDW51/DanmuFloat#106 ·
Mantenedores costumam responder em até 1 dia
-
c: proposal p: go_router package team-ecosystem
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 60/100
flutter/flutter#194542 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
enhancement good first issue help wanted
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 80/100