Add acceptance test suite that covers a staticly linked micro-architecture kind of app (#1594)

* [static-microfeature] Add new fixture to cover a staticly linked microfeature kind of app

* [static-microfeature] Use the .staticFramework product everywhere

* [static-microfeature] Make fixture more explicit that it's a static app

* [static-microfeature] Add better logging

* [static-microfeature] Add acceptance test suite to cover a staticly linked micro-feature achitecture app

* [static-microfeature] Add new rule to check that a certain type of app (fully staticly linked) does not embed any xcframeworks

* [static-microfeature] Fix fixture unit test target build

* [static-microfeature] Update changelog
This commit is contained in:
Romain Boulay 2020-07-28 21:47:18 +02:00 committed by GitHub
parent 46269eafee
commit 2d09e63e54
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 636 additions and 1 deletions

View File

@ -8,6 +8,10 @@ Please, check out guidelines: https://keepachangelog.com/en/1.0.0/
- Allow to cache and warm static frameworks too (only dynamic frameworks were cached before) [#1590](https://github.com/tuist/tuist/pull/1590) by [@RomainBoulay](https://github.com/RomainBoulay)
### Added
- Add an acceptance test suite to cover a `test cache warm` command on a micro-feature architecture kind of application that is fully statically linked [#1594](https://github.com/tuist/tuist/pull/1594) by [@RomainBoulay](https://github.com/RomainBoulay)
## 11.14.0 - Spezi
### Fixed

View File

@ -24,3 +24,14 @@ Scenario: The project is an application with templates (ios_workspace_with_micro
Then App embeds the xcframework UIComponents
Then I should be able to build for iOS the scheme App
Then I should be able to test for iOS the scheme AppTests
Scenario: The project is an application with templates (ios_workspace_with_microfeature_architecture_static_linking)
Given that tuist is available
And I have a working directory
Then I copy the fixture ios_workspace_with_microfeature_architecture_static_linking into the working directory
And tuist warms the cache
When tuist generates a project with cached targets at StaticApp
Then StaticApp links the xcframework FrameworkA
Then StaticApp does not embed any xcframeworks
Then I should be able to build for iOS the scheme StaticApp
Then I should be able to test for iOS the scheme StaticAppTests

View File

@ -7,7 +7,7 @@ end
Then(/^([a-zA-Z]+) links the xcframework ([a-zA-Z]+)$/) do |target_name, xcframework|
projects = Xcode.projects(@workspace_path)
target = projects.flat_map { |p| p.targets }.detect { |t| t.name == target_name }
flunk("Target #{target_name} in any of the projects of the workspace") if target.nil?
flunk("Target #{target_name} doesn't exist in any of the projects' targets of the workspace") if target.nil?
xcframework_deps = target.frameworks_build_phases.file_display_names.filter { |d| d.include?(".xcframework") }
unless xcframework_deps.include?("#{xcframework}.xcframework")
flunk("Target #{target_name} doesn't link the xcframework #{xcframework}. It links the xcframeworks: #{xcframework_deps.join(", ")}")
@ -27,3 +27,17 @@ Then(/^([a-zA-Z]+) embeds the xcframework ([a-zA-Z]+)$/) do |target_name, xcfram
flunk("Target #{target_name} doesn't embed the xcframework #{xcframework}. It embeds the xcframeworks: #{xcframework_deps.join(", ")}")
end
end
Then(/^([a-zA-Z]+) does not embed any xcframeworks$/) do |target_name|
projects = Xcode.projects(@workspace_path)
target = projects.flat_map { |p| p.targets }.detect { |t| t.name == target_name }
flunk("Target #{target_name} in any of the projects of the workspace") if target.nil?
xcframework_deps = target
.copy_files_build_phases
.filter { |b| b.symbol_dst_subfolder_spec == :frameworks }
.flat_map { |b| b.file_display_names }
.filter { |d| d.include?(".xcframework") }
unless xcframework_deps.empty?
flunk("Target #{target_name} should not embed any xcframeworks, although it does embed the following xcframeworks: #{xcframework_deps.join(", ")}")
end
end

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,24 @@
import ProjectDescription
let project = Project(name: "Core",
targets: [
Target(name: "Core",
platform: .iOS,
product: .staticFramework,
bundleId: "io.tuist.Core",
infoPlist: "Info.plist",
sources: ["Sources/**"],
resources: [
/* Path to resouces can be defined here */
// "Resources/**"
]),
Target(name: "CoreTests",
platform: .iOS,
product: .unitTests,
bundleId: "io.tuist.CoreTests",
infoPlist: "Tests.plist",
sources: "Tests/**",
dependencies: [
.target(name: "Core")
])
])

View File

@ -0,0 +1,5 @@
import Foundation
public class CoreClass {
public init() {}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
import Foundation
import XCTest
@testable import Core
final class CoreClassTests: XCTestCase {
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,29 @@
import ProjectDescription
let project = Project(name: "Data",
targets: [
Target(name: "Data",
platform: .iOS,
product: .staticFramework,
bundleId: "io.tuist.Data",
infoPlist: "Info.plist",
sources: ["Sources/**"],
resources: [
/* Path to resouces can be defined here */
// "Resources/**"
],
dependencies: [
/* Target dependencies can be defined here */
// .framework(path: "Frameworks/MyFramework.framework")
.project(target: "Core", path: "../CoreFramework")
]),
Target(name: "DataTests",
platform: .iOS,
product: .unitTests,
bundleId: "io.tuist.DataFrameworkTests",
infoPlist: "Tests.plist",
sources: "Tests/**",
dependencies: [
.target(name: "Data")
])
])

View File

@ -0,0 +1,8 @@
import Foundation
import Core
public class DataClass {
let core = CoreClass()
public init() {}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
import Foundation
import XCTest
@testable import Data
final class DataClassTests: XCTestCase {
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,32 @@
import ProjectDescription
let project = Project(name: "FrameworkA",
targets: [
Target(name: "FrameworkA",
platform: .iOS,
product: .staticFramework,
bundleId: "io.tuist.FrameworkA",
infoPlist: "Info.plist",
sources: ["Sources/**"],
resources: [
/* Path to resouces can be defined here */
// "Resources/**"
],
dependencies: [
/* Target dependencies can be defined here */
// .framework(path: "Frameworks/MyFramework.framework")
.project(target: "FeatureContracts", path: "../FeatureContracts"),
.project(target: "Core", path: "../CoreFramework"),
.project(target: "Data", path: "../DataFramework"),
.project(target: "UIComponents", path: "../UIComponentsFramework")
]),
Target(name: "FrameworkATests",
platform: .iOS,
product: .unitTests,
bundleId: "io.tuist.FrameworkATests",
infoPlist: "Tests.plist",
sources: "Tests/**",
dependencies: [
.target(name: "FrameworkA")
])
])

View File

@ -0,0 +1,10 @@
import Foundation
import FeatureContracts
class FrameworkA {
func run(featureB: FeatureBContract) {
featureB.run()
let a = featureB.expose()
print(a)
}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
import Foundation
import XCTest
@testable import FrameworkA
final class FrameworkATests: XCTestCase {
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,30 @@
import ProjectDescription
let project = Project(name: "FeatureContracts",
targets: [
Target(name: "FeatureContracts",
platform: .iOS,
product: .staticFramework,
bundleId: "io.tuist.FeatureContracts",
infoPlist: "Info.plist",
sources: ["Sources/**"],
resources: [
/* Path to resouces can be defined here */
// "Resources/**"
],
dependencies: [
/* Target dependencies can be defined here */
// .framework(path: "Frameworks/MyFramework.framework")
.project(target: "Data", path: "../DataFramework"),
.project(target: "Core", path: "../CoreFramework")
]),
Target(name: "FeatureContractsTests",
platform: .iOS,
product: .unitTests,
bundleId: "io.tuist.FeatureContractsTests",
infoPlist: "Tests.plist",
sources: "Tests/**",
dependencies: [
.target(name: "FeatureContracts")
])
])

View File

@ -0,0 +1,5 @@
import Foundation
public protocol FeatureAContract {
func run()
}

View File

@ -0,0 +1,6 @@
import Foundation
import Core
public protocol FeatureBContract {
func run()
func expose() -> CoreClass
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
import Foundation
import XCTest
@testable import FrameworkA
final class FrameworkAContractTests: XCTestCase {
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,29 @@
import ProjectDescription
let project = Project(name: "UIComponents",
targets: [
Target(name: "UIComponents",
platform: .iOS,
product: .staticFramework,
bundleId: "io.tuist.UIComponents",
infoPlist: "Info.plist",
sources: ["Sources/**"],
resources: [
/* Path to resouces can be defined here */
// "Resources/**"
],
dependencies: [
/* Target dependencies can be defined here */
// .framework(path: "Frameworks/MyFramework.framework")
.project(target: "FeatureContracts", path: "../FeatureContracts")
]),
Target(name: "UIComponentsTests",
platform: .iOS,
product: .unitTests,
bundleId: "io.tuist.UIComponentsTests",
infoPlist: "Tests.plist",
sources: "Tests/**",
dependencies: [
.target(name: "UIComponents")
])
])

View File

@ -0,0 +1,7 @@
import Foundation
import UIKit
import Data
class UIComponentA: UIView {
let data = DataClass()
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
import Foundation
import XCTest
@testable import UIComponents
final class UIComponentATests: XCTestCase {
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,29 @@
import ProjectDescription
let project = Project(name: "StaticApp",
targets: [
Target(name: "StaticApp",
platform: .iOS,
product: .app,
bundleId: "io.tuist.StaticApp",
infoPlist: "Info.plist",
sources: ["Sources/**"],
resources: [
/* Path to resouces can be defined here */
// "Resources/**"
],
dependencies: [
/* Target dependencies can be defined here */
// .framework(path: "Frameworks/MyFramework.framework")
.project(target: "FrameworkA", path: "../Frameworks/FeatureAFramework")
]),
Target(name: "StaticAppTests",
platform: .iOS,
product: .unitTests,
bundleId: "io.tuist.StaticAppTests",
infoPlist: "Tests.plist",
sources: "Tests/**",
dependencies: [
.target(name: "StaticApp")
])
])

View File

@ -0,0 +1,20 @@
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let viewController = UIViewController()
viewController.view.backgroundColor = .white
window?.rootViewController = viewController
window?.makeKeyAndVisible()
return true
}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
import Foundation
import XCTest
@testable import StaticApp
final class StaticAppTests: XCTestCase {
}

View File

@ -0,0 +1,7 @@
import ProjectDescription
let workspace = Workspace(name: "Workspace",
projects: [
"StaticApp",
"Frameworks/**",
])