CocoaPods插件开发入门

2013年发布的CocoaPods插件成为功能强大且优雅的工具,可通过有用的调整和命令来扩展CocoaPods。 我们已经构建了一个简单的CocoaPods插件,该插件可在团队成员之间同步git hook,并希望分享我们的开发经验,以便您可以根据自己的需要制作一个。


CocoaPods插件是Ruby gem,您需要安装Ruby和CocoaPods才能开始开发插件。

要开始开发新插件,您还需要通过运行以下命令安装cocoapods-plugins gem:

  $ gem install cocoapods-插件 

为了演示和调试,让我们使用git仓库创建一个新的Xcode项目:

Xcode>文件>新建>项目>单视图应用程序,不要忘了选中“ 创建git存储库”或通过运行以下命令手动创建它:

  $ git init 

现在我们可以将Pod添加到我们的项目中:

  $ pod init 

或使用我们制作的演示项目来开发cocoapods-githooks插件。

现在是时候通过运行来创建我们的新插件了

  $ pod插件创建了githooks 

在本教程中,我们使用与插件相同的名称。 除非您将无法发布具有相同名称的插件,否则不会有任何区别。

此命令为CocoaPods插件创建样板。

.gemspec文件是我们插件的主要配置文件。 所有spec字段都是自描述的(您可以在此处查看我们插件的gemspec),但是我想指出一件事:

默认情况下, spec.files引用git存储库索引和工作树中的所有文件。 但是,如果您尝试在git中没有文件的情况下构建gem,则将得到一个空的.gem文件,没有警告或错误。 我的建议是将spec.files的值设置为Dir [‘lib / ** / *’] ,它将引用lib目录中的所有文件。

spec.files行替换为

  spec.files = Dir ['lib / ** / *'] 

Gemfile包含执行关联所需的所有gem依赖项
Ruby代码。 有关更多信息,请查看Bundler文档。

Rakefile包含测试规范的参考, spec文件夹包含测试规范。 有关Rake的更多信息,请访问Rake官方仓库。

我们不需要更改GemfileRakefile ,因此请保持 不变

lib是我们要使用的主文件夹。 它包含将被构建到.gem文件中的所有ruby文件。

为了确保一切设置正确,请运行:

  $   gem build cocoapods-githooks.gemspec 

您将看到“成功构建RubyGem”消息。 Cocoapods-githooks-0.0.1.gem文件也将出现在根目录中。

Cocoapods-githooks插件做了一件简单的事情,它将项目的.git-hooks目录中的所有文件复制到.git / hooks /目录中,并使它们在每次运行“ pod install” ,“ pod update”或“ pod ”时都可执行。 githooks’

为此,我们将创建一个类,执行所有文件操作并将其链接到pre-install安装 后的 CocoaPods hooks和githooks命令。

/ lib / cocoapods-githooks中创建githooks-sync.rb文件

需要’ cocoapods’和’ fileutils’模块,并在CocoapodsGitHooks模块内使用sync方法创建GitHooksSync类。

 需要'cocoapods' 
需要'fileutils'模块CocoapodsGitHooks
GitHooksSync类
def同步

结束
结束
结束

在复制git-hooks之前,我们需要检查以下几件事:

  1. 确保我们在git仓库中
  2. 确保.git-hooks目录存在
  3. 确保.git-hooks目录不为空

我们可以通过在sync方法的开头添加下一个条件语句来实现此目的:

 如果!File.directory?(“。git”) 
Pod :: UI.puts“未找到Git存储库”
返回
结束
如果!File.directory?(“。git-hooks”)
Pod :: UI.puts“找不到.git-hooks目录,没有要同步的内容”
返回
结束
如果Dir ['。git-hooks / *']。empty?
Pod :: UI.puts“ .git-hooks目录为空,没有要同步的内容”
返回
结束

在那之后,我们检查钩子目录是否存在于.git中 ,如果不存在,则强制其创建:

 如果!File.directory?(“。git / hooks”) 
FileUtils.mkdir“ .git / hooks”
结束

现在我们准备将钩子从.git-hooks复制到.git / hooks

  FileUtils.cp_r(“。git-hooks /。”,“。git / hooks /”) 

下一步是删除外壳脚本文件扩展名(如果存在)并使文件可执行:

 路径=“ .git / hooks /” 
