美文网首页
搭建CocoaPods私有库

搭建CocoaPods私有库

作者: Edtion | 来源:发表于2017-11-16 12:37 被阅读0次

因为公司的需要重新搞了一次CocoaPods,于是记录一下这次折腾下来的整个过程。

准备

开始之前,先说一下开发环境,macOS High Sierra 10.13.1系统(强调这个是因为中间为了它费了不小的功夫)。

开始

因为之前踩了高版本CocoaPods的坑,所以选择了CocoaPods 1.0.1问题较少的版本作为基本的CocoaPods环境。

安装CocoaPods1.0.1

首先检查一下当前系统ruby版本,应该是要求2.2.2版本以上,终端输入

ruby -v

会显示

ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]

字样,如果版本过低,请下载rvm自行升级ruby版本。

然后可能还要安装brew、gem这些东西,iOS开发路上应该已经多多少少的了解过这些东西了,不多说。

最后安装主角CocoaPods 1.0.1
终端输入

gem install cocoapods -v 1.0.1

在安装各种工具的过程中有一个小插曲,就是提示 /usr/local/*没有写入权限,这个时候需要在终端输入

sudo chmod -R a+rwx /usr/local/

来修改文件的权限,但是问题又来了,macOS High Sierra 的系统管理员依然没有权限修改文件的权限。。。
网上找了一下,普遍说法10.12系统以后会默认开启内核保护。于是就跟着网上的教程去关闭内核保护:

先关机,然后按开机,在听到开机声音的一瞬间屏幕亮之前按住 Command-R 进入恢复分区。 然后在 实用工具 栏找到 终端启动运行,输入:

csrutil disable

照做了之后,就有修改文件权限的权限了,然后开始

sudo chmod -R a+rwx /usr/local/

修改文件读写权限,终于可以顺利的安装各种工具了。

正儿八经的开始

其实,前面折腾了半天原因是电脑前段时间出现了问题,于是重新安装更新了系统,各种安装过的工具都需要重新安装,如果本身就有CocoaPods1.0左右比较稳定的版本就不需要上面那些步骤了。

回到正题,公司的需求是要把代码托管在自己的git上构建私有仓库,客户端通过CocoaPods方便集成。

文件准备

1、先在自己的服务器上创建git仓库用来托管代码,将git仓库的地址拷贝下来以便告诉CocoaPods从哪里拉取代码,类似这样:

git@git.edtion.tv:edtion/YTStreamingKit.git
https://git.edtion.tv/edtion/YTStreamingKit.git

上面两个地址分别对应SSH和HTTPS两种协议,具同事说,CocoaPods对HTTPS的支持比较好,这个看个人爱好吧。

2、在源码的根目录下添加LICENSE文件,网上很多模板,只要把

Copyright (c) 2017 Edtion@****.com

改成自己需要的样子就可以了

3、项目工程根目录下创建podspec文件:
cd到项目工程根目录下,执行:

pod spec create 工程名称

就会在目录下生成 ****. podspec文件

编辑****. podspec文件:

#项目名称  
s.name         = "YTStreamingKit"
#CocoaPods上对用的版本号
s.version      = "0.0.2"
#项目简介
s.summary      = "YT streaming SDK."
#项目详细描述
s.description  = %{
                    这是一个私有仓库仅供YT使用!
                    }
#主页地址
s.homepage     = "https://www.edtion.tv"
#license文件的类型和名称  type对应第2步创建的license文件的第一行,是什么类型就写什么类型,我们选择大众型MIT,file对应你的license文件名,我取名为LICENSE
s.license      = { :type => "MIT", :file => "LICENSE" }
#开发者姓名和联系邮箱
s.author             = { "Edtion" => "edtion@yeah.net" }
#支持的iOS系统最低版本
s.platform     = :ios, "8.0"
#源码路径,这里就填写第1步我们的代码仓库地址
s.source       = { :git => "https://git.edtion.tv/edtion/YTStreamingKit.git", :tag => s.version }
#源文件路径  一般的OC写的项目只要`{h,m}`就可以了,因为项目中有.c格式的文件,所以改成`{h,m,c}`
s.source_files  = "YTStreamingKit/*.{h,m,c}", "YTStreamingKit/Framework*.{h,m,c}"
s.exclude_files = "Classes/Exclude"

到这,遇到了一个问题,项目中用到了其他的第三方lib库和framwork静态库,于是就迷茫了,因为大多数都是说怎样添加xcode自带的依赖库以及同样也托管在CocoaPods上的其他第三方库的方法,并没有说怎么添加项目中的第三方lib库。然后看到了上面的添加源文件路径,是不是可以写成这样{h,m,c,a},当时写出来之后自己心里都没谱。。。
后来午休的时候闲着无聊用手机科学上网找了一下,发现了一篇文章有提到添加第三方依赖的方法,感谢作者。

继续编写podspec文件:

#添加项目中的第三方lib
s.vendored_libraries  = 'YTStreamingKit/*.{a}'
#添加项目中的第三方framework
s.vendored_frameworks = 'YTStreamingKit/xxxx.framework','YTStreamingKit/xxxx.framework'
#添加资源文件
s.resource_bundles = {'Resources' => 'YTStreamingKit/xxxx.bundle'}
#添加iOS原生framework
s.ios.frameworks  = 'Foundation', 'UIKit', 'CoreMotion'
#xcode自带lib
s.library  = 'stdc++'
#dependency : 该pod依赖的pod
s.dependency "FFmpeg", "~> 2.8.3"
#build setting 的设置
s.user_target_xcconfig =   {'OTHER_LDFLAGS' => ['-lObjC','-all_load']}
#arc模式下运行
s.requires_arc = true

podspec文件基本算是编辑完了

重新回头想了一下{h,m,c,a}为什么不行,其实参数就已经很好的反映出信息了s.source_files源文件、有源码的文件,lib当然不是能看见源码的文件 - -!。

4、验证podspec
还是在当前目录,为pod添加版本号,终端运行:

set the new version to 0.0.2
set the new tag to 0.0.2

开始验证

pod spec lint --use-libraries

然后就会各种报错,最主要的是一个不支持模拟器的错误,查资料说只要安装了对应的模拟器就行了,但是我的不一样啊,我的本身就不支持模拟器,最后看到了这篇文章

解决方法是直接修改CocoaPods的验证规范:
1)终端gem which cocoapods
输出:/usr/local/lib/ruby/gems/2.3.0/gems/cocoapods-1.3.0.beta.2/lib/cocoapods.rb
2) 终端open /usr/local/lib/ruby/gems/2.3.0/gems/cocoapods-1.3.0.beta.2/lib/
将第一步命令输出的结果去掉最后的文件名cocoapods.rb,将前面的路径加到 open命令的后面, 执行命令后会在Finder打开一个lib文件夹
3) 在当前lib目录下有个cocoapods文件夹,进入,validator.rb文件就在这个文件夹里找到:

when :ios
      command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator)
      command += Fourflusher::SimControl.new.destination('iPhone 4s', deployment_target)

修改为:

when :ios
      #command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator)
      #command += Fourflusher::SimControl.new.destination('iPhone 4s', deployment_target)
        command += %w(--help)

那么问题又来了,系统提示我文件是lock的状态,并且我没有unlock的权限。。。
又是权限,不用想了,内核保护已经关了,当前用户也是管理员,那最后的权力最大的用户就是ROOT权限的用户了。

启用ROOT用户:
左上角的->系统偏好设置->用户与群组->登录选项->加入->打开目录实用工具
左上角"编辑"->启用ROOT用户 设置好密码之后注销当前用户就可以登录ROOT用户了
登录了ROOT用户就可以执行修改CocoaPods的验证规范的操作了。

到此,再执行pod spec lint顺利通过。

5、上传

将上面过程弄好的文件上传到第1步创建的git仓库,并创建0.0.2分支,分支命名一定要是****. podspec文件中s.version对应的版本号,并打上tag0.0.2

因为是私有的CocoaPods,我们需要一个托管podspec文件的仓库:
在自己的服务器上创建git仓库

git@git.edtion.tv:edtion/YTPodspec.git
https://git. edtion.tv/edtion/YTPodspec.git

在pod repo中添加托管地址

pod repo add YTPodspec https://git. edtion.tv/edtion/YTPodspec.git

最后上传****. podspec文件:

pod repo push YTPodspec ****.podspec --use-libraries

到此,我们就创建了CocoaPods私有库。

在项目中引用私有库的时候有一点注意一下,Podfile文件最开始需要指定repo源地址:

source 'https://git. edtion.tv/edtion/YTPodspec.git'
source 'https://github.com/CocoaPods/Specs.git'


platform :ios, '8.0'
#pod "YTStreamingDemo"

target "YTStreamingDemo" do
    pod 'YTStreamingKit', '0.0.2'
end

最后,感谢兄弟全程的陪伴,绕过了很多他前几天他踩过的坑。不然很难这么快搞定。

2017.11.17 更新

私有仓库搭建好之后,用Example工程应用一直在报错,因为之前是用ROOT账户修改validator.rb文件绕过了pod的智能检测,也就避免了检测阶段的各种不通过报错,但是集成到项目中问题就会一一出现。

Command +R 运行Example工程

第一个错误 bitcode enable错误,这个问题大家都知道,在xcode里面点击Project选择相应的targets ,Build Setting 的tab下搜索 Bitcode Enable 将Yes改成No,然后运行。。。还是一样的错误。

最后的解决方法:在Example工程的Podfile文件中添加如下代码:

post_install do |installer|
    
    installer.pods_project.targets.each do |target|
        installer.pods_project.build_configurations.each do |config|
            config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
        
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
    end
end

再次运行,遇见第二个错误,引用的第三方Framework找不到ffmpeg的头文件

Undefined symbols for architecture arm64:
  "_av_frame_unref", referenced from:
      AVE::CGenericRefObjAllocator<AVE::AVFramePool::AVFrameBlock>::CNode::Release() in ****(libve.a-arm64-master.o)

因为我们的播放器也引用了ffmpeg的头文件,所以这个报错的第三方Framework是要求不要有ffmpeg库的,所以就想到了用pod依赖,pod search ffmpeg一下,发现pod上有ffmpeg,直接在podspec文件里添加s.dependency "FFmpeg", "~> 2.8.3"

然后在pod install的时候出现问题了,错误如下:

The 'Pods-YTStreamingKit_Example' target has transitive dependencies that include static binaries: (****/****/libavcodec.a)

