So attempting to play with the new executableTarget feature with @main I noticed some things
- "-parse-as-library" as library is required in the swift package manager per https://bugs.swift.org/browse/SR-12683
- You still cannot use the same source between executable and a library with the same source per https://forums.swift.org/t/two-libraries-with-shared-source-overlapping-error/32448
Hopefully the bug will be fixed soon. It does feel like #2 somewhat defeats the purpose of being able to specify main at any point. Are there plans to change this? At least for swift-only libraries & executables.
// swift-tools-version:5.4 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "CoolKids", products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( name: "CoolKids", targets: ["CoolKids"]), .executable( name: "tall", targets: ["TallKids"]), .executable( name: "cool", targets: ["CoolKidsExecutable"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "CoolKids", dependencies: ), .executableTarget( name: "TallKids", dependencies: , swiftSettings: [.unsafeFlags(["-parse-as-library"], .when(configuration: .debug))] ), // Swift is not happy with this because the source is the same as the Cool Kids library .executableTarget( name: "CoolKidsExecutable", dependencies: , path: "Sources/CoolKids", swiftSettings: [.unsafeFlags(["-parse-as-library"], .when(configuration: .debug))] ), .testTarget( name: "CoolKidsTests", dependencies: ["CoolKids"]), ] )