@@ -10,11 +10,25 @@ A single tag (`v*`) triggers the release of the core SDK only:
1010
1111** The previously-separate distributions** — ` dapr-ext-fastapi ` , ` dapr-ext-grpc ` ,
1212` dapr-ext-langgraph ` , ` dapr-ext-strands ` , ` dapr-ext-workflow ` , ` flask-dapr ` —
13- are ** no longer published** . Republishing them as ` dapr-ext-name ` shims that
14- depend on ` dapr[name] ` was considered but rejected: any shim that doesn't carry
15- the actual extension code creates a ` RECORD ` ownership conflict with the legacy
16- versions in existing user environments, and ` pip uninstall ` of a legacy package would
17- delete files that core ` dapr ` now provides.
13+ are ** no longer published** .
14+
15+ The design constraint was keeping ` from dapr.ext.X import ... ` stable across
16+ the upgrade, so the cost lands once in pip during migration rather than
17+ forever in every existing codebase that already imports those paths.
18+
19+ The price: legacy dists on disk now claim the same files core ` dapr ` ships,
20+ and pip has no cross-dist ownership awareness. ` pip uninstall <legacy> ` walks
21+ the legacy RECORD and deletes ` dapr/ext/<name>/*.py ` from disk, leaving a
22+ silently broken install: ` pip show dapr ` reports 1.19 installed, but
23+ ` from dapr.ext.<name> import ... ` raises ` ModuleNotFoundError ` . The recipe
24+ below uses ` --force-reinstall --no-deps dapr ` to rewrite those files after
25+ the legacy uninstall removes them.
26+
27+ Republishing the legacy distributions as ` dapr-ext-name ` shims depending on
28+ ` dapr[name] ` was considered and rejected: any shim that doesn't ship the
29+ actual files leaves the legacy version's RECORD on disk in existing
30+ environments, so the same uninstall failure mode remains. They would also
31+ add a per-extension release artifact to maintain in perpetuity.
1832
1933Existing installs must migrate explicitly:
2034
0 commit comments