【问题标题】:Using CocoaPods with multiple projects在多个项目中使用 CocoaPods
【发布时间】:2013-05-28 14:58:29
【问题描述】:

我有一个工作区,其中包含:

  • myiPhone.xcodeproj
  • sharedStuff/sharedStuff.xcodeproj

sharedStuff.xcodeproj 构建一个静态库,它是 myiPhone.xcodeproj 的依赖项(为简单起见,假设每个项目都有一个目标)。

现在我想通过 CocoaPods 添加一个对两个项目都可用的库。

我的 Pods 文件如下所示:

workspace 'myWorkspace.xcworkspace'
platform :ios

target :myiPhone do
    xcodeproj 'myiPhone.xcodeproj'
    pod 'MBProgressHUD', '~> 0.6'
end


target :sharedStuff do
    xcodeproj 'sharedStuff/sharedStuff.xcodeproj'
    pod 'MBProgressHUD', '~> 0.6'
end

当我构建时,我得到了这些错误:

diff: /../Podfile.lock: 没有这样的文件或目录 diff: /Manifest.lock: 没有这样的文件或目录 错误:沙箱与 Podfile.lock 不同步。运行 'pod install' 或更新你的 CocoaPods 安装。

有人知道这里发生了什么吗?

更新: 从外观上看,执行“Check Pods Manifest.lock”构建阶段时没有设置 PODS_ROOT 变量。

【问题讨论】:

  • 我遇到了同样的问题。解决这个问题会很好!

标签: ios xcode cocoapods xcconfig


【解决方案1】:

我的工作区中有 2 个项目,接受的答案对我不起作用。但最后我已经设法让 Cocoapods 与 2 个项目一起正常工作。这是我的 pod 文件的样子:

workspace 'Projects.xcworkspace'
platform :ios, '8.0'

use_frameworks!

# ignore all warnings from all pods
inhibit_all_warnings!

def shared_pods
    # all the pods go here
    # pod 'Parse' etc.
end

xcodeproj 'Project1.xcodeproj'
xcodeproj 'Project2/Project2.xcodeproj'

target :Project1 do
  xcodeproj 'Project1'
  shared_pods
end

target :Project2 do
  xcodeproj 'Project2/Project2.xcodeproj'
  shared_pods
end

【讨论】:

  • 如果您的项目 2 是项目 1 的依赖项,这不会导致重复符号吗?
  • 没有。为什么这会导致重复符号?
  • @RahulVyas 我不再使用这种方法了。你解决了这个问题吗?如果是,请随时编辑答案。
  • @AndreyGordeev 是的,这个问题实际上是我自己为设备构建的错误,我没有包含任何配置文件。
  • cocoapods 现在有不同的共享 pod 机制。让我将其发布为答案
【解决方案2】:

使用当前语法看起来像这样

use_frameworks!
workspace 'myWorkspace'

project 'myiPhone'
project 'sharedStuff/sharedStuff'


target 'myiPhone' do
    project 'myiPhone'
    pod 'MBProgressHUD', '~> 0.6'
end


target 'sharedStuff' do
    project 'sharedStuff/sharedStuff'
    pod 'MBProgressHUD', '~> 0.6'
end

