使用与tuist共享框架

发布于 2025-02-12 20:16:58 字数 111 浏览 1 评论 0原文

我将现有的XCode现有项目迁移到使用Tuist。该应用程序具有主应用程序,观看应用程序和通知扩展名。每个项目之间都有大量共享代码。

如何使用TUIST在iOS和WatchOS代码之间共享框架?

I am migrating an existing project in Xcode to using Tuist. The application has a main app, Watch App, and a notification extension. There is loads of shared code between each project.

How can I use Tuist to share a framework between the iOS and watchOS code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

悲歌长辞 2025-02-19 20:16:58

我认为我有一个解决方案,可以在WatchOS和iOS之间共享代码。第一步是需要为每个平台生成一个框架。为了使框架整合到较大的应用程序中,我做了以下内容:

  • 将product_module_name和product_name设置为iOS应用程序的目标名称。这将使您可以使用相同名称导入特定于平台的框架。
  • 包括可选平台特定的源文件夹。

例子:

/* File structure
  Project.swift
  Tuist
    ProjectDescriptionHelpers
       Project+Templates.swift
  Projects
    MyFramework
      Sources
      Sources-watchOS
    MyLogging
      Sources
      Sources-iOS  
      Sources-watchOS  
*/

//Project.swift
var targets: [Target] = []
targets += Target.makeFrameworkTargets(name: "MyLogging", platforms: [.iOS, .watchOS])
targets += Target.makeFrameworkTargets(name: "MyFramework", platforms: [.iOS, .watchOS], dependencies:["MyLogging"])


// Tuist/ProjectDescriptionHelpers/Project+Templates.swift
extension Target {
    // Project Root. Not sure the best way to do this in Tuist
    static let rootDir: URL = URL(fileURLWithPath: #file)
        .deletingLastPathComponent()
        .deletingLastPathComponent()
        .deletingLastPathComponent()


    public static func makeFrameworkTargets(name: String,
                                            platforms: [Platform],
                                            dependencies: [String] = []) -> [Target] {
        var projectTargets: [Target] = []

        for platform in platforms {
            let targetDependencies: [TargetDependency] = dependencies.map {
                let title = platform == .iOS ? $0 : "\($0)-\(platform)"
                return .target(name: title)
            }

            let title = platform == .iOS ? name : "\(name)-\(platform)"
            var settingsDict: SettingsDictionary = [:]
            settingsDict["PRODUCT_MODULE_NAME"] = .string(name)
            settingsDict["PRODUCT_NAME"] = .string(name)

            var sources = ["Projects/\(name)/Sources/**/*.swift"]

            let platformSource = rootDir.appendingPathComponent("/Projects/\(name)/Sources-\(platform)")
            if FileManager.default.fileExists(atPath: platformSource.path) {
                sources.append("Projects/\(name)/Sources-\(platform)/**/*.swift")
            }

            let settings = Settings.settings(base: settingsDict, configurations: [])
            projectTargets.append(Target(name: title,
                                         platform: platform,
                                         product: .framework,
                                         bundleId: "io.tuist.\(title)",
                                         infoPlist: .default,
                                         sources: SourceFilesList(globs: sources),
                                         dependencies: targetDependencies,
                                         settings: settings))

        }
        return projectTargets
    }
}

I think I have a solution for sharing code between watchOS and iOS. The first step is that a framework needs to be generated for each platform. To make the frameworks integrate into the larger application better I did the follow:

  • Set PRODUCT_MODULE_NAME and PRODUCT_NAME to the target name of the iOS app. This will allow you to import your platform-specific framework using the same name.
  • Included optional platform-specific source folders.

Example:

/* File structure
  Project.swift
  Tuist
    ProjectDescriptionHelpers
       Project+Templates.swift
  Projects
    MyFramework
      Sources
      Sources-watchOS
    MyLogging
      Sources
      Sources-iOS  
      Sources-watchOS  
*/

//Project.swift
var targets: [Target] = []
targets += Target.makeFrameworkTargets(name: "MyLogging", platforms: [.iOS, .watchOS])
targets += Target.makeFrameworkTargets(name: "MyFramework", platforms: [.iOS, .watchOS], dependencies:["MyLogging"])


// Tuist/ProjectDescriptionHelpers/Project+Templates.swift
extension Target {
    // Project Root. Not sure the best way to do this in Tuist
    static let rootDir: URL = URL(fileURLWithPath: #file)
        .deletingLastPathComponent()
        .deletingLastPathComponent()
        .deletingLastPathComponent()


    public static func makeFrameworkTargets(name: String,
                                            platforms: [Platform],
                                            dependencies: [String] = []) -> [Target] {
        var projectTargets: [Target] = []

        for platform in platforms {
            let targetDependencies: [TargetDependency] = dependencies.map {
                let title = platform == .iOS ? $0 : "\($0)-\(platform)"
                return .target(name: title)
            }

            let title = platform == .iOS ? name : "\(name)-\(platform)"
            var settingsDict: SettingsDictionary = [:]
            settingsDict["PRODUCT_MODULE_NAME"] = .string(name)
            settingsDict["PRODUCT_NAME"] = .string(name)

            var sources = ["Projects/\(name)/Sources/**/*.swift"]

            let platformSource = rootDir.appendingPathComponent("/Projects/\(name)/Sources-\(platform)")
            if FileManager.default.fileExists(atPath: platformSource.path) {
                sources.append("Projects/\(name)/Sources-\(platform)/**/*.swift")
            }

            let settings = Settings.settings(base: settingsDict, configurations: [])
            projectTargets.append(Target(name: title,
                                         platform: platform,
                                         product: .framework,
                                         bundleId: "io.tuist.\(title)",
                                         infoPlist: .default,
                                         sources: SourceFilesList(globs: sources),
                                         dependencies: targetDependencies,
                                         settings: settings))

        }
        return projectTargets
    }
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文