podspec创建

1.pod库创建

方式一 : pod spec create (pod库名称)
方式二: pod lib create (pod库名称) 带有示例工程

本地验证 pod lib lint 文件名.podspec
pod lib lint JCMaNongChenZaiTest.podspec --allow-warnings

联网验证 pod spec lint JCMaNongChenZaiTest.podspec

2.podspec文件基本操作

#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint jdfpassportlogin.podspec' to validate before publishing.
#
Pod::Spec.new do |s|

  # 库名
  s.name             = 'jdfpassportlogin'
  # 库版本号, 和下载使用版本对应
  s.version          = '0.0.1'
  # 简短介绍
  s.summary          = 'A new Flutter plugin.'
  # 详细介绍
  s.description      = <<-DESC
A new Flutter plugin.
                       DESC
  # 主页,这里要填写可以访问到的地址,不然验证不通过
  s.homepage         = 'http://example.com'
  # 截图
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2" 
  # 开源协议
  s.license          = { :file => '../LICENSE' }
  # 作者信息
  # s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'Your Company' => 'email@example.com' }
  # 项目地址,不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
  s.source           = { :path => '.' }
  # { :git => 'https://github/jdfpassportlogin.git',  :tag => s.version.to_s  } 
  # 支持的平台及版本
  s.platform = :ios, '9.0'

  # 添加模块名
  # spec.module_name = 'Three20'


  # 是否使用ARC,如果指定具体文件,则具体的文件使用ARC
  # s.requires_arc = true       

  # 代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
  # Classes/**/*.{h,m} 以 .h 和 .m 结尾的文件
  # Classes/**/*.h  以.h 结尾的文件
  # Classes/**/*.{h,m,storyboard}   
  s.source_files = 'Classes/**/*.{h,m}'

  # 图案: *
  # *将匹配所有文件
  # c*将匹配所有以开头的文件c
  # *c将匹配所有以c
  # *c*将匹配其中的所有文件c(包括开头或结尾)
  # 图案: **
  # 递归匹配目录。


  # 多个文件示例
  # s.source_files = #{root}/JZActionJumpModule-umbrella.h", "#{root}/Classes/**/*.{h,m}"

  # 导入头文件, 不建议
  # spec.prefix_header_contents = '#import <UIKit/UIKit.h>', '#import <Foundation/Foundation.h>'
  # 头文件引用, 不建议
  # spec.prefix_header_file = 'iphone/include/prefix.pch'
  # 公开头文件地, 也可以指定具体文件
  s.public_header_files = 'Classes/**/*.h', #'Classes/example/example.h'
  # 项目头文件
  # spec.project_header_files = 'Headers/Project/*.h'
  # 私有文件, 即不公开
  # spec.private_header_files = 'Headers/Private/*.h'


  # 排除文件
  # spec.exclude_files = 'Classes/**/unused.{h,m}'


  #  buildsetting相关设置, 这里bitcode设置为NO, C++ Standard Library设置为libstdc++
  # s.xcconfig = {
  #  'ENABLE_BITCODE' => 'NO',
  #  'CLANG_CXX_LIBRARY' => 'libstdc++'
  #  }
  
  # 该pod依赖的系统framework,多个用逗号隔开
  # s.frameworks = 'UIKit','CoreGraphics'
  # 弱引用的库
  # spec.weak_frameworks = 'Twitter', 'SafariServices'


  # 该pod依赖的系统library,多个用逗号隔开
  # s.libraries  = 'iconv','sqlite3','stdc++','z'

  # 第三方.a文件
  # s.vendored_libraries = 'login_sdk/*.a'

  # 第三方frameworks文件
  # s.vendored_frameworks = 'XXEncryptKit/Classes/ThirdParty/*.framework'

  # 依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
  # 依赖项可以指定版本要求。建议使用乐观版本指示器~>,因为它提供了对版本的良好控制,而不会太严格。
  # 例如, ~> 1.0.1相当于与>= 1.0.1结合< 1.1。同样, ~> 1.0将匹配1.0, 1.0.1, 1.1,但不会升级到2.0.
  # spec.dependency 'AFNetworking', '~> 1.0', :configurations => ['Debug']
  # spec.dependency 'AFNetworking', '~> 1.0', :configurations => :debug
  # spec.dependency 'AFNetworking', '~> 1.0'
  s.dependency 'Flutter'
  s.dependency 'JDLLogin'
  s.dependency 'YYKit'

  # 此处待验证, 配置可能添加到示例工程
  # spec.info_plist = {
  # 'CFBundleIdentifier' => 'com.myorg.MyLib',
  # 'MY_VAR' => 'SOME_VALUE'
  #  }

  # 应该传递给编译器的标志列表。
  # spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'

  # 添加到最终私有pod 目标 xcconfig 文件的任何标志。
  # spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }

  
  # 是否允许使用静态库
  s.static_framework = true
  
  # 使用subspec来实现目录分层。
  s.subspec 'IdassSKD' do |ss|
    ss.source_files = 'login_sdk/**/*.{h,m}'
    ss.vendored_library  = 'login_sdk/libJDMobileLoginSDK.a'
    # 资源文件地址
    ss.resources = 'login_sdk/JDMobileLoginSDK.bundle'
    end
  
  s.subspec 'LegoasSDK' do |ss|
      ss.vendored_frameworks =  "legolas_sdk/*.framework"
      ss.resources = 'legolas_sdk/JDJR_Legolas.bundle'
      ss.frameworks = 'Security','WebKit'
    end

  # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
