podspec依赖和Podfile中的pod声明有什么区别?

16

我有一个CocoaPods项目(我们称其为“Main”),其中依赖于另一个CocoaPods项目(我们称其为“Util”)。

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

只要至少写了其中之一,我的pod测试项目就可以正常运行(尽管在podspec中没有依赖关系时,运行“pod lib lint”命令会返回错误)。

在Podfile中指定pod允许我更精细地确定所需版本,甚至允许我使用“:head”作为目标。但是,依赖关系似乎更加受限,需要标签。

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


1
我最近遇到了同样的问题。你弄清楚编辑 podspec 和编辑 Podfile 之间的区别了吗?我在网上看到的大部分文档都说应该编辑你的 Podfile,但是我想知道 podspec 的作用是什么? - stevendesu
2个回答

2
您可以说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文件。但是,如果您想在不同的项目中重复使用主要配置,则应将要与这些项目共享的配置放在.podspec文件中,并且您可以在其他仓库中引用包含podspec的本地目录。
有关Podspec的更多信息,请参见文档中的Podspec
引用:
规范描述了Pod库的版本。它包括源应从何处获取,要使用哪些文件,要应用哪些构建设置以及其他一般元数据(例如名称、版本和描述)的详细信息。
未来的读者请注意。
我建议您通过Swift Package Manager发布您的软件包/库,而不是使用Cocoapods或Carthage。所有Cocoapods的好处都可以通过SPM实现。用户可以轻松地在其Xcode项目中迁移到使用Swift Packages,因为它是内置的,所以无需支持其他软件包管理器。

SPM不支持在同一个目标中混合使用不同语言的源文件,例如在同一个目标中混合使用Swift和Objective C文件,但大多数情况下可以通过Swift Package实现。 - Soumya Mahunt

-1

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

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

您将 Util 放入 Main .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

允许使用以下三个pods:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接