CocoaPods


Ruby 安装

要安装cocospods 首先需要安装ruby,可以先安装xcode,再安装macport ,最后执行命令

port install ruby

安装CocoaPods

CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境。OS X系统默认的已经可以运行Ruby了,因此我们只需要执行以下命令:

$ sudo gem install cocoapods

如果是要安装指定Pod版本

$ sudo gem install cocoapods -v 1.0.1

CocoaPods是以Ruby gem包的形式被安装的。在安装执行的过程中,可能会问我们是不是更新rake,输入y即可。这是因为rake gem包会在安装的过程中检查更细,如果有可用的新版本就会出现刚才的选项。

在安装进程结束的时候,执行命令:

$ pod setup

如果没有报错,就说明一切安装就成功了。

安装过程中可能遇到的问题

  1. 执行完install命令半天没反应

这有可能是因为Ruby的默认源使用的是cocoapods.org,国内访问这个网址有时候会有问题,网上的一种解决方案是将远替换成淘宝的,替换方式如下:

$ gem sources --remove https://rubygems.org/

$ gem sources -a https://ruby.taobao.org/

要想验证是否替换成功了,可以执行:

$ gem sources -l

正常的输出是:
http://ruby.taobao.org/

  1. gem版本过老

gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级gem,执行下述命令即可:

$ sudo gem update --system

  1. 安装完成后,执行pod setup命令时报错:

     /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:298:in to_specs': Could not find 'cocoapods' (>= 0) among 6 total gem(s) (Gem::LoadError)
     from /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:309:in to_spec'
     from /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_gem.rb:53:in gem'
     from /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/bin/pod:22:in '
    

这就是路径设置的问题,可以通过执行下面命令解决该问题

$ rvm use ruby-1.9.3-p448

升级CocoaPods

升级很简单,再次执行安装命令即可:

$ sudo gem install cocoapods

需要注意的是,如果安装的时候使用了sudo,升级的时候一样需要使用该关键字,不然升级完了以后又会出现路径不匹配问题。

  • 如果出现了下面的错误:
$ sudo gem install cocoapodsERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj

原因是/usr/bin/xcodeproj目录路径错了

$ ls -al /usr/bin/xcodeprojls: cannot access /usr/bin/xcodeproj: No such file or directory

使用sudo gem install -n /usr/local/bin cocoapods --pre命令顺利安装成功

