iOS组件化初探( 二 )

执行完成后 , 会在当前目录下创建一个以QRCodeReader命名的文件夹 , 并在文件夹内自动生成了QRCodeReader.podspec文件和若干模板文件 , 如下图所示:

iOS组件化初探

文章插图
 
其中QRCodeReader文件夹中存放的就是该组件的源码和资源文件 。Example文件夹下是该命令帮我们创建的一个示例工程 , Example工程默认已经集成了新创建的组件 , 我们可以直接在Example工程的基础上进行编码 。_Pods.xcodeproj文件是Example文件夹下的QRCodeReader.xcodeproj文件的替身 。
打开Example工程 , 先来看下Podfile文件:
use_frameworks!platform :ios, '10.0'target 'QRCodeReader_Example' dopod 'QRCodeReader', :path => '../'target 'QRCodeReader_Tests' doinherit! :search_pathsendend主要看pod 'QRCodeReader', :path => '../'这行代码 , 表示通过指定路径的方式集成QRCodeReader组件 。这里的QRCodeReader组件目录位于Podfile文件的前一级目录下 。
再来看QRCodeReader.podspec文件 , 内部已经自动填充了代码模版 , 关于每行代码的具体含义 , 我们后续再着重介绍 。
?
podspec其实是一个ruby语言的脚本文件 , 里面的文本内容也都是ruby代码 。这里不需要我们懂得ruby语言 , 只要能读懂其大体含义即可 。
## Be sure to run `pod lib lint QRCodeReader.podspec' to ensure this is a# valid spec before submitting.## Any lines starting with a # are optional, but their use is encouraged# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html#Pod::Spec.new do |s|s.name= 'QRCodeReader's.version= '0.1.0's.summary= 'A short description of QRCodeReader.'# This description is used to generate tags and improve search results.#* Think: What does it do? Why did you write it? What is the focus?#* Try to keep it short, snappy and to the point.#* Write the description between the DESC delimiters below.#* Finally, don't worry about the indent, CocoaPods strips it!s.description= <<-DESCTODO: Add long description of the pod here.DESCs.homepage= 'https://github.com/lanfudong/QRCodeReader'# s.screenshots= 'www.example.com/screenshots_1', 'www.example.com/screenshots_2's.license= { :type => 'MIT', :file => 'LICENSE' }s.author= { 'lanfudong' => 'lanfudong214839@sohu-inc.com' }s.source= { :git => 'https://github.com/lanfudong/QRCodeReader.git', :tag => s.version.to_s }# s.social_media_url = 'https://Twitter.com/<TWITTER_USERNAME>'s.ios.deployment_target = '10.0's.source_files = 'QRCodeReader/Classes/**/*'# s.resource_bundles = {#'QRCodeReader' => ['QRCodeReader/Assets/*.png']# }# s.public_header_files = 'Pod/Classes/**/*.h'# s.frameworks = 'UIKit', 'MapKit'# s.dependency 'A.NETworking', '~> 2.3'end2. pod spec create xxxxxxxx就是要创建的podspec文件名 , 这种方式比较适合对现有模块进行组件化改造 。执行此命令后 , 仅会在当前文件夹中创建一个xxxx.podspec文件 , 不会生成任何模版文件 。此处仍以QRCodeReader为例:
lanfudong@MacBook-Pro ~ % pod spec create QRCodeReaderSpecification created at QRCodeReader.podspec打开文件后可以看见里面同样也预填充了代码模板和注释 。
##Be sure to run `pod spec lint QRCodeReader.podspec' to ensure this is a#valid spec and to remove all comments including this before submitting the spec.##To learn more about Podspec attributes see https://guides.cocoapods.org/syntax/podspec.html#To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/#Pod::Spec.new do |spec|# ―――Spec Metadata―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###These will help people to find your library, and whilst it#can feel like a chore to fill in it's definitely to your advantage. The#summary should be tweet-length, and the description more in depth.#spec.name= "QRCodeReader"spec.version= "0.0.1"spec.summary= "A short description of QRCodeReader."# This description is used to generate tags and improve search results.#* Think: What does it do? Why did you write it? What is the focus?#* Try to keep it short, snappy and to the point.#* Write the description between the DESC delimiters below.#* Finally, don't worry about the indent, CocoaPods strips it!spec.description= <<-DESCDESCspec.homepage= "http://EXAMPLE/QRCodeReader"# spec.screenshots= "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"# ―――Spec License――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###Licensing your code is important. See https://choosealicense.com for more info.#CocoaPods will detect a license file if there is a named LICENSE*#Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'.#spec.license= "MIT (example)"# spec.license= { :type => "MIT", :file => "FILE_LICENSE" }# ――― Author Metadata――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###Specify the authors of the library, with email addresses. Email addresses#of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also#accepts just a name if you'd rather not provide an email address.##Specify a social_media_url where others can refer to, for example a twitter#profile URL.#spec.author= { "lanfudong" => "lanfudong214839@sohu-inc.com" }# Or just: spec.author= "lanfudong"# spec.authors= { "lanfudong" => "lanfudong214839@sohu-inc.com" }# spec.social_media_url= "https://twitter.com/lanfudong"# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###If this Pod runs only on iOS or OS X, then specify the platform and#the deployment target. You can optionally include the target after the platform.## spec.platform= :ios# spec.platform= :ios, "5.0"#When using multiple platforms# spec.ios.deployment_target = "5.0"# spec.osx.deployment_target = "10.7"# spec.watchos.deployment_target = "2.0"# spec.tvos.deployment_target = "9.0"# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###Specify the location from where the source should be retrieved.#Supports git, hg, bzr, svn and HTTP.#spec.source= { :git => "http://EXAMPLE/QRCodeReader.git", :tag => "#{spec.version}" }# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###CocoaPods is smart about how it includes source code. For source files#giving a folder will include any swift, h, m, mm, c & cpp files.#For header files it will include any header in the folder.#Not including the public_header_files will make all headers public.#spec.source_files= "Classes", "Classes/**/*.{h,m}"spec.exclude_files = "Classes/Exclude"# spec.public_header_files = "Classes/**/*.h"# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###A list of resources included with the Pod. These are copied into the#target bundle with a build phase script. Anything else will be cleaned.#You can preserve files from being cleaned, please don't preserve#non-essential files like tests, examples and documentation.## spec.resource= "icon.png"# spec.resources = "Resources/*.png"# spec.preserve_paths = "FilesToSave", "MoreFilesToSave"# ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###Link your library with frameworks, or libraries. Libraries do not include#the lib prefix of their name.## spec.framework= "SomeFramework"# spec.frameworks = "SomeFramework", "AnotherFramework"# spec.library= "iconv"# spec.libraries = "iconv", "xml2"# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ###If your library depends on compiler flags you can set them in the xcconfig hash#where they will only apply to your library. If you depend on other Podspecs#you can include multiple dependencies to ensure it works.# spec.requires_arc = true# spec.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }# spec.dependency "JSONKit", "~> 1.4"end


推荐阅读