end


3.加载xcassets图片

  1. 这种方式把resources资源合并主项目的xcassets中
  2. 加载图片依然使用[UIImage imageNamed:@"test"]
  3. podfie 需要添加install! 'cocoapods',
    :disable_input_output_paths => true
  4. 使用它use_frameworks

示例

  s.resources = "Assets/*.xcassets"
WeChat24e22997b6594bd34f195b848f6d59dd.png

3.framework脚本

    # Sets the target folders and the final framework product.
    FRAMEWORK_NAME=LibraryName
    
    FRAMEWORK_VERSION=1.0
    
    FRAMEWORK_CONFIG=Release
    
    # Install dir will be the final output to the framework.
    
    # The following line create it in the root folder of the current project.
    
    INSTALL_PATH=${PROJECT_DIR}/Products/
    
    INSTALL_DIR=${INSTALL_PATH}/${FRAMEWORK_NAME}.framework
    
    # Working dir will be deleted after the framework creation.
    
    WORK_DIR=build
    
    DEVICE_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphoneos/${FRAMEWORK_NAME}.framework
    
    SIMULATOR_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphonesimulator/${FRAMEWORK_NAME}.framework
    
    xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphoneos
    
    echo "Build simulator"
    
    xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphonesimulator
    
    # Creates install directory if it not exits.
    
    if [ ! -d "${INSTALL_DIR}" ]
    
    then
    
    mkdir -p "${INSTALL_DIR}"
    
    fi
    
    # Creates headers directory if it not exits.
    
    if [ ! -d "${INSTALL_DIR}/Headers" ]
    
    then
    
    mkdir -p "${INSTALL_DIR}/Headers"
    
    fi
    
    # Remove all files in the headers diectory.
    
    for file in `ls "${INSTALL_DIR}/Headers"`
    
    do
    
    rm "${INSTALL_DIR}/Headers/${file}"
    
    done
    
    # Remove binary library file.
    
    rm -f ${INSTALL_DIR}/${FRAMEWORK_NAME}
    
    # Copies the headers files to the final product folder.
    
    if [ -d "${DEVICE_DIR}/Headers" ]
    
    then
    
    for file in `ls "${DEVICE_DIR}/Headers"`
    
    do
    
    cp "${DEVICE_DIR}/Headers/${file}" "${INSTALL_DIR}/Headers/${file}"
    
    done
    
    fi
    
    # copy nibs to bundle,then copy bundle to final folder
    
    BUNDLE_DIR=${DEVICE_DIR}/${FRAMEWORK_NAME}.bundle
    
    if [ -d "${BUNDLE_DIR}" ];then
    
    if ls ${DEVICE_DIR}/*.nib >/dev/null 2>&1;then
    
    rm -rf ${BUNDLE_DIR}/*.nib
    
    cp -rf ${DEVICE_DIR}/*.nib ${BUNDLE_DIR}
    
    fi
    
    rm -rf "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
    
    cp -R "${BUNDLE_DIR}" "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
    
    fi
    
    echo "Merge with simulator"
    
    # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
    
    lipo -create "${DEVICE_DIR}/${FRAMEWORK_NAME}" "${SIMULATOR_DIR}/${FRAMEWORK_NAME}" -output "${INSTALL_DIR}/${FRAMEWORK_NAME}"
    
    open "${INSTALL_PATH}"
    
    # rm -r "${WORK_DIR}"

4. static_framework应用

s.static_framework = true

1.用cocoapods 导入swift框架到swift项目和OC项目都必须要在 Podfile文件 use_frameworks!
2.使用use_frameworks!, cocoapods, 会生成相应的, .frameworks,文件(动态链接库:实际内容为 Header + 动态链接库 + 资源文件)
此时如果podspec 中又必须引入.a文件, 可以使用此命令解决
否则pod install 报错

[!] The 'Pods-***_Example' target has transitive dependencies that include statically linked binaries: 
(/***/***/Example/Pods/DouyinOpenSDK/DouyinOpenSDK/libDouyinOpenSDK.a)

静态库:(静态链接库)(.a)在编译时会将库copy一份到目标程序中,编译完成之后,目标程序不依赖外部的库,也可以运行
缺点: 会使应用程序变大

动态库:(.dylib)编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载,不会使应用体积变大,但是运行时加载会损耗部分性能,并且依赖外部的环境,如果库不存在或者版本不正确则无法运行

Framework:实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

5.podspec网站

To learn more about a Podspec

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容