Skip to content

Instantly share code, notes, and snippets.

@artemnovichkov
Last active September 21, 2026 06:13
Show Gist options
  • Select an option

  • Save artemnovichkov/0033fa6ca7d77312bbc7c8b7d6d7d350 to your computer and use it in GitHub Desktop.

Select an option

Save artemnovichkov/0033fa6ca7d77312bbc7c8b7d6d7d350 to your computer and use it in GitHub Desktop.
Unofficial JSON Schema for Xcode 27.2 .xcproj JSON project format
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Xcode project (.xcproj)",
"description": "Unofficial schema for the Xcode JSON project format (project.xcproj), matching Apple's reference implementation https://github.com/apple/xcode-project-format (XCSchema). Files are parsed as JSON5: comments and trailing commas are allowed. Like the library, unknown keys are allowed and ignored, so typos are not caught. Not checked: unique target names, development language not in supported, known required-capabilities.",
"type": "object",
"required": ["default-configuration", "localizations", "files"],
"properties": {
"required-capabilities": {"$ref": "#/$defs/stringSet", "description": "Feature requirements. Decoding fails if any capability is unknown to the tool."},
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"root-group-debug-id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"configuration-list-debug-id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"organization": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"class-prefix": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"build-independent-targets-in-parallel": {"type": "boolean", "default": true},
"default-configuration": {"type": "string"},
"configurations": {"type": "array", "default": [], "items": {"$ref": "#/$defs/configuration"}},
"localizations": {
"type": "object",
"required": ["development"],
"properties": {
"development": {"type": "string"},
"supported": {"$ref": "#/$defs/stringSet", "description": "Must not include the development language."}
}
},
"imported-products": {"type": "array", "items": {"$ref": "#/$defs/importedProduct"}},
"packages": {"type": "array", "items": {"$ref": "#/$defs/package"}},
"files": {"type": "array", "items": {"$ref": "#/$defs/reference"}},
"targets": {"type": "array", "items": {"$ref": "#/$defs/target"}},
"build-settings": {"$ref": "#/$defs/buildSettings"},
"products-group": {
"oneOf": [{"$ref": "#/$defs/groupTreeReference"}, {"type": "null"}],
"default": "Products",
"description": "Group containing products. Omitted when it is \"Products\"; null = no products group."
},
"last-upgrade": {"anyOf": [{"$ref": "#/$defs/marketingVersion"}, {"type": "null"}]},
"last-swift-update": {"anyOf": [{"$ref": "#/$defs/marketingVersion"}, {"type": "null"}]},
"last-swift-migration": {"anyOf": [{"$ref": "#/$defs/marketingVersion"}, {"type": "null"}]}
},
"$defs": {
"objectID": {"type": "string", "description": "Opaque unique ID; by convention 24 hex chars."},
"marketingVersion": {
"type": "string",
"pattern": "^[+-]?\\d+\\.[+-]?\\d+(\\.[+-]?\\d+)?$",
"examples": ["27.0", "26.3.1"],
"description": "2 or 3 integer components."
},
"stringSet": {"type": "array", "uniqueItems": true, "items": {"type": "string"}},
"stringList": {"type": "array", "items": {"type": "string"}},
"multilineText": {
"description": "Single string, or array of lines joined with \"\\n\".",
"oneOf": [{"type": "string"}, {"$ref": "#/$defs/stringList"}]
},
"targetName": {"type": "string"},
"platforms": {
"$ref": "#/$defs/stringSet",
"description": "Platform filters, e.g. ios, macos, maccatalyst, tvos, watchos, xros, driverkit."
},
"phaseKind": {"enum": ["compile-sources", "frameworks", "resources", "headers", "rez", "java-archive", "apple-script", "copy", "script"]},
"namePathComponent": {
"oneOf": [
{"type": "string", "pattern": "^[^/]*$", "description": "Child name, or \".\" / \"..\"."},
{
"type": "object",
"required": ["name"],
"properties": {"name": {"type": "string", "description": "Any child name, including ones with \"/\"."}}
}
]
},
"namePath": {
"description": "Path of names through the group tree. String form \"Products/App.app\", or array of components when a name contains \"/\".",
"oneOf": [{"type": "string"}, {"type": "array", "items": {"$ref": "#/$defs/namePathComponent"}}]
},
"groupTreeReference": {
"description": "Reference to a group-tree element: \"id:<objectID>\" or a name path.",
"oneOf": [{"type": "string"}, {"type": "array", "items": {"$ref": "#/$defs/namePathComponent"}}]
},
"groupTreeAnchoredReference": {
"oneOf": [
{"$ref": "#/$defs/groupTreeReference"},
{
"type": "object",
"required": ["anchor", "relative-path"],
"properties": {
"anchor": {"$ref": "#/$defs/groupTreeReference"},
"relative-path": {"$ref": "#/$defs/namePath", "description": "File-system path below the anchor, e.g. into folder content."}
}
}
]
},
"filePath": {
"type": "string",
"default": "",
"description": "Group-relative path, absolute path (\"/…\"), or path with a base: <PRODUCTS>/, <SDK>/, <DEVELOPER>/, <PROJECT>/, <USER:SETTING>/. Plain paths escape \"<\" and \"\\\\\" with \"\\\\\"; <USER:…> escapes \">\" and \"\\\\\". A path may not start with \"~\"; a based path may not continue with \"/\" or \"~\".",
"pattern": "^(<(PRODUCTS|SDK|DEVELOPER|PROJECT)>/([^/~][\\s\\S]*)?|<USER:([^>\\\\]|\\\\[>\\\\])*>/([^/~][\\s\\S]*)?|([^<~\\\\]|\\\\[<\\\\])([^<\\\\]|\\\\[<\\\\])*)?$"
},
"buildSettings": {
"type": "object",
"description": "Build settings; any key. Conditions via suffix, e.g. \"SWIFT_OPTIMIZATION_LEVEL[config=Debug]\".",
"additionalProperties": {"oneOf": [{"type": "string"}, {"$ref": "#/$defs/stringList"}]}
},
"configuration": {
"oneOf": [
{"type": "string"},
{
"type": "object",
"required": ["name"],
"properties": {
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"name": {"type": "string"},
"file": {
"anyOf": [
{"$ref": "#/$defs/groupTreeAnchoredReference", "description": "xcconfig reference in the group tree."},
{"type": "null"}
]
}
}
}
]
},
"package": {
"type": "object",
"required": ["kind"],
"properties": {"kind": {"enum": ["local", "remote"]}},
"if": {"properties": {"kind": {"const": "local"}}},
"then": {
"required": ["path"],
"properties": {
"kind": true,
"path": {"type": "string", "description": "Project-relative path."},
"traits": {"$ref": "#/$defs/stringList"}
}
},
"else": {
"required": ["repository"],
"properties": {
"kind": true,
"repository": {"type": "string"},
"version": {"anyOf": [{"$ref": "#/$defs/versionConstraint"}, {"type": "null"}]},
"traits": {"$ref": "#/$defs/stringList"}
}
}
},
"versionConstraint": {
"type": "object",
"description": "First present key wins: revision, branch, version, up-to-next-minor-version, up-to-next-major-version, version-range, then version-range-min + version-range-max.",
"if": {"required": ["revision"]},
"then": {"properties": {"revision": {"type": "string"}}},
"else": {
"if": {"required": ["branch"]},
"then": {"properties": {"branch": {"type": "string"}}},
"else": {
"if": {"required": ["version"]},
"then": {"properties": {"version": {"type": "string"}}},
"else": {
"if": {"required": ["up-to-next-minor-version"]},
"then": {"properties": {"up-to-next-minor-version": {"type": "string"}}},
"else": {
"if": {"required": ["up-to-next-major-version"]},
"then": {"properties": {"up-to-next-major-version": {"type": "string"}}},
"else": {
"if": {"required": ["version-range"]},
"then": {
"properties": {
"version-range": {
"type": "string",
"pattern": "^((?!\\.\\.<).)*\\.\\.<((?!\\.\\.<).)*$",
"description": "\"min..<max\"; used when both are plain numeric versions."
}
}
},
"else": {
"required": ["version-range-min", "version-range-max"],
"properties": {"version-range-min": {"type": "string"}, "version-range-max": {"type": "string"}}
}
}
}
}
}
}
},
"importedProduct": {
"type": "object",
"required": ["project", "target", "product-id", "target-membership"],
"properties": {
"name": {
"anyOf": [{"type": "string"}, {"type": "null"}],
"description": "Used instead of path when path is a single component; path is ignored when name is a string."
},
"project": {"$ref": "#/$defs/groupTreeReference"},
"target": {"type": "string"},
"product-id": {"$ref": "#/$defs/objectID"},
"type": {"anyOf": [{"type": "string", "description": "File type ID."}, {"type": "null"}]},
"target-membership": {"$ref": "#/$defs/buildFileMembership"}
},
"if": {"required": ["name"], "properties": {"name": {"type": "string"}}},
"else": {"required": ["path"], "properties": {"path": {"type": "string"}}}
},
"buildFileAttributes": {
"is-weak": {"type": "boolean", "default": false},
"code-sign-on-copy": {"type": "boolean", "default": false},
"decompress": {"type": "boolean", "default": false},
"header-preservation": {"enum": ["keep", "remove-on-copy"], "default": "keep"},
"header-role": {"enum": ["public", "private"]},
"code-generation": {"enum": ["default", "skip"], "default": "default"},
"code-generation-visibility": {"enum": ["public", "private", "project"]},
"mach-interface-generation": {"enum": ["client", "server", "both"]}
},
"buildFileAttributesObject": {
"type": "object",
"properties": {
"is-weak": {"$ref": "#/$defs/buildFileAttributes/is-weak"},
"code-sign-on-copy": {"$ref": "#/$defs/buildFileAttributes/code-sign-on-copy"},
"decompress": {"$ref": "#/$defs/buildFileAttributes/decompress"},
"header-preservation": {"$ref": "#/$defs/buildFileAttributes/header-preservation"},
"header-role": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/header-role"}, {"type": "null"}]},
"code-generation": {"$ref": "#/$defs/buildFileAttributes/code-generation"},
"code-generation-visibility": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/code-generation-visibility"}, {"type": "null"}]},
"mach-interface-generation": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/mach-interface-generation"}, {"type": "null"}]}
}
},
"projectBuildPhaseReference": {
"description": "\"Target/<phase-kind>[/<phase-name>]\", \"id:<phaseID>\", or the name path as an array of components.",
"oneOf": [
{"$ref": "#/$defs/projectBuildPhaseReferenceString"},
{
"type": "array",
"minItems": 2,
"maxItems": 3,
"prefixItems": [{"$ref": "#/$defs/childNameComponent"}, {"$ref": "#/$defs/phaseKindComponent"}, {"$ref": "#/$defs/childNameComponent"}]
}
]
},
"targetBuildPhaseReference": {
"description": "\"<phase-kind>[/<phase-name>]\", \"id:<phaseID>\", or the name path as an array of components.",
"oneOf": [
{
"type": "string",
"pattern": "^(id:[\\s\\S]*|(compile-sources|frameworks|resources|headers|rez|java-archive|apple-script|copy|script)(/(?!\\.\\.?$)[^/]*)?)$"
},
{
"type": "array",
"minItems": 1,
"maxItems": 2,
"prefixItems": [{"$ref": "#/$defs/phaseKindComponent"}, {"$ref": "#/$defs/childNameComponent"}]
}
]
},
"buildFileProperties": {
"id": {"$ref": "#/$defs/objectID"},
"platforms": {"$ref": "#/$defs/platforms"},
"arguments": {"type": "string", "description": "Additional compiler flags."},
"asset-tags": {"$ref": "#/$defs/stringSet"}
},
"buildFile": {
"oneOf": [
{"$ref": "#/$defs/projectBuildPhaseReferenceString"},
{
"type": "object",
"required": ["build-phase"],
"properties": {
"id": {"anyOf": [{"$ref": "#/$defs/buildFileProperties/id"}, {"type": "null"}]},
"build-phase": {"$ref": "#/$defs/projectBuildPhaseReference"},
"platforms": {"$ref": "#/$defs/buildFileProperties/platforms"},
"arguments": {"anyOf": [{"$ref": "#/$defs/buildFileProperties/arguments"}, {"type": "null"}]},
"asset-tags": {"$ref": "#/$defs/buildFileProperties/asset-tags"},
"is-weak": {"$ref": "#/$defs/buildFileAttributes/is-weak"},
"code-sign-on-copy": {"$ref": "#/$defs/buildFileAttributes/code-sign-on-copy"},
"decompress": {"$ref": "#/$defs/buildFileAttributes/decompress"},
"header-preservation": {"$ref": "#/$defs/buildFileAttributes/header-preservation"},
"header-role": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/header-role"}, {"type": "null"}]},
"code-generation": {"$ref": "#/$defs/buildFileAttributes/code-generation"},
"code-generation-visibility": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/code-generation-visibility"}, {"type": "null"}]},
"mach-interface-generation": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/mach-interface-generation"}, {"type": "null"}]}
}
}
]
},
"buildFileMembership": {"type": "array", "items": {"$ref": "#/$defs/buildFile"}},
"targetBuildFile": {
"type": "object",
"required": ["build-phase"],
"properties": {
"id": {"anyOf": [{"$ref": "#/$defs/buildFileProperties/id"}, {"type": "null"}]},
"build-phase": {"$ref": "#/$defs/targetBuildPhaseReference"},
"platforms": {"$ref": "#/$defs/buildFileProperties/platforms"},
"arguments": {"anyOf": [{"$ref": "#/$defs/buildFileProperties/arguments"}, {"type": "null"}]},
"asset-tags": {"$ref": "#/$defs/buildFileProperties/asset-tags"},
"is-weak": {"$ref": "#/$defs/buildFileAttributes/is-weak"},
"code-sign-on-copy": {"$ref": "#/$defs/buildFileAttributes/code-sign-on-copy"},
"decompress": {"$ref": "#/$defs/buildFileAttributes/decompress"},
"header-preservation": {"$ref": "#/$defs/buildFileAttributes/header-preservation"},
"header-role": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/header-role"}, {"type": "null"}]},
"code-generation": {"$ref": "#/$defs/buildFileAttributes/code-generation"},
"code-generation-visibility": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/code-generation-visibility"}, {"type": "null"}]},
"mach-interface-generation": {"anyOf": [{"$ref": "#/$defs/buildFileAttributes/mach-interface-generation"}, {"type": "null"}]}
}
},
"commonReference": {
"id": {"$ref": "#/$defs/objectID"},
"index": {"type": "boolean", "description": "includeInIndex"},
"name": {"type": "string", "description": "Only when it differs from the last path component."},
"path": {"$ref": "#/$defs/filePath"}
},
"reference": {
"type": "object",
"properties": {"kind": {"enum": ["file-reference", "group", "folder", "variant-group", "version-group"], "default": "file-reference"}},
"if": {"required": ["kind"], "properties": {"kind": {"const": "group"}}},
"then": {"$ref": "#/$defs/group"},
"else": {
"if": {"required": ["kind"], "properties": {"kind": {"const": "folder"}}},
"then": {"$ref": "#/$defs/folder"},
"else": {
"if": {"required": ["kind"], "properties": {"kind": {"const": "variant-group"}}},
"then": {"$ref": "#/$defs/variantGroup"},
"else": {
"if": {"required": ["kind"], "properties": {"kind": {"const": "version-group"}}},
"then": {"$ref": "#/$defs/versionGroup"},
"else": {"$ref": "#/$defs/fileReference"}
}
}
}
},
"fileReference": {
"type": "object",
"properties": {
"id": {"anyOf": [{"$ref": "#/$defs/commonReference/id"}, {"type": "null"}]},
"index": {"anyOf": [{"$ref": "#/$defs/commonReference/index"}, {"type": "null"}]},
"path": {"$ref": "#/$defs/commonReference/path"},
"type": {"anyOf": [{"type": "string", "description": "Explicit file type, e.g. wrapper.application."}, {"type": "null"}]},
"signature": {"anyOf": [{"type": "string", "description": "Expected code signature."}, {"type": "null"}]},
"encoding": {
"anyOf": [
{
"oneOf": [
{
"enum": [
"ascii",
"nextstep",
"japanese-euc",
"utf8",
"iso-latin-1",
"symbol",
"non-lossy-ascii",
"shift-jis",
"iso-latin-2",
"unicode",
"windows-code-page-1250",
"windows-code-page-1251",
"windows-code-page-1252",
"windows-code-page-1253",
"windows-code-page-1254",
"iso-2022-jp",
"macos-roman",
"utf16",
"utf16-big-endian",
"utf16-little-endian",
"utf32",
"utf32-big-endian",
"utf32-little-endian"
]
},
{"type": "integer", "minimum": 0, "description": "Raw String.Encoding value for encodings without a name."}
]
},
{"type": "null"}
]
},
"line-ending": {"anyOf": [{"enum": ["line-feed", "carriage-return", "carriage-return-line-feed", "preserve"]}, {"type": "null"}]},
"target-membership": {"$ref": "#/$defs/buildFileMembership"}
}
},
"group": {
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"const": "group"},
"id": {"anyOf": [{"$ref": "#/$defs/commonReference/id"}, {"type": "null"}]},
"index": {"anyOf": [{"$ref": "#/$defs/commonReference/index"}, {"type": "null"}]},
"name": {"$ref": "#/$defs/commonReference/name"},
"path": {"$ref": "#/$defs/commonReference/path"},
"children": {"type": "array", "items": {"$ref": "#/$defs/reference"}}
}
},
"variantGroup": {
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"const": "variant-group"},
"id": {"anyOf": [{"$ref": "#/$defs/commonReference/id"}, {"type": "null"}]},
"index": {"anyOf": [{"$ref": "#/$defs/commonReference/index"}, {"type": "null"}]},
"name": {"$ref": "#/$defs/commonReference/name"},
"path": {"$ref": "#/$defs/commonReference/path"},
"target-membership": {"$ref": "#/$defs/buildFileMembership"},
"children": {"type": "array", "items": {"$ref": "#/$defs/fileReference"}}
}
},
"versionGroup": {
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"const": "version-group"},
"id": {"anyOf": [{"$ref": "#/$defs/commonReference/id"}, {"type": "null"}]},
"index": {"anyOf": [{"$ref": "#/$defs/commonReference/index"}, {"type": "null"}]},
"name": {"$ref": "#/$defs/commonReference/name"},
"path": {"$ref": "#/$defs/commonReference/path"},
"current-version": {"anyOf": [{"$ref": "#/$defs/groupTreeReference"}, {"type": "null"}]},
"type": {"anyOf": [{"type": "string", "description": "Versioned file type, e.g. wrapper.xcdatamodel."}, {"type": "null"}]},
"target-membership": {"$ref": "#/$defs/buildFileMembership"},
"children": {"type": "array", "items": {"$ref": "#/$defs/fileReference"}}
}
},
"folder": {
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"const": "folder"},
"id": {"anyOf": [{"$ref": "#/$defs/commonReference/id"}, {"type": "null"}]},
"index": {"anyOf": [{"$ref": "#/$defs/commonReference/index"}, {"type": "null"}]},
"path": {"$ref": "#/$defs/commonReference/path"},
"file-types": {
"type": "object",
"description": "Folder-relative member path → file type ID.",
"additionalProperties": {"type": "string"}
},
"opaque-folders": {"$ref": "#/$defs/stringSet"},
"target-membership": {"type": "array", "uniqueItems": true, "items": {"$ref": "#/$defs/targetName"}},
"membership-exceptions": {"type": "array", "items": {"$ref": "#/$defs/folderExceptionSet"}}
}
},
"folderExceptionSet": {
"type": "object",
"properties": {
"exclusions": {"$ref": "#/$defs/stringSet"},
"inclusions": {"$ref": "#/$defs/stringSet"},
"platforms": {"type": "object", "additionalProperties": {"$ref": "#/$defs/platforms"}},
"attributes": {"type": "object", "additionalProperties": {"$ref": "#/$defs/buildFileAttributesObject"}},
"asset-tags": {"type": "object", "additionalProperties": {"$ref": "#/$defs/stringSet"}}
},
"anyOf": [{"required": ["target"]}, {"required": ["build-phase"]}],
"not": {"required": ["exclusions", "inclusions"]},
"if": {"required": ["target"]},
"then": {
"properties": {
"target": {"$ref": "#/$defs/targetName"},
"public-headers": {"$ref": "#/$defs/stringSet"},
"private-headers": {"$ref": "#/$defs/stringSet"},
"compiler-flags": {"type": "object", "additionalProperties": {"type": "string"}}
}
},
"else": {"properties": {"build-phase": {"$ref": "#/$defs/projectBuildPhaseReference"}}}
},
"target": {
"type": "object",
"required": ["name", "id"],
"properties": {
"name": {"$ref": "#/$defs/targetName", "description": "Unique within the project."},
"id": {"$ref": "#/$defs/objectID"},
"configuration-list-debug-id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"kind": {"enum": ["native", "aggregate", "external-build-system"], "default": "native"},
"product": {"anyOf": [{"$ref": "#/$defs/groupTreeReference"}, {"type": "null"}]},
"product-type": {
"type": "string",
"description": "Product type without the com.apple.product-type. prefix.",
"examples": [
"application",
"tool",
"framework",
"library.static",
"library.dynamic",
"bundle",
"bundle.unit-test",
"bundle.ui-testing",
"app-extension",
"extensionkit-extension",
"application.watchapp2",
"application.on-demand-install-capable",
"xcframework"
]
},
"last-swift-update": {"anyOf": [{"$ref": "#/$defs/marketingVersion"}, {"type": "null"}]},
"last-swift-migration": {"anyOf": [{"$ref": "#/$defs/marketingVersion"}, {"type": "null"}]},
"legacy-provisioning-style": {"anyOf": [{"enum": ["automatic", "manual"]}, {"type": "null"}]},
"legacy-team-id": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"test-host-target": {"anyOf": [{"$ref": "#/$defs/targetName"}, {"type": "null"}]},
"specialized-configurations": {
"type": "array",
"description": "Only configurations with an id or file; plain names are rejected on encode.",
"items": {"$ref": "#/$defs/configuration"}
},
"dependencies": {"type": "array", "items": {"$ref": "#/$defs/dependency"}},
"build-phases": {"type": "array", "items": {"$ref": "#/$defs/buildPhase"}},
"build-rules": {"type": "array", "items": {"$ref": "#/$defs/buildRule"}},
"package-product-members": {"type": "array", "items": {"$ref": "#/$defs/packageProductMember"}},
"build-settings": {"$ref": "#/$defs/buildSettings"}
},
"allOf": [
{
"if": {"required": ["product-type"]},
"then": true,
"else": {
"properties": {
"full-product-type": {
"anyOf": [{"type": "string", "description": "Product type identifier outside com.apple.product-type.*"}, {"type": "null"}]
}
}
}
},
{
"if": {"required": ["kind"], "properties": {"kind": {"const": "external-build-system"}}},
"then": {
"required": ["build-tool-path"],
"properties": {
"build-tool-path": {"type": "string"},
"build-tool-arguments": {"type": "string", "default": ""},
"build-tool-working-directory": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"pass-build-settings-in-environment": {"type": "boolean", "default": true}
}
}
}
]
},
"packageProductReference": {
"package": {"type": "string", "description": "Package name; omitted for local packages."},
"id": {"$ref": "#/$defs/objectID"},
"product-name": {"type": "string"},
"product-type": {"enum": ["other", "build-tool-plugin"], "default": "other"}
},
"dependency": {
"oneOf": [
{"$ref": "#/$defs/targetName", "description": "Local target by name."},
{
"type": "object",
"required": ["target"],
"properties": {
"kind": {"const": "localTarget", "default": "localTarget"},
"target": {"$ref": "#/$defs/targetName"},
"platforms": {"$ref": "#/$defs/platforms"}
}
},
{
"type": "object",
"required": ["kind", "project", "target", "target-id"],
"properties": {
"kind": {"const": "remoteTarget"},
"project": {"$ref": "#/$defs/groupTreeReference"},
"target": {"type": "string"},
"target-id": {"$ref": "#/$defs/objectID"},
"platforms": {"$ref": "#/$defs/platforms"}
}
},
{
"type": "object",
"required": ["kind", "product-name"],
"properties": {
"kind": {"const": "package"},
"package": {"anyOf": [{"$ref": "#/$defs/packageProductReference/package"}, {"type": "null"}]},
"id": {"anyOf": [{"$ref": "#/$defs/packageProductReference/id"}, {"type": "null"}]},
"product-name": {"$ref": "#/$defs/packageProductReference/product-name"},
"product-type": {"$ref": "#/$defs/packageProductReference/product-type"},
"platforms": {"$ref": "#/$defs/platforms"}
}
}
]
},
"packageProductMember": {
"type": "object",
"required": ["product-name", "build-phase"],
"properties": {
"package": {"anyOf": [{"$ref": "#/$defs/packageProductReference/package"}, {"type": "null"}]},
"id": {"anyOf": [{"$ref": "#/$defs/packageProductReference/id"}, {"type": "null"}]},
"product-name": {"$ref": "#/$defs/packageProductReference/product-name"},
"product-type": {"$ref": "#/$defs/packageProductReference/product-type"},
"build-phase": {"$ref": "#/$defs/targetBuildFile"}
}
},
"simplePhaseKind": {"enum": ["compile-sources", "frameworks", "resources", "headers", "rez", "java-archive"]},
"buildPhase": {
"oneOf": [
{"$ref": "#/$defs/simplePhaseKind"},
{
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"$ref": "#/$defs/simplePhaseKind"},
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"name": {"anyOf": [{"type": "string"}, {"type": "null"}]}
}
},
{
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"const": "copy"},
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"name": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"bundle-base-path": {
"anyOf": [
{
"enum": [
"root",
"build-products-directory",
"contents-directory",
"executables-directory",
"resources-directory",
"frameworks-directory",
"shared-frameworks-directory",
"shared-support-directory",
"plugins-directory",
"headers-directory",
"private-headers-directory",
"java-directory",
"apple-scripts-directory",
"info-plist-file",
"package-info-file",
"main-executable-file",
"shallow-main-executable-file"
],
"description": "Omitted = absolute path in relative-path."
},
{"type": "null"}
]
},
"relative-path": {"type": "string", "default": ""},
"scope": {"$ref": "#/$defs/phaseScope"}
}
},
{
"type": "object",
"required": ["kind", "shell", "script"],
"properties": {
"kind": {"const": "script"},
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"name": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"log-environment-variables": {"type": "boolean", "default": false},
"input-paths": {"$ref": "#/$defs/stringList"},
"input-file-list-paths": {"$ref": "#/$defs/stringList"},
"output-paths": {"$ref": "#/$defs/stringList"},
"output-file-list-paths": {"$ref": "#/$defs/stringList"},
"dependency-file": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"run-on-every-build": {"type": "boolean", "default": false},
"scope": {"$ref": "#/$defs/phaseScope"},
"shell": {"type": "string", "examples": ["/bin/sh"]},
"script": {"$ref": "#/$defs/multilineText"}
}
},
{
"type": "object",
"required": ["kind"],
"properties": {
"kind": {"const": "apple-script"},
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"name": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"is-shared-context": {"type": "boolean", "default": false},
"context-name": {"type": "string", "default": ""}
}
}
]
},
"phaseScope": {"enum": ["always", "install"], "default": "always", "description": "install = run only when installing."},
"buildRule": {
"type": "object",
"required": ["processor"],
"properties": {
"name": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"id": {"anyOf": [{"$ref": "#/$defs/objectID"}, {"type": "null"}]},
"processor": {"type": "string", "examples": ["com.apple.compilers.proxy.script"]},
"file-type": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"file-patterns": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"input-files": {"$ref": "#/$defs/stringList"},
"input-file-lists": {"$ref": "#/$defs/stringList"},
"output-files": {"$ref": "#/$defs/stringList"},
"output-file-lists": {"$ref": "#/$defs/stringList"},
"output-files-compiler-flags": {"$ref": "#/$defs/stringList"},
"dependency-file": {"anyOf": [{"type": "string"}, {"type": "null"}]},
"run-once-per-architecture": {"type": "boolean", "default": true},
"script": {"anyOf": [{"$ref": "#/$defs/multilineText"}, {"type": "null"}]}
}
},
"childNameComponent": {"oneOf": [{"type": "string", "pattern": "^(?!\\.\\.?$)[^/]*$"}, {"$ref": "#/$defs/namePathComponent/oneOf/1"}]},
"phaseKindComponent": {
"oneOf": [
{"$ref": "#/$defs/phaseKind"},
{"type": "object", "required": ["name"], "properties": {"name": {"$ref": "#/$defs/phaseKind"}}}
]
},
"projectBuildPhaseReferenceString": {
"type": "string",
"pattern": "^(id:[\\s\\S]*|(?!\\.\\.?/)[^/]*/(compile-sources|frameworks|resources|headers|rez|java-archive|apple-script|copy|script)(/(?!\\.\\.?$)[^/]*)?)$"
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment