草庐IT

Cocoapods搭建私有库

LUJQ 2023-10-12 原文

随着公司项目越来越多,不同项目间会有很多相同的功能代码。比如:网络获取、信息弹框、登陆等,将这些封装成模块module做成Cocoapods私有库或者Framework就很有必要了。这儿我想简单记录下Cocoapods私有库的搭建,如有错误 欢迎指正。
Framework 见我另一篇文章:ios Framework制作 (和踩过的坑)

搭建Cocoapods私有库

1、环境

Cocoapods环境,具体环境的配置过程其他文章有很多,就不说了。

2、搭建

私有库搭建组要有两部分:创建 repo 私有库的索引库 spec、创建私有库并发布到索引库。

<1>创建 repo 私有库的索引库 spec

在git上创建索引库 spec,我这儿用码云举例,方法和创建项目是一样的。


截屏2022-05-12 下午1.48.44.png

然后就有了索引库的地址:https://gitee.com/*******/test-module-specs.git

截屏2022-05-12 下午1.53.59.png

将索引库添加到本地仓库

// pod repo add specs库名 specs库地址
pod repo add TestModuleSpecs https://gitee.com/******/test-module-specs.git

查看是否添加成功

pod repo list

//可以看到已经添加成功
TestModuleSpecs
- Type: git (master)
- URL:  https://gitee.com/*********/test-module-specs.git
- Path: /Users/*******/.cocoapods/repos/TestModuleSpecs
<2>创建私有库并发布到索引库

第一步:先在git上创建私有库,还是以码云举例。


然后就有了私有库地址:
https://gitee.com/*************/test-module-one.git

第二步:创建私有库模板

//创建私有库模板
pod lib create TestModuleOne

//下面是私有库的简单配置
//选择平台
What platform do you want to use?? [ iOS / macOS ]
 > ios
//选择编程语言
What language do you want to use?? [ Swift / ObjC ]
 > objc
//选择是否创建测试demo
Would you like to include a demo application with your library? [ Yes / No ]
 > yes
//选择测试框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > none
//是否视图测试
Would you like to do view based testing? [ Yes / No ]
 > no
//类前缀
What is your class prefix?
 > LU

这就得到了库模板:


这就创建好了私有库模块了

编辑私有库索引 TestModuleOne.podspec

version             功能版本,建议和tag保持一致,版本从0.1.0开始。
summary             功能概要,需要填写更新,否则lint检测无法通过。
description         功能描述,可以选择性删除,否则lint检测无法通过。
homepage            资源首页,私有库对应的浏览器地址。
resource            资源地址,git克隆地址。建议使用http/https,git类型有权限控制。
source_file         类资源文件,默认Classes下的所有文件,放置私有库核心文件。
resources           Bundle资源文件(不推荐使用),会合并至MainBundle中,访问便利,但会存在命名冲突问题。个别SDK必须放在MainBundle中才能使用,比如微博SDK!!!。
resource_files      Bundle资源文件(推荐使用),单独的Bundle文件,不与MainBundle合并,使用内部资源时和MainBundle路径有区别!!!。
exclude_files       指定不被包含的文件、目录
vendored_libraries  内部包含的.a静态库 例如'ModuleName/Classes/Lib/*.{a}'
vendored_framework  内部包含的.framework静态库 例如'ModuleName/Classes/Framework/***.framework'
static_framework    指定pod加静态库标签 true/false

指定支持的架构,如果因为i386等架构问题lint检测不通过,可以在检测时添加 --skip-import-validation参数
s.xcconfig = {
  'VALID_ARCHS' => 'armv7 arm64e armv7s arm64 x86_64',
}

如果支持单文件目录下的文件引用,可以设置subspec
s.default_subspec = 'Core'
s.subspec 'Core' do |core|
    core.dependency 'MBProgressHUD'
    core.source_files  = "DYFoundationFramework/Classes/**/*.{h,m}"
end

s.subspec 'OldCommonTools' do |oct|
    oct.dependency 'SAMKeychain'
    oct.source_files  = "DY****Framework/Classes/Object-C/DY****Tools/**/*.{h,m}"
end
截屏2022-05-12 下午2.35.28.png

验证.podspec文件的格式是否正确

// 本地验证pod能否通过验证,如果失败使用下面命令: pod lib lint --verbose查看原因
pod lib lint
// 或者使用pod lib lint --allow-warnings忽略警告错误
pod lib lint --allow-warnings
// 当库中引用了其他三方库
pod lib lint --allow-warnings --use-libraries

将私有库代码提交到git

git remote add origin https://gitee.com/********/test-module-one.git
git add .
git commit -a -m "第一次提交 版本为0.1.0"
git pull origin master --allow-unrelated-histories
git push -f origin master
git tag 0.1.0
git push origin 0.1.0

podspec文件中的地址要和远程仓库保持一致
git push -f origin master,本地强制上传到远程,把远程的覆盖,这儿是第一次上传,所有就用本地代码覆盖掉远端代码了。
这儿就已经吧私有库代码提交到git上了

第三步:将私有库发布

//pod repo push 索引库名 私有库.podspec
pod repo push TestModuleSpecs TestModuleOne.podspec --allow-warnings
//检查一下是否成功
pod search TestModuleOne
-> TestModuleOne (0.1.0)
   A short description of TestModuleOne.
   pod 'TestModuleOne', '~> 0.1.0'
   - Homepage: https://gitee.com/********/test-module-one
   - Source:   https://gitee.com/******/test-module-one.git
   - Versions: 0.1.0 [TestModuleSpecs repo]

这就算是搭建完成了

补充

  • XIB和storeboard文件需要放到Assets文件下,并在podspec文件中设置路径.
s.resource_bundles = {
     'xxx' => ['xxx/Assets/*']
   }
  • 库中用到MRC文件,需要在podspec中设置
non_arc_files = 'xxx/Classes/Bluetooth/protobuf-v1/xxx.{h,m}'
  s.exclude_files = non_arc_files
  s.subspec 'no-arc' do |sp|
  sp.source_files = non_arc_files
  sp.requires_arc = false
  end
  • 在库中导入其他三方库头文件,需要用"#import <<#header#>>"方式,不然pod lib lint会失败。例如:
#import <Masonry/Masonry.h>

参考文章:
https://www.jianshu.com/p/87145101636a

有关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. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  10. ruby - 从私有(private)实例方法调用私有(private)类方法 - 2

    我是Ruby新手,来自C#世界。在C#中,这样做是合法的:publicclassTest{publicvoidMethod(){PrivateMethod();}privatevoidPrivateMethod(){PrivateStaticMethod();}privatestaticvoidPrivateStaticMethod(){}}是否可以在Ruby中做类似的事情?一些背景知识:我有一个Rails应用程序...其中一个模型有一个私有(private)方法来设置一些依赖项。有一个类方法可以创建模型的初始化实例。由于遗留原因,模型的某些实例未正确初始化。我添加了一个实例方法来初始

随机推荐