$ sudo gem install -n /usr/local/bin cocoapods --pre
Successfully installed xcodeproj-1.0.0Fetching: molinillo-0.4.5.gem (100%)
Successfully installed molinillo-0.4.5Fetching: cocoapods-try-1.0.0.gem (100%)
Successfully installed cocoapods-try-1.0.0```

###使用CocoaPods

- **创建Podfile**

  首先进入到工程的根目录下,创建空白的Podfile文件。

  *PS:Podfile文件也可以不放在工程的根目录下,只是会稍微麻烦点*

- **编辑Podfile**

  根据需要,我们可以在Podfile文件中写入需要用到的第三方库,以SBJson、AFNetworking、Reachability三个库为例,我的Podfile内容如下:

        platform :ios

        pod 'Reachability',  '~> 3.0.0'

        pod 'SBJson', '~> 4.0.0'

        platform :ios, '7.0'

        pod 'AFNetworking', '~> 2.0'

- **执行导入命令**

  准备工作都完成后,开始导入第三方库:

  > $ pod install

  首先进入工程根目录,然后执行pod install命令,CocoaPods就开始为我们做下载源码、配置依赖关系、引入需要的framework等一些列工作,命令的执行结果打印出来如下:

        Analyzing dependencies

        Downloading dependencies

        Installing AFNetworking (2.1.0)

        Installing JSONKit (1.5pre)

        Installing Reachability (3.0.0)

        Generating Pods project

        Integrating client project

        [!] From now on use `CocoaPodsTest.xcworkspace`.

  这就说明pod install命令执行成功了。再来看看工程根目录发生的变化,可以看到,工程的根目录下多了三个东西:CocoaPodsTest.xcworkspace、Podfile.lock文件和Pods目录。

  再看看刚才执行完pod install命令打印出来的内容的最后一行:

        [!] From now on use `CocoaPodsTest.xcworkspace`.

  提示我们从现在起,我们需要使用CocoaPodsTest.xcworkspace文件来开发。

  *对于工程发生的变化,有几点需要说明:*

  1. 第三方库会被编译成静态库供我们正真的工程使用
  2. CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程就放在刚才新生成的Pods目录下。整个第三方库工程会生成一个名称为libPods.a的静态库提供给我们自己的CocoaPodsTest工程使用。
  3. 我们的工程和第三方库所在的工程会由一个新生成的workspace管理。为了方便我们直观的管理工程和第三方库,CocoaPodsTest工程和Pods工程会被以workspace的形式组织和管理,也就是我们刚才看到的CocoaPodsTest.xcworkspace文件。原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错,只能使用新生成的workspace来进行项目管理。


- **Podfile.lock文件**

  在开始使用CocoaPods,执行完pod install之后,会生成一个Podfile.lock文件。这个文件看起来跟我们关系不大,实际上绝对不应该忽略它。

  该文件用于保存已经安装的Pods依赖库的版本,通过CocoaPods安装了SBJson、AFNetworking、Reachability三个Pods依赖库以后对应的Podfile.lock文件内容为:

        PODS:

        - AFNetworking (2.1.0):

        - AFNetworking/NSURLConnection

        - AFNetworking/NSURLSession

        - Reachability (3.0.0)

        - SBJson (4.0.0)

        DEPENDENCIES:

        - AFNetworking (~> 2.0)

        - Reachability (~> 3.0.0)

        - SBJson (~> 4.0.0)

        SPEC CHECKSUMS:

        AFNetworking: c7d7901a83f631414c7eda1737261f696101a5cd

        Reachability: 500bd76bf6cd8ff2c6fb715fc5f44ef6e4c024f2

        SBJson: f3c686806e8e36ab89e020189ac582ba26ec4220

        COCOAPODS: 0.29.0

  Podfile.lock文件最大的用处在于多人开发。对于没有在Podfile中指定Pods依赖库版本的写法,如下:

        pod 'SBJson'

  该句话用于获取当前SBJson这个Pods依赖库的最新版本。

  当团队中的某个人执行完pod install命令后,生成的Podfile.lock文件就记录下了当时最新Pods依赖库的版本,这时团队中的其它人check下来这份包含Podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的Pods依赖库的版本就和最开始用户获取到的版本一致。如果没有Podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的SBJson,这就有可能造成同一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难!

  在这种情况下,如果团队想使用当前最新版本的SBJson依赖库,有两种方案:

  1. 更改Podfile,使其指向最新版本的SBJson依赖库
  2. 执行pod update命令

  鉴于Podfile.lock文件对团队协作如此重要,我们需要将它添加到版本管理中。

- **Podfile文件**

    通常情况下我们都推荐Podfile文件都放在工程根目录,事实上Podfile文件可以放在任意一个目录下,需要做的是在Podfile中指定工程的路径,和原来相比,Podfile文件就在最开始的位置增加了一行,具体内容如下:

        xcodeproj "/Users/wangzz/Desktop/CocoaPodsTest/CocoaPodsTest.xcodeproj"

        platform :ios

        pod 'Reachability',  '~> 3.0.0'

        pod 'SBJson', '~> 4.0.0'

        platform :ios, '7.0'

        pod 'AFNetworking', '~> 2.0'

        //使用具体的代码分支
        pod 'EZSwiftExtensions', :git => 'https://github.com/goktugyil/EZSwiftExtensions.git', :branch => 'Swift2.3' 

  指定路径使用的是xcodeproj关键字。

- **Podfile和target**

  Podfile本质上是用来描述Xcode工程中的targets用的。如果我们不显式指定Podfile对应的target,CocoaPods会创建一个名称为default的隐式target,会和我们工程中的第一个target相对应。换句话说,如果在Podfile中没有指定target,那么只有工程里的第一个target能够使用Podfile中描述的Pods依赖库。

  如果想在一个Podfile中同时描述project中的多个target,根据需求的不同,可以有不同的实现方式。为了说明问题,在原来的工程中再创建一个名称为Second的target,现在的project中包含的target有

  1. 多个target中使用相同的Pods依赖库

    比如,名称为CocoaPodsTest的target和Second的target都需要使用Reachability、SBJson、AFNetworking三个Pods依赖库,可以使用link_with关键字来实现,将Podfile写成如下方式:

          link_with 'CocoaPodsTest', 'Second'

          platform :ios

          pod 'Reachability',  '~> 3.0.0'

          pod 'SBJson', '~> 4.0.0'

          platform :ios, '7.0'

          pod 'AFNetworking', '~> 2.0'

    这种写法就实现了CocoaPodsTest和Second两个target共用相同的Pods依赖库。

  2. 不同的target使用完全不同的Pods依赖库

    CocoaPodsTest这个target使用的是Reachability、SBJson、AFNetworking三个依赖库,但Second这个target只需要使用OpenUDID这一个依赖库,这时可以使用target关键字,Podfile的描述方式如下:

          target :'CocoaPodsTest' do

          platform :ios

          pod 'Reachability',  '~> 3.0.0'

          pod 'SBJson', '~> 4.0.0'

          platform :ios, '7.0'

          pod 'AFNetworking', '~> 2.0'

          end

          target :'Second' do

          pod 'OpenUDID', '~> 1.0.0'

          end

    其中,do/end作为开始和结束标识符。

- **使用Podfile管理Pods依赖库版本**

  再引入依赖库时,需要显示或隐式注明引用的依赖库版本,具体写法和表示含义如下:

        pod 'AFNetworking'      //不显式指定依赖库版本,表示每次都获取最新版本

        pod 'AFNetworking', '2.0'    //只使用2.0版本

        pod 'AFNetworking', '> 2.0'    //使用高于2.0的版本

        pod 'AFNetworking', '>= 2.0'    //使用大于或等于2.0的版本

        pod 'AFNetworking', '< 2.0'    //使用小于2.0的版本

        pod 'AFNetworking', '<= 2.0'    //使用小于或等于2.0的版本

        pod 'AFNetworking', '~> 0.1.2'    //使用大于等于0.1.2但小于0.2的版本

        pod 'AFNetworking', '~>0.1'    //使用大于等于0.1但小于1.0的版本

        pod 'AFNetworking', '~>0'    //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本


- **CocoaPods常用命令**

  - pod install
    根据Podfile文件指定的内容,安装依赖库,如果有Podfile.lock文件而且对应的Podfile文件未被修改,则会根据Podfile.lock文件指定的版本安装。
    每次更新了Podfile文件时,都需要重新执行该命令,以便重新安装Pods依赖库。

  - pod update
    若果Podfile中指定的依赖库版本不是写死的,当对应的依赖库有了更新,无论有没有Podfile.lock文件都会去获取Podfile文件描述的允许获取到的最新依赖库版本。

  - pod search
    有了这条命令,就可以方便、迅速地找到需要的Pods依赖库,命令格式为:
    > $ pod search OpenUDID

    后面的OpenUDID为参数。

    > $ pod 'OpenUDID', '~> 1.0.0'

  - pod setup

    命令格式为:

    > $ pod setup

    这条命令用于跟新本地电脑上的保存的Pods依赖库tree。由于每天有很多人会创建或者更新Pods依赖库,这条命令执行的时候会相当慢,还请耐心等待。我们需要经常执行这条命令,否则有新的Pods依赖库的时候执行pod search命令是搜不出来的。

###使用Cocoapods创建私有podspec

1. 创建.podspec
首先在你的项目中使用如下命令创建名为 LPPushService 的 LPPushService.podspec
> $ pod spec create LPPushService

2. 编辑.podspec
创建好的 .podspec 包含大量的注释说明了每个参数的含义及用法。如果想详细了解可以仔细阅读。这里只介绍几个常用的。
        Pod::Spec.new do |s| 
        s.name = "LPPushService" 
        s.version = "1.0.0" 
        s.summary = "integrate APNs rapidly" 
        s.homepage = "https://github.com/xiaofei86/LPPushService" s.license = { :type => "MIT", :file => "LICENSE" }
        s.author = { "XuYafei" => "xuyafei86@163.com" }
        s.social_media_url = "http://xuyafei.cn" 
        s.platform = :ios, "7.0" 
        s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => s.version } 
        s.source_files = "LPPushService/**/*.{h,m}"
        s.resources = "LPPushService/Images/*.png" 
        s.dependency "BPushSDK", "1.4.1" 
        s.requires_arc = trueend
        
  s.name:名称,pod search 搜索的关键词
  s.version:版本
  s.summary:简介,pod search 搜索的关键词
  s.homepage:主页地址,例如Github地址
  s.license:许可证
  s.author:作者
  s.social_media_url:社交网址
  s.platform:平台
  s.source:Git仓库地址,例如在Github地址后边加上 .git 就是Git仓库地址
  s.source_files:需要包含的源文件
  s.resources:需要包含的图片等资源文件
  s.dependency:依赖库,不能依赖未发布的库
  s.requires_arc:是否要求ARC
        
  **s.source_files 常见写法**
        "Directory1/*"
        "Directory1/Directory2/*.{h,m}"
        "Directory1/**/*.h"

    - “*” 表示匹配所有文件
    - “*.{h,m}” 表示匹配所有以.h和.m结尾的文件
    - “**” 表示匹配所有子目录

  **s.source 常见写法**
        s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :commit => "68defea" }
        s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => 1.0.0 }
        s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => s.version }

    - commit => "68defea" 表示将这个Pod版本与Git仓库中某个commit绑定
    - tag => 1.0.0 表示将这个Pod版本与Git仓库中某个版本的comit绑定
    - tag => s.version 表示将这个Pod版本与Git仓库中相同版本的comit绑定

  按照上述规则编辑完成就制作好了 .podspec

3. 上传到Git
  将包含配置好的 .podspec 的项目提交 Git,并给这次提交打上 tag,这时就可以在其他项目中使用 CocoaPods 引入你配置好的 Pod 了。
        pod 'LPPushService', :git => 'https://github.com/xiaofei86/LPPushService.git', :tag => '1.0.0'

  当然,在给其他项目使用前最好先验证.podspec的有效性。
  - **验证.podspec**
    > $ pod spec lint LPPushService.podspec

    验证过程中:
          -> LPPushService
    验证成功后:
          LPPushService.podspec passed validation.
    验证失败后:
          [!] The spec did not pass validation, due to 1 error.

    验证 .podspec 会先测试本地 .podspec 文件是否存在语法错误。测试成功再根据 .podspec 文件找到远端仓库对应的版本克隆到本地并进行配置。最后测试文件是否能够编译成功。

  - **.podspec验证失败错误排查**
    - 语法错误
  如果是因为语法错误,验证失败后会给出错误的准确定位
            [!] Invalid `LPPushService.podspec` file: no .<digit> floating literal anymore; put 0 before dot s.version = “1.0.0” ^LPPushService.podspec:5: syntax error, unexpected tFLOAT, expecting '(' s.version = “1.0.0” ^

      标记“^”的地方即为有语法错误的地方。
      上述错误是因为使用“文本编辑”进行编辑造成的。使用文本编辑有时候英文""引号会自动变成中文“”引号。
            [!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.

      使用 vim 将其改为英文的""引号即可。
    - 依赖错误
      但是,有些非语法错误是不会给出错误原因的。这个时候可以使用“--verbose”来查看详细的验证过程来帮助定位错误。
            pod spec lint LPPushService.podspec --verbose

      如下错误通过 --verbose 就可以找到原因。
            -> LPPushService (1.0.0) - ERROR | [iOS] Encountered an unknown error (The 'Pods' target has transitive dependencies that include static binaries: (/private/var/folders/jz/b_m3k7ln47524cm__h3__mk00000gn/T/CocoaPods/Lint/Pods/BPushSDK/LibBPush/libBPush.a)) during validation.

      这个错误是因为依赖库(s.dependency)包含了.a静态库造成的。虽然这并不影响Pod的使用,但是验证是无法通过的。可以通过 --use-libraries 来让验证通过。
            pod spec lint LPPushService.podspec --verbose --use-libraries

      这种情况下使用 --use-libraries 虽然不会出现错误(error),但是有时候会带来一些警告(waring),警告同样是无法通过验证的。这时可以用 --allow-warnings 来允许警告。
            pod spec lint LPPushService.podspec --verbose --use-libraries --allow-warnings

    - 安装错误
      如果在其他项目 pod install 的过程中,出现包含“undefined method `end_with?' for nil”字样的报错。进入“~/.cocoapods/repos”目录,删除“master”,并将 master-1 改为 master 即可。
