Added support for scheme management (#1142)

* wip

* Added scheme management metadata properties to TargetScheme

* wip

* Added Scheme.Management for metadata

* use sharedDefault

* move generateSchemeManagement to SchemeGenerator

* revert

* update changelog

* update docs

* update test case

* remove

* remove unused file

* revert

* changed on fixtures project

* Updated ProjectSpec docs index

* User Scheme.Management also for TargetSchemes, use XCUserData

* Changelog

* Switch XcodeProj back tuist/XcodeProj - 8.9.0

* Reindent TOC Docs/ProjectSpec.md

* Revert swift tools version

---------

Co-authored-by: Tieme van Veen <tiemevanveen@hotmail.com>
This commit is contained in:
Wendy Liga
2023-02-24 09:49:57 +11:00
committed by GitHub
co-authored by Tieme van Veen
parent 80e317206b
commit 43e40a9efc
24 changed files with 610 additions and 61 deletions
+19 -7
View File
@@ -13,22 +13,34 @@ public class ProjectGenerator {
self.project = project
}
public func generateXcodeProject(in projectDirectory: Path? = nil) throws -> XcodeProj {
public func generateXcodeProject(in projectDirectory: Path? = nil, userName: String) throws -> XcodeProj {
// generate PBXProj
let pbxProjGenerator = PBXProjGenerator(project: project,
projectDirectory: projectDirectory)
let pbxProj = try pbxProjGenerator.generate()
// generate Schemes
let schemeGenerator = SchemeGenerator(project: project, pbxProj: pbxProj)
let schemes = try schemeGenerator.generateSchemes()
// generate Workspace
let workspace = try generateWorkspace()
let sharedData = XCSharedData(schemes: schemes)
return XcodeProj(workspace: workspace, pbxproj: pbxProj, sharedData: sharedData)
// generate Schemes
let schemeGenerator = SchemeGenerator(project: project, pbxProj: pbxProj)
let (sharedSchemes, userSchemes, schemeManagement) = try schemeGenerator.generateSchemes()
// generate shared data
let sharedData = XCSharedData(schemes: sharedSchemes)
// generate user data
let userData = userSchemes.isEmpty && schemeManagement == nil ? [] : [
XCUserData(userName: userName, schemes: userSchemes, schemeManagement: schemeManagement)
]
return XcodeProj(
workspace: workspace,
pbxproj: pbxProj,
sharedData: sharedData,
userData: userData
)
}
func generateWorkspace() throws -> XCWorkspace {
+47 -14
View File
@@ -40,12 +40,15 @@ public class SchemeGenerator {
return pbxproj
}
public func generateSchemes() throws -> [XCScheme] {
var xcschemes: [XCScheme] = []
public func generateSchemes() throws -> (
shared: [XCScheme],
user: [XCScheme],
management: XCSchemeManagement?
) {
var schemes: [(Scheme, ProjectTarget?)] = []
for scheme in project.schemes {
let xcscheme = try generateScheme(scheme)
xcschemes.append(xcscheme)
schemes.append((scheme, nil))
}
for target in project.projectTargets {
@@ -64,19 +67,18 @@ public class SchemeGenerator {
debugConfig: debugConfig.name,
releaseConfig: releaseConfig.name
)
let xcscheme = try generateScheme(scheme, for: target)
xcschemes.append(xcscheme)
schemes.append((scheme, target))
} else {
for configVariant in targetScheme.configVariants {
let schemeName = "\(target.name) \(configVariant)"
let debugConfig = project.configs
.first(including: configVariant, for: .debug)!
let releaseConfig = project.configs
.first(including: configVariant, for: .release)!
let scheme = Scheme(
name: schemeName,
target: target,
@@ -85,14 +87,44 @@ public class SchemeGenerator {
debugConfig: debugConfig.name,
releaseConfig: releaseConfig.name
)
let xcscheme = try generateScheme(scheme, for: target)
xcschemes.append(xcscheme)
schemes.append((scheme, target))
}
}
}
}
return xcschemes
var sharedSchemes: [XCScheme] = []
var userSchemes: [XCScheme] = []
var schemeManagements: [XCSchemeManagement.UserStateScheme] = []
for (scheme, projectTarget) in schemes {
let xcscheme = try generateScheme(scheme, for: projectTarget)
if scheme.management?.shared == false {
userSchemes.append(xcscheme)
} else {
sharedSchemes.append(xcscheme)
}
if let management = scheme.management {
schemeManagements.append(
XCSchemeManagement.UserStateScheme(
name: scheme.name + ".xcscheme",
shared: management.shared,
orderHint: management.orderHint,
isShown: management.isShown
)
)
}
}
return (
shared: sharedSchemes,
user: userSchemes,
management: schemeManagements.isEmpty
? nil
: XCSchemeManagement(schemeUserState: schemeManagements, suppressBuildableAutocreation: nil)
)
}
public func generateScheme(_ scheme: Scheme, for target: ProjectTarget? = nil) throws -> XCScheme {
@@ -358,7 +390,7 @@ public class SchemeGenerator {
.flatMap { $0.type.isExtension ? true : nil }
)
}
private func launchAutomaticallySubstyle(for target: ProjectTarget?) -> String? {
if target?.type.isExtension == true {
return "2"
@@ -461,7 +493,8 @@ extension Scheme {
),
archive: .init(
config: releaseConfig
)
),
management: targetScheme.management
)
}