草庐IT

CocoaPods 远程私有库

尼古拉斯超仔 2023-03-28 原文

前言

随着iOS APP越来越复杂,功能越来越多,对于iOS项目的工程化要求也越来越高了,对于复杂的APP一般都需要对项目进行模块化管理,由此引出了iOS组件化开发。
iOS组件化开发很重要的一个技术点:CocoaPods私有库的搭建。
私有库由两部分构成项目工程仓库和索引仓库。

文章较长,先列一下操作步骤

一、创建一个私有的索引库(spec repo)的远程库。
二、创建一个私有的存放项目工程的远程库。
三、创建索引库(spec repo)。
四、创建项目工程,并上传到远程私有仓库。
五、向私有的索引库(spec repo)远程库提交索引(podspec)。
六、使用自己创建的私有库。
七、版本更新。
八、.podspec文件说明。

详细步骤

(注:github创建私有项目是收费的,所以这里选择免费的“码云”)
一、创建一个私有的索引库(spec repo)的远程库。

1.创建索引远程库存放本地索引。


image.png
二、创建一个私有的存放项目工程的远程库。
image.png
三、创建索引库(spec repo)。

前往文件夹 ~/.cocoapods/repos,打开终端,在终端切换到当前目录下,然后进行pod repo add操作,在终端输入:

pod repo add CZSpec https://gitee.com/__/czspec.git

注:https://gitee.com/__/czspec.git是刚创建好的索引库(spec Repo)的私有远程库地址。

image.png

pod repo add操作后会clone远程索引库到 ~/.cocoapods/repos文件夹下
image.png

四、创建项目工程,并上传到远程私有仓库。

创建本地pod所需的项目工程文件,在终端,cd切换到某个目录下,这里我选择的是桌面上文件夹Test目录下的,然后执行

pod lib create CZProject
image.png

超时了多执行几次命令就好了

pod lib create CZProject
image.png
image.png

然后进入到CZProject里面找到Classes中的"ReplaceMe.m"文件删除,然后将自己所需要的文件放到这里目录下


image.png

接下来最重要的一步,也是很容易忽略的一步,不然提交后检查会出现很多问题。
具体步骤:

(1)cd 到Example文件下,然后pod install下,更新Example项目的pod。


image.png

(2)打开example中的项目,找到项目中的podspec文件,更改spec。


image.png

修改完成后,cd 到CZProject目录下,然后验证本地podspec文件有效性,终端命令如下
pod lib lint CZProject.podspec
image.png

报了个警告提示用--allow-warnings 忽略,再次执行命令

pod lib lint CZProject.podspec --allow-warnings

本地项目上传到远程仓库中,将本地项目与远程仓库相关联,使用终端命令:

git remote add origin 远程仓库地址

然后将本地项目推送到远端

git push origin master
image.png

push到远程的时候出现这种问题,然后先pull ,出现下面问题(即拒绝合并不相关的历史,确实本地新加的内容还从未和线上连接过)



之后输入如下命令(即告诉允许合并不相关的历史内容):

git pull origin master --allow-unrelated-histories
image.png

解决冲突后上传到远程仓库


image.png

这样远程仓库就有我们本地的项目了


image.png

image.png
五、向私有的索引库(spec repo)远程库提交索引(podspec)。

首先需要给CZProject 打标签,打的标签值要与podspec文件中的版本号一致


image.png
image.png

然后进行.podspec文件本地和远程有效性的验证,终端命令如下:

pod spec lint CZProject.podspec
image.png

同样报了个警告,再次执行命令,忽略警告

pod spec lint CZProject.podspec --allow-warnings

注意:
如果私有库中依赖私有库,则验证podspec文件的时候需要加上–sources参数,否则会出现找不到你依赖的私有库,示例:

pod spec lint yourProjectName.podspec -- sources='git@xxx.xxx.xxx.xxx:/yourProjectName.git,https://github.com/CocoaPods/Specs 

向私有的索引库(spec Repo)远程仓库中提交podspec
使用命令把私有库添加到私有远程库中。

 pod repo push CZSpec CZProject.podspec --verbose --allow-warnings 
image.png

前往文件夹 ~/.cocoapods/repos去查看CZSpec目录下的文件如下:

image.png

之后,可以通过终端命令查看第三方框架仓库源,命令如下:

pod repo
image.png

到此,创建私有库成功了。

六、使用自己创建的私有库。

创建一个新的工程,在podfile 使用source 指定:


image.png

然后跳转到项目目录,执行终端命令pod install,之后就可以使用了。


image.png

image.png
七、版本更新。

找到工程库打开CZProject.xcworkspace

1.修改.podspec文件中的版本号
        s.version          = '0.1.1' //修改0.1.1版本,不能是之前的版本,要不提交不成功

2.项目上传到远程仓库

        $ git add . 

        $ git commit -m “XX”  

        $ git push

