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官方仓库。
我们不需要更改Gemfile和Rakefile ,因此请保持 不变 。
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之前,我们需要检查以下几件事:
- 确保我们在git仓库中
- 确保.git-hooks目录存在
- 确保.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_install和post_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_install和post_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插件列表
随时在下面的评论部分中留下任何问题或建议。
- CocoaPods库的错误build设一些iOS模拟器
- pod安装失败,错误:在Pod中安装iOS时,由“Podfile”需要库(来自`../`)`
- 问题时,创build我的第一个CocoaPod
- iOS pod安装gcm和pnchartswift
- 使用Cocoapods 0.37,Swift框架无法findGoogleAnalytics-iOS-SDK的标头
- 包装在Cocoapods中的GoogleMapsUtils框架在Xcode上生成错误
- 我怎么能从一个NSBundle中的Assets.car(编译版本的xcassets)加载图像?
- Xcode无法看到通过Cocoapods添加的对象
- 创buildpodspec来运送静态库