Skip to content

Commit

Permalink
Build: Simplify iOS BUILD.bazel files with macros (#340)
Browse files Browse the repository at this point in the history
* update iOS bazel deps to latest

* macro iOS/SwiftUI plugins to consolidate build pipeline

* macro the rest of the common cases

* reduce dependencies for test-utils tests

* macro remaining package

* fix bundle names

* add more in-depth README for ios development

* simplify Package.swift and update docs

* simplify podspec and update README

* reorder podspec to match target order in Package.swift

* add section for using external dependencies

* use newer markdown syntax for note/tips
  • Loading branch information
hborawski committed Apr 19, 2024
1 parent 17f6ab9 commit efd2106
Show file tree
Hide file tree
Showing 31 changed files with 692 additions and 1,176 deletions.
8 changes: 4 additions & 4 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ node.toolchain(node_version = "18.18.0")

###### Start iOS ######
## Rule Dependencies
bazel_dep(name = "rules_swift", version = "1.14.0", repo_name = "build_bazel_rules_swift")
bazel_dep(name = "rules_apple", version = "3.1.1", repo_name = "build_bazel_rules_apple")
bazel_dep(name = "rules_ios", version = "3.1.4", repo_name = "build_bazel_rules_ios")
bazel_dep(name = "rules_xcodeproj", version = "1.13.0")
bazel_dep(name = "rules_swift", version = "1.18.0", repo_name = "build_bazel_rules_swift")
bazel_dep(name = "rules_apple", version = "3.5.1", repo_name = "build_bazel_rules_apple")
bazel_dep(name = "rules_ios", version = "4.3.1", repo_name = "build_bazel_rules_ios")
bazel_dep(name = "rules_xcodeproj", version = "2.2.0")

bazel_dep(name = "gazelle", version = "0.34.0", repo_name = "bazel_gazelle")
bazel_dep(name = "rules_swift_package_manager", version = "0.22.0")
Expand Down
200 changes: 61 additions & 139 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,43 @@

import PackageDescription

typealias PluginWithResources = (name: String, path: String)
typealias SwiftPlugin = (name: String, path: String, resources: Bool)
typealias SwiftUIPlugin = (name: String, path: String, dependencies: [String], resources: Bool)

// Simple plugins that just rely on core + their own JS bundle
let pluginList: [String] = [
(name: "BaseBeaconPlugin", path: "beacon"),
(name: "CheckPathPlugin", path: "check-path"),
(name: "CommonExpressionsPlugin", path: "common-expressions"),
(name: "CommonTypesPlugin", path: "common-types"),
(name: "ComputedPropertiesPlugin", path: "computed-properties"),
(name: "ExpressionPlugin", path: "expression"),
(name: "ExternalActionPlugin", path: "external-action"),
(name: "PubSubPlugin", path: "pubsub"),
(name: "StageRevertDataPlugin", path: "stage-revert-data"),
(name: "TypesProviderPlugin", path: "types-provider")
// Simple iOS plugins that just rely on PlayerUI and optionally JS resources
let ios_plugins: [SwiftPlugin] = [
(name: "BaseBeaconPlugin", path: "beacon", resources: true),
(name: "CheckPathPlugin", path: "check-path", resources: true),
(name: "CommonExpressionsPlugin", path: "common-expressions", resources: true),
(name: "CommonTypesPlugin", path: "common-types", resources: true),
(name: "ComputedPropertiesPlugin", path: "computed-properties", resources: true),
(name: "ExpressionPlugin", path: "expression", resources: true),
(name: "ExternalActionPlugin", path: "external-action", resources: true),
(name: "PubSubPlugin", path: "pubsub", resources: true),
(name: "StageRevertDataPlugin", path: "stage-revert-data", resources: true),
(name: "TypesProviderPlugin", path: "types-provider", resources: true),
(name: "PrintLoggerPlugin", path: "console-logger", resources: false)
]

let plugins: [(Target, Product)] = pluginList.map {
// SwiftUI Plugins
let swiftui_plugins: [SwiftUIPlugin] = [
(name: "BeaconPlugin", path: "beacon", dependencies: ["BaseBeaconPlugin"], resources: false),
(name: "MetricsPlugin", path: "metrics", dependencies: [], resources: true),
(name: "SwiftUICheckPathPlugin", path: "check-path", dependencies: ["CheckPathPlugin"], resources: false),
(name: "ExternalActionViewModifierPlugin", path: "external-action", dependencies: ["ExternalActionPlugin"], resources: false),
(name: "SwiftUIPendingTransactionPlugin", path: "pending-transaction", dependencies: [], resources: false),
(name: "TransitionPlugin", path: "transition", dependencies: [], resources: false),
]

// Map plugins to Target / Product entries
let plugins: [(Target, Product)] = ios_plugins.map {
(
Target.swiftPlugin(plugin: $0),
Product.playerPlugin(name: $0.name)
)
} + swiftui_plugins.map {
(
Target.playerPlugin(plugin: $0),
Target.swiftuiPlugin(plugin: $0),
Product.playerPlugin(name: $0.name)
)
}
Expand All @@ -33,59 +51,12 @@ let package = Package(
.macOS(.v11)
],
products: [
// Core
.library(
name: "PlayerUI",
targets: ["PlayerUI", "PlayerUISwiftUI"]
),

// Packages
.library(
name: "PlayerUIReferenceAssets",
targets: ["PlayerUIReferenceAssets"]
),
.library(
name: "PlayerUILogger",
targets: ["PlayerUILogger"]
),
.library(
name: "PlayerUITestUtilitiesCore",
targets: ["PlayerUITestUtilitiesCore"]
),
.library(
name: "PlayerUITestUtilities",
targets: ["PlayerUITestUtilities"]
),

// Plugins
.library(
name: "PlayerUIBeaconPlugin",
targets: ["PlayerUIBeaconPlugin"]
),
.library(
name: "PlayerUIExternalActionViewModifierPlugin",
targets: ["PlayerUIExternalActionViewModifierPlugin"]
),
.library(
name: "PlayerUIMetricsPlugin",
targets: ["PlayerUIMetricsPlugin"]
),
.library(
name: "PlayerUISwiftUICheckPathPlugin",
targets: ["PlayerUISwiftUICheckPathPlugin"]
),
.library(
name: "PlayerUIPrintLoggerPlugin",
targets: ["PlayerUIPrintLoggerPlugin"]
),
.library(
name: "PlayerUISwiftUIPendingTransactionPlugin",
targets: ["PlayerUISwiftUIPendingTransactionPlugin"]
),
.library(
name: "PlayerUITransitionPlugin",
targets: ["PlayerUITransitionPlugin"]
)
.playerPackage(name: "PlayerUI"),
.playerPackage(name: "PlayerUISwiftUI"),
.playerPackage(name: "PlayerUIReferenceAssets"),
.playerPackage(name: "PlayerUILogger"),
.playerPackage(name: "PlayerUITestUtilities"),
.playerPackage(name: "PlayerUITestUtilitiesCore"),
] + plugins.map(\.1),
dependencies: [
.package(url: "https://github.com/intuit/swift-hooks.git", .upToNextMajor(from: "0.1.0")),
Expand Down Expand Up @@ -150,91 +121,42 @@ let package = Package(
],
path: "ios/test-utils",
linkerSettings: [.linkedFramework("XCTest")]
),

// Plugins with dependencies
.target(
name: "PlayerUIBeaconPlugin",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI"),
.target(name: "PlayerUIBaseBeaconPlugin")
],
path: "plugins/beacon/swiftui"
),
.target(
name: "PlayerUIMetricsPlugin",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI")
],
path: "plugins/metrics/swiftui",
resources: [
.process("Resources")
]
),
.target(
name: "PlayerUISwiftUICheckPathPlugin",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI"),
.target(name: "PlayerUICheckPathPlugin")
],
path: "plugins/check-path/swiftui"
),
.target(
name: "PlayerUIExternalActionViewModifierPlugin",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI"),
.target(name: "PlayerUIExternalActionPlugin")
],
path: "plugins/external-action/swiftui"
),
// Swift only plugins
.target(
name: "PlayerUIPrintLoggerPlugin",
dependencies: [
.target(name: "PlayerUI")
],
path: "plugins/console-logger/ios"
),
.target(
name: "PlayerUISwiftUIPendingTransactionPlugin",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI")
],
path: "plugins/pending-transaction/swiftui"
),
.target(
name: "PlayerUITransitionPlugin",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI")
],
path: "plugins/transition/swiftui"
)
] + plugins.map(\.0)
)


