Problem solving

Troubleshooting PkgLift

Most refusals are telling you which fact or safety condition is missing. Fix the condition—do not weaken the guardrail.

“Multiple Xcode projects or workspaces were found”

Choose the intended workspace and project explicitly. Use paths relative to --path, for example:

pkglift analyze --path . --workspace Workspaces/Products.xcworkspace --project Projects/App.xcodeproj

PkgLift refuses to select the first candidate because that could link a package to the wrong target.

“The Git worktree is dirty” after generating a plan

Review .pkglift/plan.json, then keep only that generated file from appearing as an untracked change. For a one-off test, add .pkglift/plan.json to the repository-local .git/info/exclude. Commit or stash every other change before --apply.

Build verification requires an explicit scheme

Run a shared scheme already known to build: pkglift verify --build --scheme MyApp. For workspaces, PkgLift passes the validated scheme to both SwiftPM resolution and the final build.

A known pod is still REVIEW or UNKNOWN

Check the exact identifier, including any subspec, and the stable version in Podfile.lock. A base pod mapping does not automatically cover arbitrary subspecs. Older versions below a mapping’s verified minimum also remain non-automatic.

A verified mapping is REVIEW because of source languages

PkgLift requires a complete PBX target profile and explicit mapping support for every consumer language. Mixed Swift and Objective-C targets require both values. Unknown file types, incomplete synchronized groups, or C-family sources remain review-only unless the exact evidence contract covers them.

Carthage or a cross-platform integration prevents AUTO

This is an intentional project-level boundary. PkgLift reports Carthage, React Native, Flutter, or Capacitor integration but does not interpret or rewrite its dependency graph. Keep the migration manual or isolate a native Xcode project whose ownership can be proven.

The Podfile contains dynamic Ruby or post_install

This is expected to force conservative review. PkgLift statically parses the Podfile and does not execute Ruby to infer computed dependencies or hook behavior. Keep those entries under CocoaPods or perform a manual, project-specific migration.

The project failed before migration

Establish a valid baseline build with the same scheme, destination, SDK, and configuration first. PkgLift cannot distinguish a migration regression from a pre-existing build failure without that baseline.

“Could not find the bundled registry”

Keep the PkgLift_PkgLiftRegistry.bundle adjacent to the installed executable. The Homebrew formula installs both under libexec and creates the command symlink for you. Reinstall from the official tap if the bundle was moved or deleted.

Package resolution or build fails with private details in output

Do not paste raw project logs into a public issue without review. Run pkglift diagnostics --path . --output pkglift-diagnostics.json, open the JSON, and share only the minimized fields you approve. Xcode-generated error output can still contain project-specific information.

Collect a privacy-preserving report

pkglift diagnostics \
  --path . \
  --output pkglift-diagnostics.json

The report contains tool versions, counts, safety flags, Git state, and typed failure stages. It omits source code, complete Podfiles, dependency and target names, repository URLs, changed filenames, arbitrary errors, and absolute user paths.

Open a migration report