3.打tag并上传

        $ git tag '0.1.1'  

        $ git push --tags

 4.验证pod并提交到pod

         $ pod spec lint CZProject.podspec --allow-warnings    //远程本地pod验证

         $  pod repo push CZSpec CZProject.podspec --verbose --allow-warnings    //提交pod  CZSpec 是之前生成的本地库名 CZProject.podspec 工程索引文件

八、.podspec文件说明。
Pod::Spec.new do |s|
# 项目的名称
  s.name             = 'CZProject'
# 项目的版本号,通过项目git的tag标签进行对应,这里的标签代表的版本
  s.version          = '0.1.0'
# 项目简单的描述信息
  s.summary          = 'A short description of CZProject.'
# 项目的详细描述信息,注意,这里的文字的长度,一定要比上面的s.summary长,不然会认为格式不合格
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC
# 项目的网页主页信息,这里可以直接写自己的远程仓库的主页的地址
  s.homepage         = 'https://www.baidu.com'
# 截图
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 开源协议
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
# 作者信息
  s.author           = { 'chaozai' => '164125801@qq.com' }
# 项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
  s.source           = { :git => 'https://gitee.com/___/czproject', :tag => s.version.to_s }
# 多媒体介绍地址
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 支持的平台及版本
  s.ios.deployment_target = '9.0'
# 代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
  s.source_files = 'CZProject/Classes/**/*'
# 资源文件地址
  # s.resource_bundles = {
  #   'CZProject' => ['CZProject/Assets/*.png']
  # }
# 公开头文件地址
  # s.public_header_files = 'Pod/Classes/**/*.h'
# 所需的framework,多个用逗号隔开
  # s.frameworks = 'UIKit', 'MapKit'
# 依赖关系,该项目所依赖的其他,当在加载的时候也会一块把相关的依赖的库加载下来,如果有多个需要填写多个
  # s.dependency 'AFNetworking', '~> 2.3'
end

有关CocoaPods 远程私有库的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  4. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  5. ruby - 如何在 Ruby 中实现私有(private)内部类 - 2

    来自Java,我正在尝试在Ruby中实现LinkedList。我在Java中实现它的通常方法是有一个名为LinkedList的类和一个名为Node的私有(private)内部类,其中LinkedList的每个对象都作为Node对象。classLinkedListprivateclassNodeattr_accessor:val,:nextendend我不想将Node类暴露给外部世界。然而,通过Ruby中的这个设置,我可以使用这个访问LinkedList类之外的私有(private)Node类对象-node=LinkedList::Node.new我知道,在Ruby1.9中,我们可以使用

  6. ruby 私有(private)类方法助手 - 2

    您好,我正在尝试创建一个帮助程序,用于将ruby​​方法大量定义为私有(private)类方法。通常,可以通过使用private_class_method键工作将方法定义为私有(private)类方法。但我想创建一个以下样式的助手:classPersondefine_private_class_methodsdodefmethod_oneenddefmethod_twoendendend我计划通过以下方式动态定义它,但根本不起作用:classObjectdefself.define_private_class_methods&blockinstance_evaldoprivate&bl

  7. ruby - 使实例方法在运行时私有(private) - 2

    在另一个对象中注册该对象后,我需要将一些实例方法设为私有(private)。我不想卡住对象,因为它必须保持可编辑状态,只是功能较少。而且我不想取消定义这些方法,因为它们是在内部使用的。我需要的是这样的:classMyClassdefmy_methodputs"Hello"endenda=MyClass.newb=MyClass.newa.my_method#=>"Hello"a.private_instance_method(:my_method)a.my_method#=>NoMethodErrorb.my_method#=>"Hello"有什么想法吗?

  8. ruby - Ruby 导入的方法总是私有(private)的吗? - 2

    最好用一个例子来解释:文件1.rb:deffooputs123end文件2.rb:classArequire'file1'endA.new.foo将给出错误“':调用了私有(private)方法'foo'”。我可以通过执行A.new.send("foo")来解决这个问题,但是有没有办法公开导入的方法?编辑:澄清一下,我没有混淆include和require。另外,我不能使用正常包含的原因(正如许多人正确指出的那样)是因为这是元编程设置的一部分。我需要允许用户在运行时添加功能;例如,他可以说“run-this-app--includefile1.rb”,应用程序的行为将根据他在file1

  9. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  10. ruby - 带有 grep 远程日志文件的 tail - 2

    我有这段代码来跟踪远程日志文件:defdo_tail(session,file)session.open_channeldo|channel|channel.on_datado|ch,data|puts"[#{file}]->#{data}"endchannel.exec"tail-f#{file}"endNet::SSH.start("host","user",:password=>"passwd")do|session|do_tailsession,"/path_to_log/file.log"session.loop我只想在file.log中检索带有ERROR字符串的行,我正在尝

随机推荐