【问题标题】:Is there a way to define different dependencies for each project in a same Xcode workspace?有没有办法为同一个 Xcode 工作区中的每个项目定义不同的依赖项?
【发布时间】:2021-10-05 01:20:06
【问题描述】:

我正在尝试创建一个包含多个项目的 Xcode 工作区。我想为每个项目添加不同的依赖项。假设我有 MyApp(主项目)、WebService(框架)和 UIComponent(框架)项目。我不想将 Alamofire 仅添加到 WebService 项目,或者我不想仅将 Lottie 添加到 UIComponent 项目。

MyWorkspace
 |- MyApp
 |- WebService
    |-> Alamofire
 |- UIComponent
    |-> Lottie

问题是,当我将 WebService 和 UIComponent 依赖项添加到我的 MyApp 项目(通过 Xcode 中的链接二进制文件)时,它可以访问我的子项目的依赖项。换句话说,MyApp 项目可以访问和导入 Alamofire 和 Lottie。有没有办法防止MyApp项目无法导入子项目依赖?

我尝试使用 Swift 包管理器和 CocoaPods 来实现这一点,但没有运气。

【问题讨论】:

    标签: ios swift xcode dependencies cocoapods


    【解决方案1】:

    CocoaPods 很好,区分不同的目标

    #targetA: [AFNetworking,Masonry]
    #targetB:[AFNetworking,SDWebImage]
    abstract_target 'abstract_pod' do 
        pod 'AFNetworking'
        
        target 'targetA' do
            pod 'Masonry' 
        end
        
        target 'targetB' do
            pod 'SDWebImage' :path =>'./SDWebImage'
        end
    end
    

    【讨论】:

      【解决方案2】:

      使用 Swift 包管理器

      您实际上不需要工作区来执行此操作。您可以只使用 Xcode 项目。我目前正在为我正在进行的一个项目这样做。

      RootProjectFolder
       - Core // Swift Package
       - DataAccess // Swift Package
       - Http // Swift Package
       - ApplicationServices // Swift Package
       - Presenters // Swift Package
       - App/
       - AppTests/
       - App.xcodeproj
      

      每个包都使用Core,DataAccess中的Http,ApplicationServices中的DataAccess,Presenter中的ApplicationServices,app中的Presenter。

      要创建这样的设置,请打开您的工作区或 Xcode 项目单击文件并创建一个新的 swift 包。将该包保存在应用程序的目录中,并将其链接到您要使用的项目或工作区。

      如果你这样做几次,你可以开始引用其他本地 swift 包,如下所示:

      
      let package = Package(
          name: "ApplicationServices",
          products: [.library(
                  name: "ApplicationServices",
                  targets: ["ApplicationServices"]),
          ],
          dependencies: [
              // NOTE that we can use a relative path to link  
              // to include the other local packages. 
              .package(name: "DataAccess", path: "../DataAccess"),
              .package(name: "Core", path: "../Core"),
              // Or the traditional way of pulling down a remote package
              .package(url: "https://github.com/some-swift/testing-package", .upToNextMajor(from: "9.0.0"))
      
          ],
          targets: [
              .target(
                  name: "ApplicationServices",
                  // This is where you tell the swift package to use a dependency
                  dependencies: ["DataAccess", "Core"]), the
              .testTarget(
                  name: "ApplicationServicesTests",
                  dependencies: ["ApplicationServices", "DataAccess", "Core", "TestingPackage"]),
          ]
      )
      

      然后使用本地包,我们包含它与远程 swift 包略有不同。单击文件导航中的项目,选择应用程序目标,然后在框架、库和嵌入式内容中的常规下单击+ 按钮。您应该能够选择您关心的本地包。

      如果您需要更清楚地描述的任何内容,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多