Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expected root cause […] to almost satisfy the current partial solution #7546

Open
1 task done
Frizlab opened this issue May 9, 2024 · 1 comment
Open
1 task done
Labels

Comments

@Frizlab
Copy link

Frizlab commented May 9, 2024

Is it reproducible with SwiftPM command-line tools: swift build, swift test, swift package etc?

  • Confirmed reproduction steps with SwiftPM CLI.

Description

I got the following internal error while running swift package resolve:

error: InternalError(description: "Internal error. Please file a bug at https://github.com/apple/swift-package-manager/issues with this info. Expected root cause {json-logger[everything] 0.2.0, ¬generic-json[everything] 3.0.0..<4.0.0} to almost satisfy the current partial solution:
 * [Decision 0: puremonolith[everything] 1.0.0]
 * [Derivation: urlrequestoperation[everything] 2.0.0-alpha.15..<3.0.0 ← {puremonolith[everything] 1.0.0, ¬urlrequestoperation[everything] 2.0.0-alpha.15..<3.0.0}]
 * [Derivation: swift-log[everything] 1.5.1..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-log[everything] 1.5.1..<2.0.0}]
 * [Derivation: routing-kit[everything] 4.8.2..<5.0.0 ← {puremonolith[everything] 1.0.0, ¬routing-kit[everything] 4.8.2..<5.0.0}]
 * [Derivation: unwraporthrow[everything] 1.0.0..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬unwraporthrow[everything] 1.0.0..<2.0.0}]
 * [Derivation: safeglobal[everything] 0.1.0..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬safeglobal[everything] 0.1.0..<1.0.0}]
 * [Derivation: swift-email[everything] 0.2.3..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-email[everything] 0.2.3..<1.0.0}]
 * [Derivation: httpcoders[everything] 0.1.2..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬httpcoders[everything] 0.1.2..<1.0.0}]
 * [Derivation: generic-json[everything] 3.0.0..<4.0.0 ← {puremonolith[everything] 1.0.0, ¬generic-json[everything] 3.0.0..<4.0.0}]
 * [Derivation: swift-log[everything] 1.5.3..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-log[everything] 1.5.3..<2.0.0}]
 * [Derivation: json-logger[everything] 0.2.0..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬json-logger[everything] 0.2.0..<1.0.0}]
 * [Derivation: clt-logger[everything] 0.7.1..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬clt-logger[everything] 0.7.1..<1.0.0}]
 * [Derivation: stripe-kit[everything] 23.1.0..<24.0.0 ← {puremonolith[everything] 1.0.0, ¬stripe-kit[everything] 23.1.0..<24.0.0}]
 * [Derivation: vapor[everything] 4.67.0..<5.0.0 ← {puremonolith[everything] 1.0.0, ¬vapor[everything] 4.67.0..<5.0.0}]
 * [Derivation: redis[everything] 4.10.0..<5.0.0 ← {puremonolith[everything] 1.0.0, ¬redis[everything] 4.10.0..<5.0.0}]
 * [Derivation: queues-redis-driver[everything] 1.0.3..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬queues-redis-driver[everything] 1.0.3..<2.0.0}]
 * [Derivation: queues[everything] 1.11.1..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬queues[everything] 1.11.1..<2.0.0}]
 * [Derivation: jwt[everything] 4.2.1..<5.0.0 ← {puremonolith[everything] 1.0.0, ¬jwt[everything] 4.2.1..<5.0.0}]
 * [Derivation: fluent-postgres-driver[everything] 2.4.0..<3.0.0 ← {puremonolith[everything] 1.0.0, ¬fluent-postgres-driver[everything] 2.4.0..<3.0.0}]
 * [Derivation: fluent[everything] 4.5.0..<5.0.0 ← {puremonolith[everything] 1.0.0, ¬fluent[everything] 4.5.0..<5.0.0}]
 * [Derivation: apns[everything] 4.0.0..<5.0.0 ← {puremonolith[everything] 1.0.0, ¬apns[everything] 4.0.0..<5.0.0}]
 * [Derivation: swift-prometheus[everything] 2.0.0..<3.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-prometheus[everything] 2.0.0..<3.0.0}]
 * [Derivation: legibleerror[everything] 1.0.6..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬legibleerror[everything] 1.0.6..<2.0.0}]
 * [Derivation: unwraporthrow[everything] 1.0.1-rc.1..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬unwraporthrow[everything] 1.0.1-rc.1..<2.0.0}]
 * [Derivation: safeglobal[everything] 0.2.0..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬safeglobal[everything] 0.2.0..<1.0.0}]
 * [Derivation: swift-xdg[everything] 1.0.0-beta.1.0.1..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-xdg[everything] 1.0.0-beta.1.0.1..<2.0.0}]
 * [Derivation: swift-task-queue[everything] 1.1.0..<2.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-task-queue[everything] 1.1.0..<2.0.0}]
 * [Derivation: generic-json[everything] 3.1.0-beta..<4.0.0 ← {puremonolith[everything] 1.0.0, ¬generic-json[everything] 3.1.0-beta..<4.0.0}]
 * [Derivation: collectionconcurrencykit[everything] 0.3.0..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬collectionconcurrencykit[everything] 0.3.0..<1.0.0}]
 * [Derivation: tomldecoder[everything] 0.2.2..<1.0.0 ← {puremonolith[everything] 1.0.0, ¬tomldecoder[everything] 0.2.2..<1.0.0}]
 * [Derivation: swift-metrics[everything] 2.2.0..<3.0.0 ← {puremonolith[everything] 1.0.0, ¬swift-metrics[everything] 2.2.0..<3.0.0}]
 * [Derivation: ¬json-logger[everything] 0.2.1..<1.0.0 ← {json-logger[everything] 0.2.1..<1.0.0}]