如果出现如下错误,而你的验证可以通过,那么一般更新下版本号就可以解决。
            [!] Unable to find a specification for 'LPPushService'.

    - 再次验证
      如果错误发生在 .podspec 中。当修改完时,不需要再次提交就可以直接验证。如果错误发生在代码中,则需要再次提交才能验证。

4. 发布到CocoaPods
你可以用 .podspec 文件来方便的管理内部代码,当然,也可以发布自己的 Pod 供其他开发者使用。
CocoaPods 0.33中加入了 Trunk 服务,使用 Trunk 服务可以方便的发布自己的Pod。虽然一开始使用 GitHub Pull Requests 来整理所有公共 pods 效果很好。但是,随着 Pod 数量的增加,这个工作对于 spec 维护人员 Keith Smiley 来说变得十分繁杂。甚至一些没有通过 $ pod lint 的 spec 也被提交上来,造成 repo 无法 build。CocoaPods Trunk 服务的引入,解决了很多类似的问题。每次使用 Trunk 服务发布 Pod 时都会通过 $ pod lint 验证 .podspec 是否有效。要想使用 Trunk 服务,首先需要使用如下命令注册自己的电脑。这很简单,只要你指明你的邮箱地址(spec文件中的)和名称即可。CocoaPods 会给你填写的邮箱发送验证邮件,点击邮件中的链接就可通过验证。
        pod trunk register xuyafei86@163.com "XuYafei"

  然后就可以发布你的 Pod 了。
        pod trunk push LPPushService.podspec

  发布时会验证 Pod 的有效性,如果你在手动验证 Pod 时使用了 --use-libraries 或 --allow-warnings 等修饰符,那么发布的时候也应该使用相同的字段修饰,否则出现相同的报错。
        pod trunk push LPPushService.podspec --use-libraries --allow-warnings

  发布成功后,就可以使用 pod search 搜索到你的 Pod 了!
        -> LPPushService (1.0.0) 
        integrate APNs rapidly 
        pod 'LPPushService', '~> 1.0.0' 
        - Homepage: https://github.com/xiaofei86/LPPushService 
        - Source: https://github.com/xiaofei86/LPPushService.git 
        - Versions: 1.0.0 [master repo]

  由于 pod search 是搜索的本地“~/.cocoapods”,所以在其他设备上可能无法搜到。这时只需要执行 pod install 更新下 pod 仓库即可(不要加 --no-repo-update)。