【讨论】:

    【解决方案3】:

    您的 xcode 项目中的第一个目标有一个构建阶段,用于对两个锁定文件执行差异。但是您的 xcode 项目配置似乎没有引用 Pods/Pods-libPods.xcconfig 中配置的用户定义设置。

    您似乎正在尝试将 Pod 与多个 xcodeprojs 中的特定目标链接。如果我的假设是正确的,那么您错误地使用了 target 属性。 target 属性在 Pods 项目中创建一个新的静态库,其中包括您在该 target 中配置的 Pod。

    Pods xcodeproj 的默认目标是生成 libPods.a 静态库的 libPods。如果您未指定 target,则会生成此消息。因此,如果您不关心在 Pods xcodeproj 中生成多个静态库,请不要费心定义目标并使用 link_with 属性将默认 libPods target(静态库)链接到 xcodeprojs 中的目标。

    例如,以下 Podfile 将在 Pods.xcodeproj 中创建一个 libPods 目标,它将 MBProgressHUD 源添加到编译阶段,然后将定义 PODS_ROOT 和 PODS_HEADER_SEARCH_PATH 的 xcconfig 文件添加到每个 xcodeprojs 中。然后它将这个静态库链接到您使用link_withxcodeproj 指定的目标

    workspace 'myWorkspace.xcworkspace'
    platform :ios
    
    xcodeproj 'myiPhone.xcodeproj'
    link_with 'myiPhone'
    xcodeproj 'sharedStuff/sharedStuff.xcodeproj'
    link_with 'sharedStuff'
    
    pod 'MBProgressHUD', '~> 0.6'
    

    【讨论】:

    • 您对 target 与 link_with 的看法是对的。检查 Podfile.lock 的构建阶段似乎没有正确更新,所以我不得不手动删除它并进行 pod install。此外,我意识到将 pod 与我的主要目标以及生成与我的主要目标链接的静态库的目标链接是不正确的,因为它会导致重复符号。不过这是有道理的,而且不是 CocoaPods 的问题。
    • @MihaiDamian 你对重复的符号做了什么。最终,您希望 pod 库仅链接到主应用程序目标,而不是静态库。
    • 这对我不起作用。只有最后一个 link_with 声明得到兑现。所以在上面的例子中,与Pods.a 链接的唯一目标是“sharedStuff”。
    • @AndreyGordeev 我最终使用cocoapods-packager 工具从每个 pod 构建了一个框架,然后将它们拖到 XCode 中。我不使用 Cocoapods 与 XCode 的集成。如果您的依赖项支持它,您还可以使用更新的包管理器Carthage,它基本上采用了这种方法。
    【解决方案4】:

    这是我的文件夹结构

    OB
    |podfile
    |Project1->Project1.xcodeproj
    |Project2->Project2.xcodeproj
    

    这是我在 OB 文件夹中的 podfile

    source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, '8.0'
    
    workspace 'OB.xcworkspace'
    use_frameworks!
    
    # ignore all warnings from all pods
    inhibit_all_warnings!
    
    project 'Project1/Project1.xcodeproj'
    project 'Project2/Project2.xcodeproj'
    
    abstract_target 'OB' do
        pod 'Alamofire', '~> 4.0'
    
        target 'Project1' do
            project 'Project1/Project1.xcodeproj'
        end
    
        target 'SchoolKids' do
            project 'Project2/Project2.xcodeproj'
        end
    end
    

    这会将 Afnetworking/Alamofire 添加到两个项目中。如果我们需要一个特定项目的专有 pod,那么我们可以这样做

     target 'Project1' do
            project 'Project1/Project1.xcodeproj'
            pod 'Alamofire', '~> 4.0'
        end
    

    【讨论】:

      【解决方案5】:

      感谢 Rahul Vyas 的回答,我终于在我的项目中取得了成功。 我的项目在 react-native 中,我使用 git 子模块作为子项目。 所以这是我的 pod 文件:

      workspace 'LuminPDFApp.xcworkspace'
      # Uncomment the next line to define a global platform for your project
      platform :ios, '9.0'
      use_frameworks!
      
      inhibit_all_warnings!
      
      project 'LuminPDFApp.xcodeproj'
      project '../submodules/react-native-filepicker/ios/RNFilePicker.xcodeproj'
      
      abstract_target 'LuminPDFApp' do
          pod 'SwiftyDropbox'
      
          target 'LuminPDFApp' do
              project 'LuminPDFApp.xcodeproj'
          end
      
          target 'RNFilePicker' do
              project '../submodules/react-native-filepicker/ios/RNFilePicker.xcodeproj'
          end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-22
        • 2016-04-08
        • 2014-09-20
        • 2021-12-16
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多