podspec依赖项和Podfile pod声明之间的区别

时间:2015-01-30 16:54:37

标签: ios cocoapods podspec

我有一个cocoapod的项目(让我们称之为“Main”),它与另一个cocoapod有一个依赖关系(我们称之为“Util”)。

我可以通过“pod'Util'”在Main的Podfile中添加Util,并通过“s.dependency'Util'”将其指定为podspec中的依赖项

只要至少写入其中一个,我的pod测试项目运行正常(如果没有podspec中的依赖项,运行“pod lib lint”命令会返回错误)

在Podfile中指定pod允许我更精确地了解我想要版本的精确程度,甚至允许我使用:head作为目标。但是,依赖性似乎更加有限,需要标记。

我想知道这两种方法之间的区别,以及当一个pod依赖于另一个pod时是否有好的做法(特别是因为我最终想要将Main用作其他项目的pod)

2 个答案:

答案 0 :(得分:0)

您可以说 Podfile 是您的项目配置,而 Podspec 是您的配置。

Podfile:

  • 存在于根目录中,作为名为 Podfile 的文件
  • 所有想要使用 Cocoapods 的应用程序(例如通过 pod 'library_name' 添加依赖项)都需要有一个 Podfile。这是信息的来源。

Podspec(Pod 库规范):

  • 存在于根目录中,名为 Library_name.podspec 的文件,其格式为 Ruby DSL 语法
  • 将您的库上传到 Cocoapods.org(或通过 pod 'library_name' 使用)需要此文件。当您 pod trunk push 时,您正在推送此文件的 JSON 版本,例如LibName.podpsec.json,例如 here
  • 库/包还可以在 Podspec 之上指定一个 Podfile,用于开发人员在下游用户使用库时不希望访问的特定代码。
  • 它有版本限制,因为由使用库(Podfile)的应用程序决定选择版本

差异:

就您而言,您只有不与任何人共享的代码。因此,它不需要是一个库,您可以将 Podfile 中的所有内容作为单独的目标,甚至不需要 Podspec。如果你想通过 Cocoapods 与其他人共享库,那么你需要 Podspec 文件。但是,如果您想在不同的项目中重用 main,那么您想与这些项目共享的配置应该在 .podspec 文件中,并且您可以在其他存储库中引用包含 podspec 的本地目录。

有关 Podspec in the documentation 的更多信息。

<块引用>

规范描述了 Pod 的一个版本。它包括有关应从何处获取源、要使用的文件、要应用的构建设置以及其他常规元数据(例如其名称、版本和描述)的详细信息。

给未来读者的注意事项

我建议您通过 Swift Package Manager 而不是 Cocoapods 或 Carthage 发布您的包/库。 Cocoapods 的所有好处都可以通过 SPM 实现。用户可以轻松地在他们的 Xcode 项目中迁移到使用 Swift 包,因为它是内置的,因此不需要支持其他包管理器。

答案 1 :(得分:-1)

如果我理解正确,你需要两者。

您将 Util 放在 Main Podfile中,以便它可以使用它并进行编译。

您将 Util 放在.podspec中,以便任何安装 Main 的人都会自动获得 Util 以及 Main

同样this article可能对您有用,因为它显示了如何通过subspec获得可选的依赖项。

您可以制作包含不同依赖项的pod的多个版本。例如,从文章中可以看出以下.podspec

...
spec.default_subspec = 'Lite'

spec.subspec 'Lite' do |lite|
    # subspec for users who don't want the third party PayPal 
    # & Stripe bloat
end

spec.subspec 'PayPal' do |paypal|
    paypal.xcconfig =  
        { 'OTHER_CFLAGS' => '$(inherited) -DKITE_OFFER_PAYPAL' }
    paypal.dependency   'PayPal-iOS-SDK', '~> 2.4.2'
end

spec.subspec 'ApplePay' do |apple|
    apple.xcconfig =   
        { 'OTHER_CFLAGS' => '$(inherited) -DKITE_OFFER_APPLE_PAY' }
    apple.dependency      'Stripe', '2.2.0'
    apple.dependency      'Stripe/ApplePay'
end

允许以下3个广告连播:

pod "Kite-Print-SDK", "~> 1.0"
pod "Kite-Print-SDK/PayPal", "~> 1.0"
pod "Kite-Print-SDK/ApplePay", "~> 1.0"