add .package for location of target reference

This commit is contained in:
freddi
2021-05-14 02:50:23 +09:00
parent fc1ec31dda
commit 9022364ad3
5 changed files with 38 additions and 24 deletions
@@ -763,6 +763,10 @@ public class PBXProjGenerator {
let (targetDependency, dependencyTarget, dependencyProductProxy) = try generateExternalTargetDependency(from: target.name, to: dependencyTargetName, in: dependencyProjectName, platform: target.platform)
dependencies.append(targetDependency)
processTargetDependency(dependency, dependencyTarget: dependencyTarget, embedFileReference: dependencyProductProxy)
case .package:
// Specifying as package dependency as target is not allowed.
// This should be validated at SpecValidation part.
fatalError("Package dependency should not be added as target dependency")
}
case .framework:
@@ -1412,6 +1416,10 @@ public class PBXProjGenerator {
if isTopLevel || dependency.embed != true {
dependencies[dependency.uniqueID] = dependency
}
case .package:
// Specifying as package dependency as target is not allowed.
// This should be validated at SpecValidation part.
fatalError("Package dependency should not be added as target dependency")
}
case .bundle:
if isTopLevel {
+16 -21
View File
@@ -110,6 +110,16 @@ public class SchemeGenerator {
case .local:
pbxProj = self.pbxProj
projectFilePath = "\(self.project.name).xcodeproj"
case .package(let packageName):
guard let package = self.project.getPackage(packageName), case .local(let path) = package else {
throw SchemeGenerationError.missingPackage(packageName)
}
return XCScheme.BuildableReference(
referencedContainer: "container:\(path)",
blueprintIdentifier: target.name,
buildableName: target.name,
blueprintName: target.name
)
}
guard let pbxTarget = pbxProj.targets(named: target.name).first else {
@@ -127,6 +137,8 @@ public class SchemeGenerator {
fatalError("Unable to determinate \"buildableName\" for build target: \(target)")
}
buildableName = _buildableName
case .package: // all `package` target should be handled above
fatalError("unexpected package target is handled")
}
return XCScheme.BuildableReference(
@@ -142,32 +154,12 @@ public class SchemeGenerator {
return XCScheme.BuildAction.Entry(buildableReference: buildableReference, buildFor: buildTarget.buildTypes)
}
func getBuildEntryForTestTarget(_ buildTarget: Scheme.BuildTarget) throws -> XCScheme.BuildAction.Entry {
// Need to check local Swift Package test case
func getBuildableReferenceForSPM(_ target: TargetReference) -> XCScheme.BuildableReference? {
if case .project(let project) = target.location,
let package = self.project.getPackage(project), case .local(let path) = package {
return XCScheme.BuildableReference(
referencedContainer: "container:\(path)",
blueprintIdentifier: target.name,
buildableName: target.name,
blueprintName: target.name
)
} else {
return nil
}
}
let buildableReference = try getBuildableReferenceForSPM(buildTarget.target) ?? getBuildableReference(buildTarget.target)
return XCScheme.BuildAction.Entry(buildableReference: buildableReference, buildFor: buildTarget.buildTypes)
}
let testTargets = scheme.test?.targets ?? []
let testBuildTargets = testTargets.map {
Scheme.BuildTarget(target: $0.targetReference, buildTypes: BuildType.testOnly)
}
let testBuildTargetEntries = try testBuildTargets.map(getBuildEntryForTestTarget)
let testBuildTargetEntries = try testBuildTargets.map(getBuildEntry)
let buildActionEntries: [XCScheme.BuildAction.Entry] = try scheme.build.targets.map(getBuildEntry)
@@ -378,6 +370,7 @@ public class SchemeGenerator {
enum SchemeGenerationError: Error, CustomStringConvertible {
case missingTarget(TargetReference, projectPath: String)
case missingPackage(String)
case missingProject(String)
case missingBuildTargets(String)
@@ -389,6 +382,8 @@ enum SchemeGenerationError: Error, CustomStringConvertible {
return "Unable to find project reference named \"\(project)\" in project.yml"
case .missingBuildTargets(let name):
return "Unable to find at least one build target in scheme \"\(name)\""
case .missingPackage(let package):
return "Unable to find swift package named \"\(package)\" in project.yml"
}
}
}