@@ -167,7 +167,7 @@ public class SchemeGenerator {
167
167
168
168
let testBuildTargetEntries = try testBuildTargets. map ( getBuildEntry)
169
169
170
- let buildActionEntries : [ XCScheme . BuildAction . Entry ] = try scheme. build. targets. map ( getBuildEntry)
170
+ let buildActionEntries : [ XCScheme . BuildAction . Entry ] = try scheme. build? . targets. map ( getBuildEntry) ?? [ ]
171
171
172
172
func getExecutionAction( _ action: Scheme . ExecutionAction ) -> XCScheme . ExecutionAction {
173
173
// ExecutionActions can require the use of build settings. Xcode allows the settings to come from a build or test target.
@@ -183,27 +183,42 @@ public class SchemeGenerator {
183
183
184
184
if let targetName = scheme. run? . executable {
185
185
schemeTarget = project. getTarget ( targetName)
186
- } else {
187
- guard let firstTarget = scheme. build. targets. first else {
188
- throw SchemeGenerationError . missingBuildTargets ( scheme . name )
189
- }
190
- let name = scheme . build . targets. first { $0. buildTypes. contains ( . running) } ? . target. name ?? firstTarget. target. name
186
+ } else if
187
+ let targets = scheme. build? . targets,
188
+ let firstTarget = targets . first
189
+ {
190
+ let name = targets. first { $0. buildTypes. contains ( . running) } ? . target. name ?? firstTarget. target. name
191
191
schemeTarget = target ?? project. getTarget ( name)
192
+ } else {
193
+ schemeTarget = nil
192
194
}
193
195
194
196
let shouldExecuteOnLaunch = schemeTarget? . shouldExecuteOnLaunch == true
197
+ let buildableReference : XCScheme . BuildableReference ?
198
+ let buildAction : XCScheme . BuildAction ?
199
+ let runnables : ( launch: XCScheme . Runnable , profile: XCScheme . BuildableProductRunnable ) ?
200
+
201
+ if let buildableReferenceCandidate = buildActionEntries. first ( where: { $0. buildableReference. blueprintName == schemeTarget? . name } ) ? . buildableReference ?? buildActionEntries. first? . buildableReference
202
+ {
203
+ runnables = makeProductRunnables ( for: schemeTarget, buildableReference: buildableReferenceCandidate)
204
+
205
+ buildableReference = buildableReferenceCandidate
206
+ buildAction = scheme. build. flatMap { build in
207
+ XCScheme . BuildAction (
208
+ buildActionEntries: buildActionEntries,
209
+ preActions: build. preActions. map ( getExecutionAction) ,
210
+ postActions: build. postActions. map ( getExecutionAction) ,
211
+ parallelizeBuild: build. parallelizeBuild,
212
+ buildImplicitDependencies: build. buildImplicitDependencies,
213
+ runPostActionsOnFailure: build. runPostActionsOnFailure
214
+ )
215
+ }
216
+ } else {
217
+ buildableReference = nil
218
+ buildAction = nil
219
+ runnables = nil
220
+ }
195
221
196
- let buildableReference = buildActionEntries. first ( where: { $0. buildableReference. blueprintName == schemeTarget? . name } ) ? . buildableReference ?? buildActionEntries. first!. buildableReference
197
- let runnables = makeProductRunnables ( for: schemeTarget, buildableReference: buildableReference)
198
-
199
- let buildAction = XCScheme . BuildAction (
200
- buildActionEntries: buildActionEntries,
201
- preActions: scheme. build. preActions. map ( getExecutionAction) ,
202
- postActions: scheme. build. postActions. map ( getExecutionAction) ,
203
- parallelizeBuild: scheme. build. parallelizeBuild,
204
- buildImplicitDependencies: scheme. build. buildImplicitDependencies,
205
- runPostActionsOnFailure: scheme. build. runPostActionsOnFailure
206
- )
207
222
208
223
let testables : [ XCScheme . TestableReference ] = zip ( testTargets, testBuildTargetEntries) . map { testTarget, testBuildEntries in
209
224
@@ -298,7 +313,7 @@ public class SchemeGenerator {
298
313
}
299
314
300
315
let launchAction = XCScheme . LaunchAction (
301
- runnable: shouldExecuteOnLaunch ? runnables. launch : nil ,
316
+ runnable: shouldExecuteOnLaunch ? runnables? . launch : nil ,
302
317
buildConfiguration: scheme. run? . config ?? defaultDebugConfig. name,
303
318
preActions: scheme. run? . preActions. map ( getExecutionAction) ?? [ ] ,
304
319
postActions: scheme. run? . postActions. map ( getExecutionAction) ?? [ ] ,
@@ -321,7 +336,7 @@ public class SchemeGenerator {
321
336
)
322
337
323
338
let profileAction = XCScheme . ProfileAction (
324
- buildableProductRunnable: shouldExecuteOnLaunch ? runnables. profile : nil ,
339
+ buildableProductRunnable: shouldExecuteOnLaunch ? runnables? . profile : nil ,
325
340
buildConfiguration: scheme. profile? . config ?? defaultReleaseConfig. name,
326
341
preActions: scheme. profile? . preActions. map ( getExecutionAction) ?? [ ] ,
327
342
postActions: scheme. profile? . postActions. map ( getExecutionAction) ?? [ ] ,
@@ -403,16 +418,13 @@ enum SchemeGenerationError: Error, CustomStringConvertible {
403
418
case missingTarget( TargetReference , projectPath: String )
404
419
case missingPackage( String )
405
420
case missingProject( String )
406
- case missingBuildTargets( String )
407
421
408
422
var description : String {
409
423
switch self {
410
424
case . missingTarget( let target, let projectPath) :
411
425
return " Unable to find target named \" \( target) \" in \" \( projectPath) \" "
412
426
case . missingProject( let project) :
413
427
return " Unable to find project reference named \" \( project) \" in project.yml "
414
- case . missingBuildTargets( let name) :
415
- return " Unable to find at least one build target in scheme \" \( name) \" "
416
428
case . missingPackage( let package ) :
417
429
return " Unable to find swift package named \" \( package ) \" in project.yml "
418
430
}
0 commit comments