2013 年 11 月 14 日
关注 @fabiopelosinTL;DR:CocoaPods 0.28 引入了对插件的支持。
在 CocoaPods 中消除功能蔓延并不容易。我们听说了很多好主意,但其中很多都没有被采纳,因为它们对至少 80% 的用户来说没有用。理想的解决方案是对第三方插件提供支持,幸运的是,Les Hill 提供了一个优雅精简的补丁来实现这一点。
插件支持允许调整 CocoaPods 的内部结构并插入其他命令。事实上,从一开始就有两条新命令可用
插件的可发现性是我们考虑的另一个重要主题。我们的解决方案是采用非强制性约定:插件应以 cocoapods-PLUGIN_NAME
格式命名。这样,要检查可用的插件,您只需使用这个方便的 RubyGems 搜索 即可。
此版本还包括大量错误修复,主要与 xcassets 资源的处理相关。
创建插件
CocoaPods 插件是一个 gem,其中包含一个名为 cocoapods_plugin.rb
的文件。对于任何包含该文件的已安装 gem,CocoaPods 都会加载此文件。该文件将在运行任何命令之前加载,但在 CocoaPods 的文件(及其依赖项的文件)加载之后加载。约定是使用此文件来要求插件的实际实现。
例如,cocoapods-open 具有以下 cocoapods_plugin.rb
require 'pod/command/open'
要创建新的 gem,可以使用 bundler,它提供了一个便捷的命令
$ bundle gem NAME
添加子命令
添加新的子命令非常容易。您只需要创建一个子类,该子类将用作命名空间。随后,有必要提供新命令的元数据及其逻辑。有关更多信息,您可以查看 CLAide gem 的文档和 CocoaPods 命令的 源代码。
如果这听起来很复杂,不要害怕;我们热爱简单!实际上,这些步骤的实现比它们的描述更简单。接下来,您可以找到 pod spec doc
命令的完整实现。
# lib/pod/command/spec/doc.rb
module Pod
class Command
class Spec
class Doc < Spec
self.summary = "Opens the web documentation of a Pod."
self.description = <<-DESC
Opens the web documentation of the Pod with the given NAME.
DESC
self.arguments = 'NAME'
def initialize(argv)
@name = argv.shift_argument
super
end
def validate!
super
help! "A Pod name is required." unless @name
end
def run
path = get_path_of_spec(@name)
spec = Specification.from_file(path)
UI.puts "Opening #{spec.name} documentation"
`open "http://cocoadocs.org/docsets/#{spec.name}"`
end
end
end
end
end
API
到目前为止,尚未定义用于访问 CocoaPods 逻辑的显式 API。因此,如果未来版本的 CocoaPods 中断了您的使用,请尽量优雅地失败。另外,请告诉我们您的需求,以便我们考虑它们来最终确定 API。
清单
- 按照
cocoapods-PLUGIN_NAME
约定命名插件。 - 包含一个
cocoapods_plugin.rb
文件。 - 使用
cocoapods_plugin.rb
文件加载实际实现。 - 在依赖 CocoaPods 方法时优雅地失败。
- 如果您做了一些很酷的事情,请告诉我们!
更新
要安装 CocoaPods 的最新版本,您可以运行
$ [sudo] gem install cocoapods
在 1.0 版本之前,我们强烈建议您保持 CocoaPods 的最新状态。
有关所有详细信息,请不要错过 变更日志。