")
My Package.swift
// swift-tools-version:5.8
import PackageDescription
import Foundation



/* To find a valid test for Xcode detection, we sneakily inserted the following code in the products definition, just before the return:
 *    for (key, val) in ProcessInfo.processInfo.environment {
 *       res.append(.executable(name: key, targets: [val]))
 *    }
 * This generated a bunch of errors about invalid targets for the executable products,
 *  w/ the name of the executable being the key of the environment value and the target name its value.
 * From this we devised a check which was likely to be true in Xcode and unlikely to be true anywhere else.
 *
 * When tested, the actual value of the environment key we chose was `com.apple.dt.Xcode`.
 * We did not test directly for this in the check as _maybe_ some versions of Xcode have a different bundle ID (I don’t think so but we never know…). */
let isXcode = ProcessInfo.processInfo.environment["__CFBundleIdentifier"]?.lowercased().contains("xcode") ?? false

/* If the Package.swift is resolved in Xcode we set a different name for the executable name.
 * We need to do this because Xcode is a little bit dumb and has some kind of weirdnesses or failures
 *  when the bundle has a different name than the executable name (including, but not limited to: the tests do not compile). */
let executableName = if isXcode {"PureMonolith"} else {"pure-monolith"}

let package = Package(
   name: "PureMonolith",
   platforms: [
      .macOS(.v13)
   ],
   products: {
      var res = [Product]()
      res.append(.executable(name: executableName, targets: ["PureMonolith"]))
      return res
   }(),
   dependencies: {
      var res = [Package.Dependency]()
      res.append(.package(url: "[email protected]:togever/togever-api-model.git",            branch: "develop"))
      res.append(.package(url: "https://github.com/apple/swift-log.git",                  from: "1.4.4"))
      res.append(.package(url: "https://github.com/apple/swift-metrics.git",              from: "2.2.0"))
      res.append(.package(url: "https://github.com/dduan/TOMLDecoder.git",                from: "0.2.2"))
      res.append(.package(url: "https://github.com/Frizlab/CollectionConcurrencyKit.git", from: "0.3.0"))
      res.append(.package(url: "https://github.com/Frizlab/generic-json.git",             from: "3.1.0-beta"))
      res.append(.package(url: "https://github.com/Frizlab/swift-email.git",              from: "0.2.1"))
      res.append(.package(url: "https://github.com/Frizlab/swift-task-queue.git",         from: "1.1.0"))
      res.append(.package(url: "https://github.com/Frizlab/swift-xdg.git",                from: "1.0.0-beta.1.0.1"))
      res.append(.package(url: "https://github.com/Frizlab/SafeGlobal.git",               from: "0.2.0"))
      res.append(.package(url: "https://github.com/Frizlab/UnwrapOrThrow.git",            from: "1.0.1-rc.1"))
      res.append(.package(url: "https://github.com/mxcl/LegibleError.git",                from: "1.0.6"))
      res.append(.package(url: "https://github.com/swift-server/swift-prometheus.git",    from: "2.0.0"))
      res.append(.package(url: "https://github.com/vapor/apns.git",                       from: "4.0.0"))
      res.append(.package(url: "https://github.com/vapor/fluent.git",                     from: "4.5.0"))
      res.append(.package(url: "https://github.com/vapor/fluent-postgres-driver.git",     from: "2.4.0"))
      res.append(.package(url: "https://github.com/vapor/jwt.git",                        from: "4.2.1"))
      res.append(.package(url: "https://github.com/vapor/queues.git",                     from: "1.11.1"))
      res.append(.package(url: "https://github.com/vapor/queues-redis-driver.git",        from: "1.0.3"))
      res.append(.package(url: "https://github.com/vapor/redis.git",                      from: "4.10.0"))
      res.append(.package(url: "https://github.com/vapor/vapor.git",                      from: "4.67.0"))
      res.append(.package(url: "https://github.com/vapor-community/stripe-kit.git",       from: "23.1.0"))
      res.append(.package(url: "https://github.com/xcode-actions/clt-logger.git",         from: "0.7.1"))
      res.append(.package(url: "https://github.com/xcode-actions/json-logger.git",        from: "0.2.0"))
      res.append(.package(url: "https://github.com/xcode-actions/loki-logger.git",        branch: "main"))
      return res
   }(),
   targets: {
      var res = [Target]()
      res.append(.executableTarget(
         name: "PureMonolith",
         dependencies: {
            var res = [Target.Dependency]()
            res.append(.product(name: "CLTLogger",                package: "clt-logger"))
            res.append(.product(name: "CollectionConcurrencyKit", package: "CollectionConcurrencyKit"))
            res.append(.product(name: "Email",                    package: "swift-email"))
            res.append(.product(name: "Fluent",                   package: "fluent"))
            res.append(.product(name: "FluentPostgresDriver",     package: "fluent-postgres-driver"))
            res.append(.product(name: "JSONLogger",               package: "json-logger"))
            res.append(.product(name: "JWT",                      package: "jwt"))
            res.append(.product(name: "LegibleError",             package: "LegibleError"))
            res.append(.product(name: "Logging",                  package: "swift-log"))
            res.append(.product(name: "LokiLogger",               package: "loki-logger"))
            res.append(.product(name: "Metrics",                  package: "swift-metrics"))
            res.append(.product(name: "Prometheus",               package: "swift-prometheus"))
            res.append(.product(name: "PureModel",                package: "togever-api-model"))
            res.append(.product(name: "Queues",                   package: "queues"))
            res.append(.product(name: "QueuesRedisDriver",        package: "queues-redis-driver"))
            res.append(.product(name: "Redis",                    package: "redis"))
            res.append(.product(name: "SafeGlobal",               package: "SafeGlobal"))
            res.append(.product(name: "StripeKit",                package: "stripe-kit"))
            res.append(.product(name: "TaskQueue",                package: "swift-task-queue"))
            res.append(.product(name: "TOMLDecoder",              package: "TOMLDecoder"))
            res.append(.product(name: "UnwrapOrThrow",            package: "UnwrapOrThrow"))
            res.append(.product(name: "Vapor",                    package: "vapor"))
            res.append(.product(name: "VaporAPNS",                package: "apns"))
            res.append(.product(name: "XDG",                      package: "swift-xdg"))
            return res
         }(),
         swiftSettings: {
            var res = [SwiftSetting]()
            /* Enable better optimizations when building in Release configuration.
             * Despite the use of the `.unsafeFlags` construct required by SwiftPM, this flag is recommended for Release builds.
             * See <https://github.com/swift-server/guides/blob/main/docs/building.md#building-for-production> for details. */
            res.append(.unsafeFlags(["-cross-module-optimization"], .when(configuration: .release)))
            /* Check for concurrency issues. */
            res.append(.enableExperimentalFeature("StrictConcurrency"))
            return res
         }()
      ))
      res.append(.testTarget(name: "PureMonolithTests", dependencies: {
         var res = [Target.Dependency]()
         res.append(.target(name: "PureMonolith")) /* <- Tested target. */
         res.append(.product(name: "CLTLogger",  package: "clt-logger"))
         res.append(.product(name: "Logging",    package: "swift-log"))
         res.append(.product(name: "SafeGlobal", package: "SafeGlobal"))
         res.append(.product(name: "XCTVapor",   package: "vapor"))
         return res
      }(), swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]))
      return res
   }()
)

Expected behavior

The graph should resolve.

Actual behavior

We get an internal error.

Steps to reproduce

Create a project with the given Package.swift and try to resolve it..

Swift Package Manager version/commit hash

Swift Package Manager - Swift 5.10.0-dev

Swift & OS version (output of swift --version ; uname -a)

swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0
Darwin Frizlabs-MacBook-Pro-Mojo.local 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:12:37 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T6031 arm64

@Frizlab Frizlab added the bug label May 9, 2024
@Frizlab
Copy link
Author

Frizlab commented May 9, 2024

Note: togever-api-model depends on generic-json from: "3.0.0".

I suspect this is the root cause of the issue: my package depends on a beta version of generic-json and on a package (togever-api-model) which depends on a non-beta version of generic-json.
It should work, but we get an internal error instead.

I did not try reducing the problem to this simpler use-case but I did get the issue when I updated the requirements for generic-json in my package.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant