Skip to content

Document dependency graph breakage and Skip stack fixes#19

Closed
colemancda wants to merge 2 commits into
masterfrom
feature/skip-dependency-updates
Closed

Document dependency graph breakage and Skip stack fixes#19
colemancda wants to merge 2 commits into
masterfrom
feature/skip-dependency-updates

Conversation

@colemancda

Copy link
Copy Markdown
Member

A clean checkout of this repo cannot currently resolve its dependencies. This branch documents why,
after root-causing each failure by running the builds rather than reading manifests.

It contains documentation only. The actual fixes live in the forked dependency repos and are
committed locally but not pushed — they need your review first (listed below).

Fixed in the forks (committed at ~/Developer, unpushed)

Repo Commit Change
PureSwift/Android 17e1d1f Declare Apple platforms; align the swift-android-native source
PureSwift/AndroidBluetooth e061b99 Declare Apple platforms
PureSwift/AndroidBluetooth 6d5f5e1 Source AndroidManifest from swift-android-native
MillerTechnologyPeru/swift-android-native 55a10f5 Merge current upstream main (was 87 behind)
MillerTechnologyPeru/swift-android-native 978df30 Skip-prefixed compatibility modules

Highlights:

  • 15 iOS platform errors → 0. Android and AndroidBluetooth declared only .macOS(.v15), so
    SwiftPM defaulted iOS to 12 while their dependencies require 13. Verified pre-existing by
    reproducing the identical 15 errors with unmodified master.
  • AndroidManifest had moved. Android PR #40 relocated it into swift-android-native, but
    AndroidBluetooth still imported it from Android.
  • The swift-android-native fork was unusable by half the graph. It was 87 commits behind
    upstream, and its "Add Skip prefix" commit renamed targets — which are module names — so it
    could not serve PureSwift/Android (imports upstream names) and skip-android-bridge (imports
    the prefixed ones) simultaneously. It now merges upstream and provides the Skip names as thin
    @_exported import shim modules, so one source satisfies both.

Outstanding — needs your decision

  1. swift-java and swift-java-jni-core both declare a CSwiftJavaJNI target. Upstream split
    the JNI core out but still declares the old target; swift-android-native and swift-jni use
    the split-out package while Android, JavaLang and Kotlin still use swift-java. Any graph
    with both breaks. Fixing it means migrating the PureSwift Java stack — a coordinated change
    across three repos, and the reason app-level Android and iOS builds still cannot complete.

  2. The skip-fuse-ui fork does not build against current skip-ui. It declares
    from: "1.46.0" with no upper bound, so a fresh resolve picks 1.59.0 and fails to compile
    (AsyncImage signature change). The last version it builds against is 1.49.1 — which the old pin
    file happened to select, hiding the problem until now.

Pinning backwards is not a way out: GATT master has adopted SwiftPM traits and requires
Bluetooth 7.5.0+, and an older swift-java reintroduces the CSwiftJavaJNI clash from the other
side. Several migrations are in flight at once, so the graph has to move forward.

Structural recommendation

Package.resolved is gitignored. That is why this class of breakage was invisible: the only working
dependency state existed as an unversioned pin file on one machine, re-derived on every fresh resolve
from floating branch: dependencies across a dozen actively-refactored repos. Committing it once the
graph resolves would surface these failures at the commit that causes them rather than at clone time.

The document also records a machine-local recipe (pin Android before e9f59f8, pin skip-ui to
1.49.1, SWIFTPM_ENABLE_MACROS=0) that yields a buildable graph in the meantime — that is how the
plugin work in #18 was verified.

@colemancda colemancda closed this Jul 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant