Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update spec generation with latest releases #1249

Open
wants to merge 56 commits into
base: spec-generation
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
e2f062b
erouska (#1107)
RomanPodymov Jul 15, 2021
d35d22f
Added support for dependency destination specification. (Resolves #10…
JakubBednar Jul 15, 2021
a4d7a61
Fix broken codesign option for bundle dependency (#1104)
kateinoigakukun Jul 15, 2021
b046888
[bug fix] Ensure fileTypes are mapped to JSON value (#1112)
namolnad Aug 2, 2021
f1e888f
Fix Usage.md link to options section (#1115)
adamawolf Aug 10, 2021
12511af
Fix platformFilter for package dependencies (#1123)
raptorxcz Sep 14, 2021
c3d936c
update changelog
yonaskolb Sep 23, 2021
322262c
Update tuist/XcodeProj (#1125)
nnsnodnb Sep 23, 2021
fa6c5c9
Fix Xcode 13 build (alternate PR to kick CI) (#1130)
mthole Sep 23, 2021
abb1864
Update to 2.25.0
yonaskolb Sep 23, 2021
c8b2a4a
update changelog
yonaskolb Sep 23, 2021
1d3412e
Fix Graphviz on Mac URL in README. (#1134)
yimajo Oct 3, 2021
10fb431
Speed up search by using parallel Glob and Binary Search for includin…
PaulTaykalo Oct 7, 2021
c62277f
Added location option to test target (#1153)
KrisRJack Jan 7, 2022
62b9bea
ignore vscode
yonaskolb Feb 6, 2022
9bd8ad1
Update to 2.26.0
yonaskolb Feb 6, 2022
d218ada
fix archive if repo path has spaces
yonaskolb Feb 9, 2022
a10c7c4
Fixed Glob crash (#1181)
tr1ckyf0x Mar 6, 2022
3b5ca91
Add coverage targets for target schemes (#1189)
gabriellanata Mar 17, 2022
07fa819
Update CHANGELOG.md
yonaskolb Mar 17, 2022
7b9d95a
Skip compile sources for watch apps (#1185)
evandcoleman Mar 20, 2022
e77caa8
add .gyb as an accepted source file (#1191)
hakkurishian Mar 20, 2022
146eaad
Update CHANGELOG.md
yonaskolb Mar 20, 2022
245f171
Support test target for local Swift Package (#1169)
freddi-kit Mar 20, 2022
8ff92cf
Update CHANGELOG.md
yonaskolb Mar 20, 2022
d7accac
Update to 2.27.0
yonaskolb Mar 20, 2022
f6cdd09
use new TestableTargetReference in TargetScheme.coverageTargets
yonaskolb Mar 20, 2022
8530da5
fix(carthage): shell login (#1179)
bimawa Mar 21, 2022
5350e26
Update CHANGELOG.md
yonaskolb Mar 21, 2022
be0c3c3
Added ability to use custom location for local Swift packages (#1175)
John-Connolly Mar 25, 2022
50aa8c5
Fixed segmentation fault crash (#1198)
tr1ckyf0x Mar 31, 2022
17e7b03
Run target source pattern matching in parallel (#1197)
alvarhansen Mar 31, 2022
4fbdc9d
Update to 2.28.0
yonaskolb Mar 31, 2022
322c565
update changelog
yonaskolb Mar 31, 2022
958ae1b
simplify changelog PR links
yonaskolb Mar 31, 2022
fd8aa8f
simplify changelog and remove commit links
yonaskolb Mar 31, 2022
047e996
Fix docc support (#1202)
hiragram Apr 5, 2022
e35f7df
Add Test Plans (#716)
yonaskolb May 10, 2022
0822efa
update xcodeproj (#1213)
yonaskolb May 10, 2022
29bcb92
Update to 2.29.0
yonaskolb May 10, 2022
a2348d0
Example of vscode usage as a development environment (#1218)
markst Jun 15, 2022
f65dad7
Speed up SettingsBuilder (#1221)
jpsim Jun 16, 2022
19817f3
Fix `watchapp2-container` product name (#1219)
lucabartoletti Jul 16, 2022
c082bc0
Fix XcodeGen building after XcodeProj update to 8.8.0 (#1228)
aleksproger Jul 16, 2022
c1d5c65
Update to 2.30.0
yonaskolb Jul 16, 2022
da8aad0
Add a new CopyFilesBuildPhase, "Embed ExtensionKit Extensions" (#1230)
mtj0928 Jul 21, 2022
24572da
Added duplicate dependencies validation (#1234)
aleksproger Jul 24, 2022
de2a537
Update to 2.31.0
yonaskolb Jul 24, 2022
ff552f3
Handle mlmodelc as a single unit (#1237)
antonsergeev88 Jul 31, 2022
34f50d6
Correct name of package in example yaml (#1240)
hisaac Aug 1, 2022
ac525a4
remove redundant bracket (#1243)
Shinolr Aug 9, 2022
e9295f1
Fix profile action to not run frameworks (#1245)
SSheldon Aug 11, 2022
594c67f
Add `enable` option for `include` to enable optional including for ad…
freddi-kit Aug 12, 2022
ebf70f1
Update to 2.32.0
yonaskolb Aug 18, 2022
e67fd31
Merge branch 'master' into spec-generation
skofgar Aug 19, 2022
fe0017f
update targets from "TargetReference" to "TestableTargetReference"
skofgar Aug 19, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ on:
pull_request: {}
jobs:
run:
runs-on: macOS-latest
runs-on: macos-11
name: Xcode ${{ matrix.xcode }}
strategy:
matrix:
xcode: ["12"]
xcode: ["12.5.1", "13.0"]
steps:
- uses: actions/checkout@master
- name: Set Xcode
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ xcuserdata
*.xcuserstate
XcodeGen.xcodeproj
xcodegen.zip
.vscode/launch.json
1,129 changes: 629 additions & 500 deletions CHANGELOG.md

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions Docs/Examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ These are a bunch of real world examples of XcodeGen project specs. Feel free to
- [scelis/XcodeGen-TestStickers](https://github.com/scelis/XcodeGen-TestStickers/blob/master/project.yml)
- [minvws/nl-covid19-notification-app-ios](https://github.com/minvws/nl-covid19-notification-app-ios/blob/master/project.yml)
- [pvinis/react-native-xcodegen](https://github.com/pvinis/react-native-xcodegen/blob/master/templates)
- [covid19cz/erouska-ios](https://github.com/covid19cz/erouska-ios/blob/develop/project.yml)
- [markst/hotreloading-vscode-ios](https://github.com/markst/hotreloading-vscode-ios)
72 changes: 66 additions & 6 deletions Docs/ProjectSpec.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,13 @@ An include can be provided via a string (the path) or an object of the form:

- [x] **path**: **String** - The path to the included file.
- [ ] **relativePaths**: **Bool** - Dictates whether the included spec specifies paths relative to itself (the default) or the root spec file.

- [ ] **enable**: **Bool** - Dictates whether the specified spec should be included or not. You can also specify it by environment variable.
```yaml
include:
- includedFile.yml
- path: path/to/includedFile.yml
relativePaths: false
enable: ${INCLUDE_ADDITIONAL_YAML}
```

By default specs are merged additively. That is for every value:
Expand Down Expand Up @@ -114,6 +115,7 @@ Note that target names can also be changed by adding a `name` property to a targ
- [ ] **disabledValidations**: **[String]** - A list of validations that can be disabled if they're too strict for your use case. By default this is set to an empty array. Currently these are the available options:
- `missingConfigs`: Disable errors for configurations in yaml files that don't exist in the project itself. This can be useful if you include the same yaml file in different projects
- `missingConfigFiles`: Disable checking for the existence of configuration files. This can be useful for generating a project in a context where config files are not available.
- `missingTestPlans`: Disable checking if test plan paths exist. This can be useful if your test plans haven't been created yet.
- [ ] **defaultConfig**: **String** - The default configuration for command line builds from Xcode. If the configuration provided here doesn't match one in your [configs](#configs) key, XcodeGen will fail. If you don't set this, the first configuration alphabetically will be chosen.
- [ ] **groupSortPosition**: **String** - Where groups are sorted in relation to other files. Either:
- `none` - sorted alphabetically with all the other files
Expand Down Expand Up @@ -273,6 +275,7 @@ This will provide default build settings for a certain product type. It can be a
- `application.messages`
- `application.watchapp`
- `application.watchapp2`
- `application.watchapp2-container`
- `app-extension`
- `app-extension.intents-service`
- `app-extension.messages`
Expand All @@ -281,14 +284,14 @@ This will provide default build settings for a certain product type. It can be a
- `bundle.ocunit-test`
- `bundle.ui-testing`
- `bundle.unit-test`
- `extensionkit-extension`
- `framework`
- `instruments-package`
- `library.dynamic`
- `library.static`
- `framework.static`
- `tool`
- `tv-app-extension`
- `watchapp2-container`
- `watchkit-extension`
- `watchkit2-extension`
- `xcode-extension`
Expand Down Expand Up @@ -432,6 +435,19 @@ A dependency can be one of a 6 types:
- [ ] **weak**: **Bool** - Whether the `Weak` setting is applied when linking the framework. Defaults to false
- [ ] **platformFilter**: **String** - This field is specific to Mac Catalyst. It corresponds to the "Platforms" dropdown in the Frameworks & Libraries section of Target settings in Xcode. Available options are: **iOS**, **macOS** and **all**. Defaults is **all**
- [ ] **platforms**: **[[Platform](#platform)]** - List of platforms this dependency should apply to. Defaults to all applicable platforms.
- **copy** - Copy Files Phase for this dependency. This only applies when `embed` is true. Must be specified as an object with the following fields:
- [x] **destination**: **String** - Destination of the Copy Files phase. This can be one of the following values:
- `absolutePath`
- `productsDirectory`
- `wrapper`
- `executables`
- `resources`
- `javaResources`
- `frameworks`
- `sharedFrameworks`
- `sharedSupport`
- `plugins`
- [ ] **subpath**: **String** - The path inside of the destination to copy the files.

**Implicit Framework options**:

Expand Down Expand Up @@ -640,13 +656,15 @@ This is a convenience used to automatically generate schemes for a target based
- [x] **configVariants**: **[String]** - This generates a scheme for each entry, using configs that contain the name with debug and release variants. This is useful for having different environment schemes.
- [ ] **testTargets**: **[[Test Target](#test-target)]** - a list of test targets that should be included in the scheme. These will be added to the build targets and the test entries. Each entry can either be a simple string, or a [Test Target](#test-target)
- [ ] **gatherCoverageData**: **Bool** - a boolean that indicates if this scheme should gather coverage data. This defaults to false
- [ ] **coverageTargets**: **[[Testable Target Reference](#testable-target-reference) - a list of targets to gather code coverage. Each entry can either be a simple string, a string using [Project Reference](#project-reference) or [Testable Target Reference](#testable-target-reference)
- [ ] **disableMainThreadChecker**: **Bool** - a boolean that indicates if this scheme should disable the Main Thread Checker. This defaults to false
- [ ] **stopOnEveryMainThreadCheckerIssue**: **Bool** - a boolean that indicates if this scheme should stop at every Main Thread Checker issue. This defaults to false
- [ ] **buildImplicitDependencies**: **Bool** - Flag to determine if Xcode should build implicit dependencies of this scheme. By default this is `true` if not set.
- [ ] **language**: **String** - a String that indicates the language used for running and testing. This defaults to nil
- [ ] **region**: **String** - a String that indicates the region used for running and testing. This defaults to nil
- [ ] **commandLineArguments**: **[String:Bool]** - a dictionary from the argument name (`String`) to if it is enabled (`Bool`). These arguments will be added to the Test, Profile and Run scheme actions
- [ ] **environmentVariables**: **[[Environment Variable](#environment-variable)]** or **[String:String]** - environment variables for Run, Test and Profile scheme actions. When passing a dictionary, every key-value entry maps to a corresponding variable that is enabled.
- [ ] **testPlans**: **[[Test Plan](#test-plan)]** - List of test plan locations that will be referenced in the scheme.
- [ ] **preActions**: **[[Execution Action](#execution-action)]** - Scripts that are run *before* the build action
- [ ] **postActions**: **[[Execution Action](#execution-action)]** - Scripts that are run *after* the build action
- [ ] **storeKitConfiguration**: **String** - specify storekit configuration to use during run. See [Options](#options).
Expand Down Expand Up @@ -678,6 +696,9 @@ targets:
- Staging
- Production
gatherCoverageData: true
coverageTargets:
- MyTarget1
- ExternalTarget/OtherTarget1
commandLineArguments:
"-MyEnabledArg": true
"-MyDisabledArg": false
Expand Down Expand Up @@ -709,7 +730,7 @@ This is used to override settings or run build scripts in specific targets

## Target Template

This is a template that can be referenced from a normal target using the `templates` property. The properties of this template are the same as a [Target](#target)].
This is a template that can be referenced from a normal target using the `templates` property. The properties of this template are the same as a [Target](#target).
Any instances of `${target_name}` within each template will be replaced by the final target name which references the template.
Any attributes defined within a targets `templateAttributes` will be used to replace any attribute references in the template using the syntax `${attribute_name}`.

Expand Down Expand Up @@ -811,20 +832,36 @@ A multiline script can be written using the various YAML multiline methods, for
### Test Action

- [ ] **gatherCoverageData**: **Bool** - a boolean that indicates if this scheme should gather coverage data. This defaults to false
- [ ] **coverageTargets**: **[String]** - a list of targets to gather code coverage. Each entry can either be a simple string, or a string using [Project Reference](#project-reference)
- [ ] **coverageTargets**: **[[Testable Target Reference](#testable-target-reference)]** - a list of targets to gather code coverage. Each entry can either be a simple string, a string using [Project Reference](#project-reference) or [Testable Target Reference](#testable-target-reference)
- [ ] **targets**: **[[Test Target](#test-target)]** - a list of targets to test. Each entry can either be a simple string, or a [Test Target](#test-target)
- [ ] **customLLDBInit**: **String** - the absolute path to the custom `.lldbinit` file
- [ ] **captureScreenshotsAutomatically**: **Bool** - indicates whether screenshots should be captured automatically while UI Testing. This defaults to true.
- [ ] **deleteScreenshotsWhenEachTestSucceeds**: **Bool** - whether successful UI tests should cause automatically-captured screenshots to be deleted. If `captureScreenshotsAutomatically` is false, this value is ignored. This defaults to true.
- [ ] **testPlans**: **[[Test Plan](#test-plan)]** - List of test plan locations that will be referenced in the scheme.

#### Test Target
- [x] **name**: **String** - The name of the target
A target can be one of a 2 types:

- **name**: **String** - The name of the target.
- **target**: **[Testable Target Reference](#testable-target-reference)** - The information of the target. You can specify more detailed information than `name:`.

As syntax suger, you can also specify **[Testable Target Reference](#testable-target-reference)** without `target`.

#### Other Parameters

- [ ] **parallelizable**: **Bool** - Whether to run tests in parallel. Defaults to false
- [ ] **randomExecutionOrder**: **Bool** - Whether to run tests in a random order. Defaults to false
- [ ] **location**: **String** - GPX file or predefined value for simulating location. See [Simulate Location](#simulate-location) for location examples.
- [ ] **skipped**: **Bool** - Whether to skip all of the test target tests. Defaults to false
- [ ] **skippedTests**: **[String]** - List of tests in the test target to skip. Defaults to empty
- [ ] **selectedTests**: **[String]** - List of tests in the test target to whitelist and select. Defaults to empty. This will override `skippedTests` if provided

#### Testable Target Reference
A Testable Target Reference can be one of 3 types:
- `package: {local-swift-package-name}/{target-name}`: Name of local swift package and its target.
- `local: {target-name}`: Name of local target.
- `project: {project-reference-name}/{target-name}`: Name of local swift package and its target.

### Archive Action

- [ ] **customArchiveName**: **String** - the custom name to give to the archive
Expand Down Expand Up @@ -884,12 +921,16 @@ schemes:
coverageTargets:
- MyTarget1
- ExternalTarget/OtherTarget1
- package: LocalPackage/TestTarget
targets:
- Tester1
- name: Tester2
parallelizable: true
randomExecutionOrder: true
skippedTests: [Test/testExample()]
- package: APIClient/APIClientTests
parallelizable: true
randomExecutionOrder: true
environmentVariables:
- variable: TEST_ENV_VAR
value: VALUE
Expand All @@ -904,6 +945,21 @@ schemes:
revealArchiveInOrganizer: false
```

### Test Plan
For now test plans are not generated by XcodeGen and must be created in Xcode and checked in, and then referenced by path. If the test targets are added, removed or renamed, the test plans may need to be updated in Xcode.

- [x] **path**: **String** - path that provides the `xctestplan` location.
- [ ] **defaultPlan**: **Bool** - a bool that defines if given plan is the default one. Defaults to false. If no default is set on any test plan, the first plan is set as the default.

```yaml
schemes:
TestTarget:
test:
testPlans:
- path: app.xctestplan
defaultPlan: true
```

## Scheme Template

This is a template that can be referenced from a normal scheme using the `templates` property. The properties of this template are the same as a [Scheme](#scheme). This functions identically in practice to [Target Template](#target-template).
Expand Down Expand Up @@ -957,17 +1013,21 @@ Swift packages are defined at a project level, and then linked to individual tar
### Local Package

- [x] **path**: **String** - the path to the package in local. The path must be directory with a `Package.swift`.
- [ ] **group** : **String**- Optional path that specifies the location where the package will live in your xcode project.

```yml
packages:
Yams:
url: https://github.com/jpsim/Yams
from: 2.0.0
Yams:
Ink:
github: JohnSundell/Ink
from: 0.5.0
RxClient:
path: ../RxClient
AppFeature:
path: ../Packages
group: Domains/AppFeature
```

## Project Reference
Expand Down
2 changes: 1 addition & 1 deletion Docs/Usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ The values from [xcconfig files](#xcconfig-files) will then sit a level above th
XcodeGen applies default settings to your project and targets similar to how Xcode creates them when you create a new project or target.
Debug and Release settings will be applied to your project. Targets will also get specific settings depending on the platform and product type.

>You can change or disable how these setting presets are applied via the `options.settingPresets` which you can find more about in [Options](#options)
>You can change or disable how these setting presets are applied via the `options.settingPresets` which you can find more about in [Options](ProjectSpec.md#options)

### Settings
The `project` and each `target` have a `settings` object that you can define. This can be a simple map of build settings or can provide build settings per `config` via `configs` or `base`. See [Settings](ProjectSpec.md#settings) for more details.
Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
TOOL_NAME = XcodeGen
export EXECUTABLE_NAME = xcodegen
VERSION = 2.24.0
VERSION = 2.32.0

PREFIX = /usr/local
INSTALL_PATH = $(PREFIX)/bin/$(EXECUTABLE_NAME)
Expand Down Expand Up @@ -46,4 +46,4 @@ brew:
brew bump-formula-pr --url=$(RELEASE_TAR) XcodeGen

archive: build
./scripts/archive.sh $(EXECUTABLE_PATH)
./scripts/archive.sh "$(EXECUTABLE_PATH)"
4 changes: 2 additions & 2 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@
"repositoryURL": "https://github.com/tuist/XcodeProj.git",
"state": {
"branch": null,
"revision": "446f3a0db73e141c7f57e26fcdb043096b1db52c",
"version": "8.3.1"
"revision": "b6de1bfe021b861c94e7c83821b595083f74b997",
"version": "8.8.0"
}
},
{
Expand Down
6 changes: 3 additions & 3 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ let package = Package(
.library(name: "ProjectSpec", targets: ["ProjectSpec"]),
],
dependencies: [
.package(url: "https://github.com/kylef/PathKit.git", from: "1.0.0"),
.package(url: "https://github.com/kylef/PathKit.git", from: "1.0.1"),
.package(url: "https://github.com/jpsim/Yams.git", from: "4.0.0"),
.package(url: "https://github.com/yonaskolb/JSONUtilities.git", from: "4.2.0"),
.package(url: "https://github.com/kylef/Spectre.git", from: "0.9.2"),
.package(url: "https://github.com/onevcat/Rainbow.git", from: "3.0.0"),
.package(url: "https://github.com/tuist/XcodeProj.git", from: "8.0.0"),
.package(url: "https://github.com/jakeheis/SwiftCLI.git", from: "6.0.0"),
.package(url: "https://github.com/tuist/XcodeProj.git", from: "8.8.0"),
.package(url: "https://github.com/jakeheis/SwiftCLI.git", from: "6.0.3"),
.package(url: "https://github.com/mxcl/Version", from: "2.0.0"),
.package(url: "https://github.com/SwiftDocOrg/GraphViz.git", .exact("0.2.0")),
],
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ swift run xcodegen
Add the following to your Package.swift file's dependencies:

```swift
.package(url: "https://github.com/yonaskolb/XcodeGen.git", from: "2.24.0"),
.package(url: "https://github.com/yonaskolb/XcodeGen.git", from: "2.32.0"),
```

And then import wherever needed: `import XcodeGenKit`
Expand Down Expand Up @@ -156,7 +156,7 @@ To a file:
xcodegen dump --type graphviz --file Graph.viz
```

During implementation, `graphviz` formatting was validated using [GraphvizOnline](https://dreampuf.github.io/GraphvizOnline/), [WebGraphviz](http://www.webgraphviz.com), and [Graphviz on MacOS](graphviz.org).
During implementation, `graphviz` formatting was validated using [GraphvizOnline](https://dreampuf.github.io/GraphvizOnline/), [WebGraphviz](http://www.webgraphviz.com), and [Graphviz on MacOS](https://graphviz.org).
</details>

## Editing
Expand Down
14 changes: 11 additions & 3 deletions Sources/ProjectSpec/Dependency.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public struct Dependency: Equatable {
public var weakLink: Bool = weakLinkDefault
public var platformFilter: PlatformFilter = platformFilterDefault
public var platforms: Set<Platform>?
public var copyPhase: BuildPhaseSpec.CopyFilesSettings?

public init(
type: DependencyType,
Expand All @@ -27,7 +28,8 @@ public struct Dependency: Equatable {
implicit: Bool = implicitDefault,
weakLink: Bool = weakLinkDefault,
platformFilter: PlatformFilter = platformFilterDefault,
platforms: Set<Platform>? = nil
platforms: Set<Platform>? = nil,
copyPhase: BuildPhaseSpec.CopyFilesSettings? = nil
) {
self.type = type
self.reference = reference
Expand All @@ -38,6 +40,7 @@ public struct Dependency: Equatable {
self.weakLink = weakLink
self.platformFilter = platformFilter
self.platforms = platforms
self.copyPhase = copyPhase
}

public enum PlatformFilter: String, Equatable {
Expand All @@ -53,7 +56,7 @@ public struct Dependency: Equatable {
public static let `default` = dynamic
}

public enum DependencyType: Equatable {
public enum DependencyType: Hashable {
case target
case framework
case carthage(findFrameworks: Bool?, linkType: CarthageLinkType)
Expand Down Expand Up @@ -135,6 +138,10 @@ extension Dependency: JSONObjectConvertible {
if let platforms: [ProjectSpec.Platform] = jsonDictionary.json(atKeyPath: "platforms") {
self.platforms = Set(platforms)
}

if let object: JSONDictionary = jsonDictionary.json(atKeyPath: "copy") {
copyPhase = try BuildPhaseSpec.CopyFilesSettings(jsonDictionary: object)
}
}
}

Expand All @@ -144,7 +151,8 @@ extension Dependency: JSONEncodable {
"embed": embed,
"codeSign": codeSign,
"link": link,
"platforms": platforms?.map(\.rawValue).sorted()
"platforms": platforms?.map(\.rawValue).sorted(),
"copy": copyPhase?.toJSONValue(),
]

if removeHeaders != Dependency.removeHeadersDefault {
Expand Down
Loading