5. 版本升级
  当需要更新 Pod 版本的时候,修改 .podspec 中的 s.version 为更高的版本号,并修改 s.source 中对应的 Git 版本。提交到Git,并打上对应tag。然后再次执行
        pod trunk push LPPushService.podspec

  将新的 .podspec 发布到 CocoaPods。更新完成!
  为了更新更加方便,版本控制更加清晰,s.source 建议采用如下写法:
        s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => s.version }

  这样写将 Git 的版本与 CocoaPods 的版本进行了绑定。每次提交后再给本次提交打上 tag 就完成了更新。而且在 Git 中就可以清晰的看到哪次提交对应的哪个 CocoaPods 版本。如果与 commit 绑定,则要通过两次提交才能完成更新,第一次先提交修改代码,第二次将上一次 commit id 更新到 s.source 然后再次提交。如果直接与固定 tag 绑定,则每次还都要修改 s.source。如果你的 Pod 是私有库,那么 s.source 其实是无用的。因为在 Podfile 中已经指明了地址和版本(如下)。这时 s.source 可以随便填写,但最好还是按照上述规则以便以后发布。
        pod 'LPPushService', :git => 'https://github.com/xiaofei86/LPPushService.git', :tag => 1.0.0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 20,535评论 0 39
  • CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPo...
    朝洋阅读 25,480评论 3 51
  • Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自...
    Nash33阅读 2,054评论 0 50
  • 一. CocoaPods的介绍 什么是CocoaPods?CocoaPods是一个负责管理iOS项目中第三方开源库...
    辉712阅读 3,874评论 0 7
  • 世界之大,无奇不有,不光在我们生活中会遇见形形色色的人,在职场中偶尔也能遇见让你抓狂的“奇葩同事”。 谈起小新,公...
    人才加阅读 233评论 0 0