过度引用。。

然后继续找问题,发现大家都是把Podfile里面的use_frameworks!一行删掉了,就是让pod打包成.a形式的lib文件引用到项目中,这点之前疏忽了,因为framwork只支持iOS8以上系统,我们的主App是要支持iOS7以上的,所以这块是一定要删掉的。

删掉之后继续编译运行,还有错误:

/Users/edtion/Documents/YTStreamingKit/YTStreamingKit/Example/Pods/../../YTStreamingKit/Classes/****.framework/Headers/****.h:17:9: error: include of non-modular header inside framework module '****': '/Users/edtion/Documents/YTStreamingKit/YTStreamingKit/Example/Pods/Headers/Public/YTStreamingKit/****/****.h' [-Werror,-Wnon-modular-include-in-framework-module]
#import <****/****.h>

第三方的framework平时用很方便,怎么到这里就会有这种错误,然后就检查了一下SDK里面引用到这个****.framework的代码,发现是用@import ****;的方式引用的,并不是常规的 #import <****/****.h>引用头文件方式,于是改回常规方式。

Command +R: everything is perfect!

ps:@import ****;方式引用第三方Framework头文件会把Framework的头文件添加到Modules中,而可能是由于CocoaPods较低的原因,并不支持以这种方式引用第三方Framework。

