CocoaPods应用篇之搭建并发布自己的私有库

1.在自己的私有服务器上创建Git仓库

第一步:连接私有服务器:

ssh 您的服务器地址

第二步:使用cd命令进入到要创建Git仓库的目录。

第三步:使用如下命令创建并初始化Git仓库:

//test.git要替换成您需要创建的仓库名称
sudo git init --bare test.git

第四步:赋权:

sudo chown -R git:git test.git

至此,在私有服务器创建Git仓库已经完成。

2.编写自己的代码并实时更新到Git仓库

第一步:通过如下指令,将上面创建的空Git仓库加载到本地:

git clone 完整的仓库地址

第二步:编写代码。

第三步:代码编写完成之后,将代码提交到Git仓库。

git push 

第四步:创建tag并将tag上传到Git仓库。

//创建tag
git tag v1.0

//将tag更新到远程仓库
git push origin --tags

//删除本地tag
git tag -d v1.0

//同步删除远程tag
git push origin :refs/tags/v1.0

3.Spec Repo

Spec Repo是一个包含了各种支持CocoaPods导入的类库的一个仓库,官方的Spec Repo是一个在github上的git repo,在我们安装CocoaPods时进行 pod setup 步骤时会将其clone到本地目录 ~/.cocoapods/repos/master 下。

在讲私有库支持CocoaPods之前,我们先看看GitHub库支持CocoaPods的操作步骤。

3.1GitHub库支持CocoaPods

第一步:创建Git仓库并编写代码。

第二步:创建tag。

第三步:在项目工程根目录下创建podspec文件:

pod spec create 工程名称

第四步:编辑podspec文件,示例如下:

