在工作区中的所有子框架项目之间共享相同的 pod

Posted

技术标签:

【中文标题】在工作区中的所有子框架项目之间共享相同的 pod【英文标题】:Share same pods across all sub-framework projects in a workspace 【发布时间】:2022-01-09 03:06:21 【问题描述】:

我想在工作区中包含的所有项目之间共享 pod。这还包括将来要添加的任何其他项目。以下是我当前项目文件夹结构的大致样子:

+-- MyApp
|
+-- MyApp.xcworkspace
|
+-- Group 1
|    |
|    +-- Project1
|    |    |
|    |    +-- Target1.xcodeproj
|    |    +-- (source code)
|    |    |
|    |    +-- Target1Tests
|    |    +-- (source code)
|    |
|    +-- Project2
|    |    |
|    |    +-- Target2.xcodeproj
|    |    +-- (source code)
|    |    |
|    |    +-- Target2Tests
|    |    +-- (source code)
|
+-- Group 2
|    |
|    +-- Project3
|    |    |
|    |    +-- Target3.xcodeproj
|    |    +-- (source code)
|    |    |
|    |    +-- Target3Tests
|    |    +-- (source code)
|    |
|    +-- Project4
|    |    |
|    |    +-- Target4.xcodeproj
|    |    +-- (source code)
|    |    |
|    |    +-- Target4Tests
|    |    +-- (source code)

我已经探索过使用抽象目标,但它仍然需要明确指定所有目标,并且在我的工作区中我有很多项目。以下是我能想到的,我对 ruby​​ 的了解有限:

use_frameworks!
def shared_pods
  pod 'Pod1'
  pod 'Pod2'
end

Dir["**/*.xcodeproj"].select  |project_path| !project_path.to_s.start_with?('Pods') .each do |project_path|
  project_target = File.basename(project_path, ".xcodeproj")
  target project_target do
    workspace 'MyApp'
    project project_path
    shared_pods
  end

  target "#project_targetTests" do
    inherit! :search_paths
  end
end

但运行 pod install 我收到此错误:

[!] Could not automatically select an Xcode project. Specify one in your Podfile like so:

    project 'path/to/Project.xcodeproj'

有什么方法可以实现我想要的吗?

【问题讨论】:

我没有尝试,但我认为您需要使用project = Xcodeproj::Project.open "path/to/Project.xcodeproj" and then loop over its targets project.targets.each 打开项目,如下所示:***.com/a/48505784/5318223 @KirilS。感谢您提供这种方法,但使用它会产生同样的错误。 【参考方案1】:

在从@KirilS 链接的this 答案中获得一些灵感后,我想出了这个修改后的 pod 文件:

use_frameworks!
def shared_pods
  pod 'Pod1'
  pod 'Pod2'
end

workspace 'MyApp'
abstract_target 'MyAppDependency' do
  shared_pods
  Dir["**/*.xcodeproj"].select  |project_path| !project_path.to_s.start_with?('Pods') .each do |project_path|
    proj = Xcodeproj::Project.open project_path
    proj.targets.each do |t|
      target t.name do
        project project_path
      end
    end
  end
end

语法更好的替代方法:

use_frameworks!
def shared_pods
  pod 'Pod1'
  pod 'Pod2'
end

my_ws = 'MyApp'

workspace my_ws
abstract_target 'MyAppDependency' do
  shared_pods
  Xcodeproj::Workspace.new_from_xcworkspace("#my_ws.xcworkspace").file_references
   .select  |file| /^((?!Pods).)*\.xcodeproj/.match file.path 
   .map  |file| Xcodeproj::Project.open file.path .each do |proj|
    proj.targets.each do |t|
      target t.name do
        project proj.path
      end
    end
  end
end

【讨论】:

以上是关于在工作区中的所有子框架项目之间共享相同的 pod的主要内容,如果未能解决你的问题,请参考以下文章

如何与框架项目swift共享父(主机)项目pod?

在不同的测试目标之间有效地共享测试替身

如何为所有子图设置一个颜色条

是否可以在单独的 Angular(子)项目之间共享 NGXS 存储?

在线程之间共享一个类

如何在多个 UITableView 单元格之间共享相同的 UIView