参考文献:
iOS组件化之cocopods私有库搭建
Cocoapods1.0.1版本安装教程
cocoapods 从1.0.0降到0.39.0问题
如何将自己的项目添加Pod
在自己的私有服务器上创建Git仓库
使用私有Cocoapods仓库 中高级用法
解决pod lib lint/repo push不支持i386编译&只能真机运行的库
mac 查看、修改文件权限的命令
CocoaPods官方文档

相关文章

  • CocoaPods私有库搭建说明

    CocoaPods私有库搭建说明 关于CocoaPods CocoaPods是Swift和Objective-C ...

  • CocoaPods开源库的搭建

    前言 如果你看了我之前写的文章《CocoaPods私有库的搭建》,而且有过实战,你会发现《CocoaPods开源库...

  • CocoaPods使用总结

    CocoaPods 公共库的创建CocoaPods 本地私有库的创建(模板创建方式)CocoaPods 本地私有库...

  • Pod搭建开源库小结

    1./Users/xxx/.cocoapods/repos 不管是搭建私有库还是开源库,这个路径下版本库repos...

  • Cocoapods私有库搭建

    最近在整理组件化相关的东西,其中有一项就是用pod管理内部的一些公共组件,为了加深印象,下面把具体步骤记录一下(注...

  • cocoapods 私有库搭建

    直入正题,原理性的东西边写边讲吧~。 首先我们需要用到两个私有git仓库,一个用于存放我们私有代码库,一个用于存p...

  • 搭建CocoaPods私有库

    因为公司的需要重新搞了一次CocoaPods,于是记录一下这次折腾下来的整个过程。 准备 开始之前,先说一下开发环...

  • CocoaPods私有库搭建

    CocoaPods 安装入门就不多说了可以看这个 https://www.jianshu.com/p/ab6411...

  • CocoaPods 私有库搭建

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...

  • CocoaPods - 搭建私有库

    CocoaPods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自...

网友评论

      本文标题:搭建CocoaPods私有库

      本文链接:https://www.haomeiwen.com/subject/hduhvxtx.html