Pod::Spec.new do |s|
  s.name             = "GofShakeAndEmail"
  s.version          = "1.0.2"
  s.summary          = "一个好玩的摇一摇截图邮件反馈BUG的库"
  s.description      = <<-DESC
                       一个使用OC实现的摇一摇截图邮件反馈BUG的库.
                       DESC
  s.homepage         = "https://github.com/LeeGof/GofShakeAndEmail"
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { "LeeGof" => "ligfufida@gmail.com" }
  s.source           = { :git => "https://github.com/LeeGof/GofShakeAndEmail.git", :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/NAME'

  s.platform     = :ios, '7.0'
  s.requires_arc = true

  s.source_files = "GofShakeAndEmail/GofShakeAndEmail/*.{h,m}"
  s.frameworks = 'Foundation', 'MessageUI', 'UIKit'

end

第五步:添加LICENSE文件。CocoaPods强制要求所有的Pods依赖库都必须有license文件,否则验证不会通过。license的类型有很多种,详情可以参考网站https://tldrlegal.com/。在创建github仓库的时候,可以选择MIT类型的license。

MIT License

Copyright (c) 2017 LeeGof

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

第六步:添加README.md文件。这个文件用于对仓库进行详细说明,使用的是markdown标记语言。

# GofShakeAndEmail

我们知道,测试人员在测试客户端产品时,当出现问题或者BUG的时候,一般是先对页面截图,然后从相册中选择截图,加上一段描述放到JIRA上或者直接通过邮件发给开发人员,以方便开发人员进行修改,过程繁琐。
现在通过本库,您可以很方便的让测试人员遇到BUG的时候,摇一摇设备,然后自动截图并保存到应用的沙盒之中。截图保存到沙盒之后,在这里会自动的调用系统邮件发送程序,并自动的把错误截图放到邮件正文,在邮件正文,测试人员可以再加上一些对错误的描述信息,然后发送给相应的开发,全程操作便利。

做完上面这些步骤之后,我们看一下工程目录大致如下:

第七步:执行pod验证指令:

pod lib lint

建议这条命令后面跟着--verbose的参数(能看到具体的出错信息),除此之外,这条命令还可以跟其他参数,例如 --allow-warnings 是否允许警告,在用到第三方框架的时候,有的时候是自带会有warmings的代码,用这参数可以屏蔽警告如果一切正常。

这条命令执行完后会出现下面的输出:

【说明】:在执行pod验证命令的时候,打印出了任何warning或者error信息,验证都会失败!如果验证出现异常,打印的信息会很详细,我们可以根据对应提示做出修改。

【注意】:在验证私有库的时候,直接执行如下指令:

pod lib lint --verbose --allow-warnings

有时候会提示一个错误:

遇到这个提示错误信息的时候,使用如下指令:

pod lib lint 文件名称.podspec --use-libraries --allow-warnings

相应的执行上传指令的时候,也需要加上参数:

pod repo push GofSpecs GofKit.podspec --use-libraries  --allow-warnings

第八步:执行pod上传指令:

pod trunk push GofShakeAndEmail.podspec

通过上述命令即可上传项目到Cocoapods官方的仓库里去,当然如果有新的tag版本的话也是通过该命令进行上传新的版本到Cocoapods的。

【注意】:执行上传指令的时候,有时候会出现这样的一个错误信息:

这通常是git库权限的问题。进入到对应的git库,执行如下指令:

sudo chown -R git:git GofSpecs.git

如果是出现下面这种错误信息:

[!] Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.

执行如下指令:

pod trunk register leegof@qq.com leegof

第九步:查看pod操作是否成功。

pod search GofShakeAndEmail

如果发布成功的话,可以看到搜索结果如下:

【注意】:有时候会遇到搜索不到的情况,如下图所示:

当遇到上面这种情况的时候,按如下步骤进行操作:

  1. 执行pod setup。执行该指令之后,我们再试试“pod search GofWebImage”,如果能够成功搜索出结果,那么不需要做下面步骤的操作;如果还是搜索不到,那么继续后续步骤;
  2. 删除~/Library/Caches/CocoaPods目录下的search_index.json文件。

第十步:使用。我们在需要使用的工程项目的Pods文件中,直接加上一句代码就可以了,详细的Pods文件使用,可参考iOS依赖库管理工具之CocoaPods

pod 'GofShakeAndEmail'

3.2私有库支持CocoaPods

通过上面的介绍,私有库和GitHub最大的区别在于GitHub有一个仓库来存放我们的Podspec文件。知道这点之后,那么我们就开始做如下工作。

第一步:创建一个仓库,用于存放Podspec文件。创建Git仓库的方法可查看前面。

第二步:参照3.1小节的内容,一步步执行,到第八步执行上传指令的时候,因为我们是发布到自己的私有服务器上,因此不能按照上面那样做了,具体指令如下:

pod repo push GofSpecs GofNetComponent.podspec

第三步:发布成功之后,使用的时候,区别于3.1小节的是,需要在Pods文件中引入Podspec仓库地址:

source 'git@gofgit:/Data/git/ios/GofSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '7.0'
inhibit_all_warnings!

target 'GofTransitionDemo' do
pod 'GofNetComponent','1.0.1'
pod 'MLTransition'
end

至此,私有库就能正常使用Pod指令引入和使用了。

3.3相关问题

问题一:如果需要在发布的私有库中,使用其他的私有库,该怎么办呢?

因为Podspec文件中并没有指明私有仓库地址的地方,那么肯定就不在Podspec文件里面指明私有仓库的地方,我们只能在验证和上传私有库的时候进行指明。即在下面这两条命令中进行指明:

//校验
pod lib lint GofKit.podspec --sources=https://github.com/CocoaPods/Specs.git,192.168.0.100:Gof/Specs.git

//提交
pod repo push GofSpecs GofKit.podspec --source=https://github.com/CocoaPods/Specs.git,192.168.0.100:Gof/Specs.git

问题二:怎样提供静态库?

使用cocoapods-packager插件来方便生成library(静态库,动态库都可以):

//插件安装
gem install cocoapods-packager

如果提示错误:

这个意思就是提示需要管理员权限才可以进入这个文件夹,可以使用如下指令:

sudo gem install cocoapods-packager

生成静态库的指令:

pod package GofShakeAndEmail.podspec --library --force

其中--library指定打包成.a文件,如果不带上将会打包成.framework文件。--force是指强制覆盖。

4.附录:Podspec文件说明

以下内容摘自网页:http://www.jianshu.com/p/9eea3e7cb3a1

4.1必要属性

Pod::Spec.new do|s|
  //项目名
  s.name ='HycProject'
  //版本号
  s.version ='1.0.1'
  //license文件的类型
  s.license = 'MIT'
  //简单描述
  s.summary = 'ATest in iOS.'
  //项目的getub地址,只支持HTTP和HTTPS地址,不支持ssh的地址
  s.homepage ='https://github.com/hyc603671932/HycProject'
  //作者和邮箱
  s.authors = {'HouKavin' => '603671932@qq.com' }
  //git仓库的https地址
  s.source = { :git=> 'https://github.com/hyc603671932/HycProject.git', :tag =>s.version}
  //是否要求arc(有部分非arc文件情况未考证)
  s.requires_arc = true
 //在这个属性中声明过的.h文件能够使用<>方法联想调用(这个是可选属性)
  s.public_header_files = 'UIKit/*.h'
  //表示源文件的路径,这个路径是相对podspec文件而言的。(这属性下面单独讨论)
  s.source_files ='AppInfo/*.*'
  //需要用到的frameworks,不需要加.frameworks后缀。(这个没有用到也可以不填)
  s.frameworks ='Foundation', 'CoreGraphics', 'UIKit'
end

4.2可选属性

Pod::Spec.new do|s|
  ...
  ...
  ...
  //详细介绍
  s.description = "详细介绍"
  //支持的平台及版本
  s.platform     = :ios, '7.0' 
  //最低要求的系统版本
  s.ios.deployment_target= '7.0'
  //主页,需填写可访问地址
  s.homepage = "https://coding.net/u/wtlucky/p/podTestLibrary"
  //截图                      
  s.screenshots     = "www.example.com/screenshots_1"
  //多媒体介绍地址
  s.social_media_url = 'https://twitter.com/<twitter_username>'  
  //效果和s.public_header_files的相同,只需要配置一种
  s.ios.public_header_files = 'URS/URSAuth.h'
  //不常用,所有文件默认即为private只能用import"XXX"调用
  s.ios.private_header_files 
  #依赖关系,该项目所依赖的其他库
  s.dependency 'AFNetworking', '~> 2.3'
  //可拥有多个dependency依赖属性   
  s.dependency 'JSONKit', '~> 1.4' 

  //动态库所使用的资源文件存放位置,放在Resources文件夹中
  s.resource_bundles = {
    'Test5' => ['Test5/Assets/*.png']
  } 
  //资源文件(具体使用带考证)
  s.resources = 'src/SinaWeibo/SinaWeibo.bundle/**/*.png' 
  //建立名称为Info的子文件夹(虚拟路径)
  s.subspec 'Info' do |ss| 
  //应该和s.subspec作用相同(未考证)
  s.default_subspec='Core'
//多个子subspec
s.default_subspec = ['EmptyView', 'PlaceholderTextView', 'UserManager', 'CellAnimator', 'KFImageProcessor']
end

4.3s.source_files

//下载AppInfo文件夹下的所有文件,子文件夹不识别
s.source_files ='AppInfo'
//下载AppInfo目录下所有格式文件
s.source_files ='AppInfo/*.*'
**/*表示Classes目录及其子目录下所有文件
s.source_files = 'AppInfo/**/*'


//下载HycProject文件夹下名称为AppManInfo和AppWomanInfo的共4项文件
s.source_files ='HycProject/App{Man,Woman}Info.{h,m}'
//目标路径下的文件不进行下载
s.ios.exclude_files = 'AppInfo/Info/json'

4.4文件层次

Pod::Spec.new do|s|
  //第一层文件夹名称HycProject
  s.name ='HycProject'
  ...
  ...
  ...
  //第二层文件夹名称AppInfo(虚拟路径)
  s.subspec 'AppInfo' do |ss|
    //下载HycProject文件夹下AppInfo的.h和.m文件
    ss.source_files = 'HycProject/AppInfo.{h,m}'
    //允许使用import<AppInfo.h>
    ss.public_header_files = 'HycProject/AppInfo.h'
    //依赖的frameworks
    ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics'

    //第三层文件夹名称Info(虚拟路径)
    ss.subspec 'Info' do |sss| 
      //最低要求的系统版本7.0
      sss.ios.deployment_target = '7.0' 
      //只允许使用import"AppInfo.h"访问
      sss.ios.private_header_files = 'AppInfo/Info/**/*.h' 
      // 下载路径下的.h/.m/.c文件       
      sss.ios.source_files = 'AppInfo/Info/**/*.{h,m,c}'  
      //引用xml2库,但系统会找不到这个库的头文件,需与下方sss.xcconfig配合使用(这里省略lib)
      sss.libraries = "xml2" 
      //在pod target项的Header Search Path中配置:${SDK_DIR}/usr/include/libxml2
      sss.xcconfig = { 'HEADER_SEARCH_PATHS' => '${SDK_DIR}/usr/include/libxml2' }       
      //json目录下的文件不做下载
      sss.ios.exclude_files = 'AppInfo/Info/json' 
    end   
  end
end

4.5后续步骤 

//验证podspec文件是否可正常使用
命令行:pod lib lint
//上传podspec到trunk服务器中
命令行:pod trunk push HycProject.podspec
//上传需要一定时间,成功后更新本地pod依赖库
命令行:pod setup
//查看代码有没有通过审核版本是否更新
命令行:pod search HycProject
//下载线上git仓库(Podfile文件不在此讨论)
命令行:pod install

 

posted @ 2017-03-28 20:20  LeeGof  阅读(7886)  评论(0编辑  收藏  举报