Dir.open(path).each做| p |
文件名= File.basename(p,File.extname(p))
如果File.extname(p)==“ .sh”
FileUtils.mv(“#{path} /#{p}”,“#{path} /#{filename}”)
结束
FileUtils.chmod(“ + x”,“#{path} /#{filename}”)
结束

我们还在同步方法的开始和结束处添加了两个UI.put ,以显示具有同步状态的系统通知。 完成所有步骤后,您将获得githooks-sync.rb文件:

 需要'cocoapods' 
需要'fileutils'模块CocoapodsGitHooks
GitHooksSync类
def同步
Pod :: UI.puts“同步git钩子”
如果!File.directory?(“。git”)
Pod :: UI.puts“未找到Git存储库”
返回
结束
如果!File.directory?(“。git-hooks”)
Pod :: UI.puts“找不到.git-hooks文件夹,没有要同步的内容”
返回
结束
如果Dir ['。git-hooks / *']。empty?
Pod :: UI.puts“ .git-hooks文件夹为空,没有要同步的内容”
返回
结束
如果!File.directory?(“。git / hooks”)
FileUtils.mkdir“ .git / hooks”
结束FileUtils.cp_r(“。git-hooks /。”,“ .git / hooks /”)
路径=“ .git / hooks /”
Dir.open(path).each做| p |
文件名= File.basename(p,File.extname(p))
如果File.extname(p)==“ .sh”
FileUtils.mv(“#{path} /#{p}”,“#{path} /#{filename}”)
结束
FileUtils.chmod(“ + x”,“#{path} /#{filename}”)
结束
Pod :: UI.puts“同步Git钩子”
结束
结束
结束

注册CocoaPods挂钩

现在让我们在每次“ pod安装”“ pod更新”之后调用sync方法。 为此,我们需要在Pod HooksManager中注册post_installpost_update挂钩。 打开lib / cocoapods_plugin.rb并输入:

 需要'command / githooks' 
require_relative'githooks-sync'模块CocoapodsGitHooks
Pod :: HooksManager.register('cocoapods-githooks',:post_install)
做|上下文|
GitHooksSync.new.sync()
结束
Pod :: HooksManager.register('cocoapods-githooks',:post_update)
做|上下文|
GitHooksSync.new.sync()
结束
结束

如您所见,它非常简单。 我们在HooksManager中注册post_installpost_update挂钩,每次用户运行“ pod install”“ pod update”后,该挂钩都会调用GitHooksSync类的sync方法。

让我们测试一下

通过运行以下命令来构建cocoapods-githooks gem:

  $   gem build cocoapods-githooks.gemspec 

并通过运行安装它:

  $   gem安装cocoapods-githooks-0.0.1.gem 

如果权限有问题,请添加用户安装标志:

  $ gem install cocoapods-githooks-0.0.1.gem --user-install 

跑:

  $安装的pod插件 

确保已正确安装。 它应显示在已安装插件的列表中:

  -cocoapods-githooks:0.0.1(post_install和post_update挂钩) 

如果您看到过时警告,请不要担心,我们将在后续步骤中对其进行修复。

现在让我们回到测试项目。 打开Podfile并在开头添加:

 插件“ cocoapods-githooks” 

跑:

  $ pod安装 

您应该看到我们放入GitHooksSync的两行:

 同步git钩子 
.git-hooks目录未找到,没有要同步的内容

这是因为我们没有创建.git-hooks目录。 创建一个空的pre-commit.sh文件,并将其放入.git-hooks目录(或从我们的演示项目下载)。

跑:

  $ pod更新 

您应该看到git hook已同步:

 同步git钩子 
git钩同步

现在检查.git / hooks目录,它应该包含预提交的可执行文件。

添加自定义CocoaPods命令

添加新命令非常容易。 您只需要创建命令类的子类。 打开lib / cocoapods-githooks / command / githooks.rb并将其内容替换为:

 需要'cocoapods' 
需要'cocoapods-githooks / githooks-sync'include CocoapodsGitHooksmodule Pod
类命令
类Githooks <命令
self.summary = <<-摘要
在团队成员之间同步钩子
概要self.description = <<-DESC
CocoaPods插件,可在团队成员之间同步放置在.git-hooks目录中的git-hooks
DESC self.arguments = [] def运行
CocoapodsGitHooks :: GitHooksSync.new.sync()
结束
结束
结束
结束

这是简单的githooks命令,不带任何参数并调用sync方法。

现在重建并重新安装gem:

  $   gem build cocoapods-githooks.gemspec 
$ gem安装cocoapods-githooks-0.0.1.gem

删除.git内的hooks目录并运行:

  $  豆荚 

请保持RubyGems干净。 避免发布测试和演示宝石。

释放CocoaPods插件是两个步骤。 首先,您需要创建一个帐户并将您的gem发布到RubyGems.org。 现在,您可以直接从RubyGems安装插件:

  $ gem install cocoapods-PLUGIN_NAME 

如果要在官方cocoapods插件列表中列出您的插件,请运行:

  $ pod插件发布 

它将在cocoapods-plugins GitHub存储库中创建一个问题,要求将您的插件添加到官方列表中。 为了加快处理过程,请随意派生cocoapods-plugins,将生成的json对象添加为plugins.json文件的plugins数组中的最后一个对象,并创建拉取请求。

我们已经构建了一个非常简单的CocoaPods插件,但是您可以使用此功能强大的工具做更多的事情。 如果您希望为将来的项目寻找灵感,请运行以下命令,立即浏览50多个可用插件:

  $ pod插件列表 

随时在下面的评论部分中留下任何问题或建议。