CocoaPods 0.28

TL;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 的最新状态。

有关所有详细信息,请不要错过 变更日志