Add baseOnDependencyAnalysis to Project Spec Build Script (#992)

* Add baseOnDependencyAnalysis to BuildScript

* Add tests for baseOnDependencyAnalysis

* Update CHANGELOG.md
This commit is contained in:
Jierong Li 2020-12-03 06:52:24 +09:00 committed by GitHub
parent 6a5604f4b0
commit efed786cec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 32 additions and 10 deletions

View File

@ -6,6 +6,7 @@
- Support for building and running on Linux platforms. Tested for compatibility with Swift 5.3+ and Ubuntu 18.04. [#988](https://github.com/yonaskolb/XcodeGen/pull/988) @elliottwilliams
- Add `useBaseInternationalization` to Project Spec Options to opt out of Base Internationalization. [#961](https://github.com/yonaskolb/XcodeGen/pull/961) @liamnichols
- More detailed error message with method arguments. [#990](https://github.com/yonaskolb/XcodeGen/pull/990) @bannzai
- Added `baseOnDependencyAnalysis` to Project Spec Build Script to be able to choose not to skip the script. [#992](https://github.com/yonaskolb/XcodeGen/pull/992) @myihsan
#### Fixed
- Fixed error message output for `minimumXcodeGenVersion`. [#967](https://github.com/yonaskolb/XcodeGen/pull/967) @joshwalker

View File

@ -563,6 +563,7 @@ Each script can contain:
- [ ] **shell**: **String** - shell used for the script. Defaults to `/bin/sh`
- [ ] **showEnvVars**: **Bool** - whether the environment variables accessible to the script show be printed to the build log. Defaults to yes
- [ ] **runOnlyWhenInstalling**: **Bool** - whether the script is only run when installing (`runOnlyForDeploymentPostprocessing`). Defaults to no
- [ ] **baseOnDependencyAnalysis**: **Bool** - whether to skip the script if inputs, context, or outputs haven't changed. Defaults to yes
Either a **path** or **script** must be defined, the rest are optional.

View File

@ -4,6 +4,7 @@ import JSONUtilities
public struct BuildScript: Equatable {
public static let runOnlyWhenInstallingDefault = false
public static let showEnvVarsDefault = true
public static let baseOnDependencyAnalysisDefault = true
public var script: ScriptType
public var name: String?
@ -14,6 +15,7 @@ public struct BuildScript: Equatable {
public var outputFileLists: [String]
public var runOnlyWhenInstalling: Bool
public let showEnvVars: Bool
public let baseOnDependencyAnalysis: Bool
public enum ScriptType: Equatable {
case path(String)
@ -29,7 +31,8 @@ public struct BuildScript: Equatable {
outputFileLists: [String] = [],
shell: String? = nil,
runOnlyWhenInstalling: Bool = runOnlyWhenInstallingDefault,
showEnvVars: Bool = showEnvVarsDefault
showEnvVars: Bool = showEnvVarsDefault,
baseOnDependencyAnalysis: Bool = baseOnDependencyAnalysisDefault
) {
self.script = script
self.name = name
@ -40,6 +43,7 @@ public struct BuildScript: Equatable {
self.shell = shell
self.runOnlyWhenInstalling = runOnlyWhenInstalling
self.showEnvVars = showEnvVars
self.baseOnDependencyAnalysis = baseOnDependencyAnalysis
}
}
@ -61,6 +65,7 @@ extension BuildScript: JSONObjectConvertible {
shell = jsonDictionary.json(atKeyPath: "shell")
runOnlyWhenInstalling = jsonDictionary.json(atKeyPath: "runOnlyWhenInstalling") ?? BuildScript.runOnlyWhenInstallingDefault
showEnvVars = jsonDictionary.json(atKeyPath: "showEnvVars") ?? BuildScript.showEnvVarsDefault
baseOnDependencyAnalysis = jsonDictionary.json(atKeyPath: "baseOnDependencyAnalysis") ?? BuildScript.baseOnDependencyAnalysisDefault
}
}
@ -80,6 +85,10 @@ extension BuildScript: JSONEncodable {
dict["showEnvVars"] = showEnvVars
}
if baseOnDependencyAnalysis != BuildScript.baseOnDependencyAnalysisDefault {
dict["baseOnDependencyAnalysis"] = baseOnDependencyAnalysis
}
switch script {
case .path(let string):
dict["path"] = string

View File

@ -478,7 +478,8 @@ public class PBXProjGenerator {
shellPath: buildScript.shell ?? "/bin/sh",
shellScript: shellScript,
runOnlyForDeploymentPostprocessing: buildScript.runOnlyWhenInstalling,
showEnvVarsInLog: buildScript.showEnvVars
showEnvVarsInLog: buildScript.showEnvVars,
alwaysOutOfDate: !buildScript.baseOnDependencyAnalysis
)
return addObject(shellScriptPhase)
}

View File

@ -2115,6 +2115,7 @@
};
71A4CC6ECC8522178F566E7B /* Strip Unused Architectures from Frameworks */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);

View File

@ -144,6 +144,7 @@ targets:
- path: scripts/strip-frameworks.sh
name: Strip Unused Architectures from Frameworks
runOnlyWhenInstalling: true
baseOnDependencyAnalysis: false
- name: MyScript
script: |
echo "You ran a script!"

View File

@ -388,7 +388,8 @@ class ProjectSpecTests: XCTestCase {
outputFileLists: ["bar.xcfilelist"],
shell: "/bin/bash",
runOnlyWhenInstalling: true,
showEnvVars: true)],
showEnvVars: true,
baseOnDependencyAnalysis: false)],
postCompileScripts: [BuildScript(script: .path("cmd.sh"),
name: "Bar script",
inputFiles: ["foo"],
@ -397,7 +398,8 @@ class ProjectSpecTests: XCTestCase {
outputFileLists: ["bar.xcfilelist"],
shell: "/bin/bash",
runOnlyWhenInstalling: true,
showEnvVars: true)],
showEnvVars: true,
baseOnDependencyAnalysis: false)],
postBuildScripts: [BuildScript(script: .path("cmd.sh"),
name: "an another script",
inputFiles: ["foo"],
@ -406,7 +408,8 @@ class ProjectSpecTests: XCTestCase {
outputFileLists: ["bar.xcfilelist"],
shell: "/bin/bash",
runOnlyWhenInstalling: true,
showEnvVars: true)],
showEnvVars: true,
baseOnDependencyAnalysis: false)],
buildRules: [BuildRule(fileType: .pattern("*.xcassets"),
action: .script("pre_process_swift.py"),
name: "My Build Rule",
@ -455,7 +458,8 @@ class ProjectSpecTests: XCTestCase {
outputFileLists: ["bar.xcfilelist"],
shell: "/bin/bash",
runOnlyWhenInstalling: true,
showEnvVars: false)],
showEnvVars: false,
baseOnDependencyAnalysis: false)],
scheme: TargetScheme(testTargets: [Scheme.Test.TestTarget(targetReference: "test target",
randomExecutionOrder: false,
parallelizable: false)],

View File

@ -1052,8 +1052,10 @@ class SpecLoadingTests: XCTestCase {
["path": "script.sh"],
["script": "shell script\ndo thing", "name": "myscript", "inputFiles": ["file", "file2"], "outputFiles": ["file", "file2"], "shell": "bin/customshell", "runOnlyWhenInstalling": true],
["script": "shell script\ndo thing", "name": "myscript", "inputFiles": ["file", "file2"], "outputFiles": ["file", "file2"], "shell": "bin/customshell", "showEnvVars": false],
["script": "shell script\ndo thing", "name": "myscript", "inputFiles": ["file", "file2"], "outputFiles": ["file", "file2"], "shell": "bin/customshell", "baseOnDependencyAnalysis": false],
["script": "shell script\nwith file lists", "name": "myscript", "inputFileLists": ["inputList.xcfilelist"], "outputFileLists": ["outputList.xcfilelist"], "shell": "bin/customshell", "runOnlyWhenInstalling": true],
["script": "shell script\nwith file lists", "name": "myscript", "inputFileLists": ["inputList.xcfilelist"], "outputFileLists": ["outputList.xcfilelist"], "shell": "bin/customshell", "showEnvVars": false],
["script": "shell script\nwith file lists", "name": "myscript", "inputFileLists": ["inputList.xcfilelist"], "outputFileLists": ["outputList.xcfilelist"], "shell": "bin/customshell", "baseOnDependencyAnalysis": false],
]
target["preBuildScripts"] = scripts
target["postCompileScripts"] = scripts
@ -1061,10 +1063,12 @@ class SpecLoadingTests: XCTestCase {
let expectedScripts = [
BuildScript(script: .path("script.sh")),
BuildScript(script: .script("shell script\ndo thing"), name: "myscript", inputFiles: ["file", "file2"], outputFiles: ["file", "file2"], shell: "bin/customshell", runOnlyWhenInstalling: true, showEnvVars: true),
BuildScript(script: .script("shell script\ndo thing"), name: "myscript", inputFiles: ["file", "file2"], outputFiles: ["file", "file2"], shell: "bin/customshell", runOnlyWhenInstalling: false, showEnvVars: false),
BuildScript(script: .script("shell script\nwith file lists"), name: "myscript", inputFileLists: ["inputList.xcfilelist"], outputFileLists: ["outputList.xcfilelist"], shell: "bin/customshell", runOnlyWhenInstalling: true, showEnvVars: true),
BuildScript(script: .script("shell script\nwith file lists"), name: "myscript", inputFileLists: ["inputList.xcfilelist"], outputFileLists: ["outputList.xcfilelist"], shell: "bin/customshell", runOnlyWhenInstalling: false, showEnvVars: false),
BuildScript(script: .script("shell script\ndo thing"), name: "myscript", inputFiles: ["file", "file2"], outputFiles: ["file", "file2"], shell: "bin/customshell", runOnlyWhenInstalling: true, showEnvVars: true, baseOnDependencyAnalysis: true),
BuildScript(script: .script("shell script\ndo thing"), name: "myscript", inputFiles: ["file", "file2"], outputFiles: ["file", "file2"], shell: "bin/customshell", runOnlyWhenInstalling: false, showEnvVars: false, baseOnDependencyAnalysis: true),
BuildScript(script: .script("shell script\ndo thing"), name: "myscript", inputFiles: ["file", "file2"], outputFiles: ["file", "file2"], shell: "bin/customshell", runOnlyWhenInstalling: false, showEnvVars: true, baseOnDependencyAnalysis: false),
BuildScript(script: .script("shell script\nwith file lists"), name: "myscript", inputFileLists: ["inputList.xcfilelist"], outputFileLists: ["outputList.xcfilelist"], shell: "bin/customshell", runOnlyWhenInstalling: true, showEnvVars: true, baseOnDependencyAnalysis: true),
BuildScript(script: .script("shell script\nwith file lists"), name: "myscript", inputFileLists: ["inputList.xcfilelist"], outputFileLists: ["outputList.xcfilelist"], shell: "bin/customshell", runOnlyWhenInstalling: false, showEnvVars: false, baseOnDependencyAnalysis: true),
BuildScript(script: .script("shell script\nwith file lists"), name: "myscript", inputFileLists: ["inputList.xcfilelist"], outputFileLists: ["outputList.xcfilelist"], shell: "bin/customshell", runOnlyWhenInstalling: false, showEnvVars: true, baseOnDependencyAnalysis: false),
]
let parsedTarget = try Target(name: "test", jsonDictionary: target)