podspec 依赖和 Podfile pod 声明的区别
Posted
技术标签:
【中文标题】podspec 依赖和 Podfile pod 声明的区别【英文标题】:Difference between podspec dependency and Podfile pod declaration 【发布时间】:2015-03-30 05:14:02 【问题描述】:我有一个 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)
【问题讨论】:
我最近遇到了同样的问题。你有没有想过编辑podspec
和编辑Podfile
之间的区别?我在网上看到的大多数文档都说你应该编辑你的Podfile
,但是我想知道podspec
的意义是什么?
【参考方案1】:
你可以说 Podfile 是你的 project 配置,Podspec 是你的 library 配置。
Pod 文件:
存在于根目录,文件名为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
文件中,您可以在其他 repos 中引用包含 podspec 的本地目录。
更多关于Podspec in the documentation的信息。
规范描述了 Pod 库的一个版本。它包括有关应从何处获取源、要使用的文件、要应用的构建设置以及其他常规元数据(例如其名称、版本和描述)的详细信息。
给未来读者的说明
我建议你通过 Swift 包管理器而不是 Cocoapods 或 Carthage 来发布你的包/库。 Cocoapods 的所有好处都可以通过 SPM 实现。用户可以轻松迁移到在其 Xcode 项目中使用 Swift 包,因为它是内置的,因此无需支持其他包管理器。
【讨论】:
【参考方案2】:如果我理解正确,你需要两者。
您将 Util 放在 Main 的 Podfile
中,以便它可以使用和编译。
您将 Util 放在 Main 的 .podspec
中,这样任何安装 Main 的人都会自动获得 Util以及 主要。
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:
pod "Kite-Print-SDK", "~> 1.0"
pod "Kite-Print-SDK/PayPal", "~> 1.0"
pod "Kite-Print-SDK/ApplePay", "~> 1.0"
【讨论】:
以上是关于podspec 依赖和 Podfile pod 声明的区别的主要内容,如果未能解决你的问题,请参考以下文章