extension Product {
static func playerPlugin(name: String) -> Product {
.library(name: "PlayerUI\(name)", targets: ["PlayerUI\(name)"])
playerPackage(name: "PlayerUI\(name)")
}
static func playerPackage(name: String) -> Product {
.library(name: name, targets: [name])
}
}
extension Target {
static func playerPlugin(plugin: PluginWithResources) -> Target {
.target(
static func swiftPlugin(plugin: SwiftPlugin) -> Target {
let resources: [Resource] = plugin.resources ? [ .process("Resources") ] : []
return .target(
name: "PlayerUI\(plugin.name)",
dependencies: [
.target(name: "PlayerUI")
],
path: "plugins/\(plugin.path)/ios",
resources: [
.process("Resources")
]
resources: resources
)
}
}

static func swiftuiPlugin(plugin: SwiftUIPlugin) -> Target {
let resources: [Resource] = plugin.resources ? [ .process("Resources") ] : []
return .target(
name: "PlayerUI\(plugin.name)",
dependencies: [
.target(name: "PlayerUI"),
.target(name: "PlayerUISwiftUI")
] + plugin.dependencies.map { Dependency.target(name: "PlayerUI\($0)") },
path: "plugins/\(plugin.path)/swiftui",
resources: resources
)
}
}
Loading

0 comments on commit efd2106

Please sign in to comment.