敏捷开发流程实践

RaoJunBO890605
RaoJunbo

按期交付率

  • 第一天
    • 上午
      1. 需求宣讲--》(产品)
      2. 需求反讲--》(开发)任务计划
  • 第二天
    • 下午
    • 晚上

需求池

需求是一个闭环

需求前期负责人沟通

基础微服务架构组

  1. 需求宣讲--》(产品主讲)
    产品:讲需求
    开发:提出疑问,领取任务
    测试:提出疑问

    宣讲后
    产品修改更新遗留问题
    开发理解需求准备反讲
    测试开始出测试用例

  2. 需求反讲--》(开发主讲)
    主要任务:按小时评估开发任务
    API,APP,BOSS,知道自己怎么实现
    生成时间评估表(看板),保证前后端是协同的

  3. 开发中
    开发第一天:测试用例的评审
    每日站会:核对任务时间表
    产品验收:是否满足需求

  4. 复盘
    优点
    问题
    建议

2019/3/1 posted in  iOS工具深入

利用Cocoapods构建自己的私有与公有库

一:Spec文件

在我们第一次安装pods时,都会主动的去拉取公有的repo,其实无论是共有的还是私有的下载后都在用户的/Users/用户名/.cocoapods/repos 目录下。每一个第三库都有一个spec文件,或者你自己的私有库也应该有这个spec文件。这些spec文件就在相应的repo里。
我将我自己创建一个私有库的spec文件贴出来

#
# Be sure to run `pod lib lint KBRCategory.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 http://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'KBRCategory'
  s.version          = '0.1.2'
  s.summary          = 'KBRCategory.'

# 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      = "a description KBRCategory"

  s.homepage         = 'https://gitee.com/BlueLegend'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'raojb@knowbox.cn' => 'raojb@knowbox.cn' }
  s.source           = { :git => 'https://gitee.com/BlueLegend/KBRCategory.git', :tag => s.version.to_s }
  #这里改成了不以tag版本来拉取,以最新的commit
    # s.source           = { :git => 'https://gitee.com/BlueLegend/KBRCategory.git'}
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.source_files = 'KBRCategory/Classes/**/*'
  
  # s.resource_bundles = {
  #   'KBRCategory' => ['KBRCategory/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  s.dependency 'AFNetworking'
end

里面无非就是你要提交到Cocoapods上的名字、版本号,简介、主页、License、作者信息、最低平台信息、从哪个Git上下载、需要引入的framework、那些文件需要被引入,那些文件是资源文件以及是否需要ARC的模式。

  • license
    用MIT就可以了,一定要正确填写不然在验证的时候验证通过

  • source
    是库的地址

  • s.source_files
    是要将哪些文件放入进去

  • s.subspec 添加子模块
    其实可以添加子模块,所谓的子模块,就是在pods出来后有子文件夹

s.subspec 'Security' do |ss|  
  ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}'
  ss.public_header_files = 'AFNetworking/AFSecurityPolicy.h'
  ss.frameworks = 'Security'
end  

二:创建公有库

  • 向Cocoapods方面注册一个账号 这个命令会收到一份邮件,让你进行会话授权。具体机制没有研究过,当你切换电脑时,需要重新进行会话授权 pod trunk register raojb@knowbox.cn 'rjb' --description='My own computer'
  • 创建spec文件
    pod spec create 'KBCategory'
    在写好代码后,在你项目的根目录下运行,会在该项目目录下生成一个spec文件。修改这个spec文件的里的相关信息。
    如果是项目已经建立好了,需要创建时,可以在根目录下执行
    pod spec create 'KBCategory'也会生成一个spec文件

  • 验证Podspec文件
    pod lib lint Name.podspec
    这一步是最坑人的地方。会有各种让你通不过的理由。比如,找不到文件,找不到Lience等。
    我遇到了,spec文件与s.source_files文件路径设置的不一致问题。
    开源协议文件也要生成。路径也要设置正确。

        - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code.
    

    遇到这样的错误,是编译没有通过的情况。如果自己在工程里编译通过,看是不是依赖库没有设置正确。别忘了依赖系统库也要填写。总之基本没有一次性验证通过的,具体问题具体查吧。

    例如
    s.framework = "UIKit"
    最终你出现passed validation就表示验证通过。验证通过表示,你给定的环境,单独编译这部分你提供的目录下的代码能自行编译通过。

  • 上传
    可上传项目到Cocoapods官方的仓库里。
    pod trunk push 项目名.podspec

    上传成功后,可以在命令行里pod search "库名字",若果没有应该是有缓存,删除这个文件
    ~/Library/Caches/CocoaPods/search_index.json
    重新pod search就可以了。

三:创建私有库

其实创建私有库的核心过程还是跟公有库是差不多的。不管是私有库还是公有库,关注点都在于Podspec文件的书写。其实我们讲到pod trunk push 项目名.podspec这条命令,其实是默认我们的Podspec文件提交到Cocoapod的仓库(Specs),然后我们之后的pod install或者pod update都是从这个仓库中提取Podspec文件,然后根据文件里面的信息去取对应的源代码。大家可以上去找找自己的开源的Podespec文件转换成json的文件

  • 建立自己的私有仓库
    pod repo add '仓库名' '仓库地址'建立好后,可以在你的cd ~/.cocoapods/repos目录下查看,是否有你的私有仓库。

  • 写代码->写Podspec文件了->检查项目和Podspec文件->打tag
    这些工作与创建公有库一样

  • 提交podspec文件到仓库
    公有库是pod trunk push 项目名.podspec
    私有库是pod repo push '私有仓库名' 项目名.podspec
    其实就都是讲podspec文件提交到相应的仓库里

特别说明

四:使用私有库

使用公有库与使用私有库的方式一样。都是在podfile文件里有一个source。这个source就是标识所要使用的源(spec文件仓库)。

#公用的私有远程索引库源
source  'git@gitee.com:BlueLegend/BlueLegendPrivateSpec.git'
#github远程索引库源
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target ‘testdown’ do
    #pod 'lottie-ios'
    pod 'Masonry'
    pod 'SDWebImage', '~> 4.3.0'
    pod 'YYModel', '~> 1.0.4'
    pod 'MJRefresh', '~> 3.1.15.3'
    pod 'KBRCategory'
end
2018/9/5 posted in  iOS工具深入

Cocoapods入门

一:安装

  1. 安装cocoapods

    sudo gem install cocoapods

  1. 安装指定版本的cocoapods
    在协同开发时,podfile文件会加入Git版本库,为了防止pod版本不一样,导致其他开发人员Pod时执行错误,所以协同开发时最好安装一样的版本号。

    sudo gem install cocoapods -v 1.4

二:初次使用

  1. 更新cocoapods的repo
    如果是新电脑或者没有下载过repo执行pod repo update。这个耗时会很长,这个文件现在达到2G了。改repo下载完后在/Users/用户目录/.cocoapods(这个文件夹的作用将在后面说明)

  2. 生成podfile文件
    在指定的xcode工程目录下执行pod init就会有一个Podfile文件生成,或者干脆从其他工程里拷贝一份过来也行。
    编辑如

    platform:ios,'7.1'
    pod 'SDWebImage', '~>3.7'
    pod 'AFNetworking' 
    
  3. 查找相关库
    有时为了查看要使用一个第三方库的指定版本号,pod search AFNetworking进行类似的查询,将会列出历史版本。

  4. pod install 与pod update

    • pod install
      在podfile.lock不存在时,会根据podfile文件生成这个文件,并安装相应的库。存在时会根据podfile.lock文件下载与安装相应的库。

    • pod update
      会根据podfile文件更新库,并更新podfile.lock文件。也就是pod update时,会检测podfile文件里有的库配置是没有指定版本号的就会取最新的版本号,重新下载与安装。

    • --no-repo-update
      其主要的作用是用于在执行pod install和pod update两条命令是而执行的pod repo update的操作。pod repo update操作时间比较长,这也就是为什么平时我们加--no-repo-update的原因

三:podfile文件深入

  1. pod '框架名' 参数
    参数需要特别说明下

    • 指定版本号(这个版本号是spec文件)
      ’>3.7' 大于3.7版本
      '>=3.7' 大于等于3.7版本
      '<3.7' 小于3.7版本
      '~>3.7' 大于等于3.7并且小于3.8版本(这个参数有意思,经常使用的也是这个参数)

    • 指定path,branch,tag,commit
      :branch => 'branch名'
      :tag => 'tag名'
      :commit => '提交号'
      :path => '~/Documents/AFNetworking'

  2. platform
    platform :ios, '7.0'。说希望采用iOS7.0的进行编译
    最好进行指定,不指定的化,会采用默认的,因为有些库指定了最低的ios版本所以,不指定的化可能编译不过

  3. target
    如果不指定的化,就默认是全部的target。有些时候我向在一个target里有,在其他target没有,这是就可以采用下面指定target指定需要的库

    target 'TRapidCalculation' do
    //写你要的库
    end
    target 'TRapidCalculation_auto' do
    //写你要的库
    end
    
  4. use_frameworks!
    这个指明编译成动态库,而不是静态库,特别是在使用Swift库的过程中,特别需要使用这句,swift里。不过他会把所有项目的编译动态库,这一点有点不好。不过在使用Swift库的过程中就没办法了。

  5. source
    Cocoapods从哪些仓库(装有Spec文件的repo)中获得框架的源代码。(至于什么是Spec我将在后面建立私有库里做说明)我们使用公开的第三库时都是使用的source 'https://github.com/CocoaPods/Specs.git'这个源。在做私有库时,可以引用自己源如我的source 'git@gitee.com:BlueLegend/BlueLegendPrivateSpec.git'

  6. podfile文件示例

#公用的私有远程索引库源
source  'git@gitee.com:BlueLegend/BlueLegendPrivateSpec.git'
#github远程索引库源
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target ‘CoreConcept’ do
    pod 'lottie-ios'
    pod 'Masonry'
    pod 'SDWebImage', '~> 4.3.0'
    pod 'YYModel', '~> 1.0.4'
    pod 'YYCache', '~> 1.0.4'
    pod 'YYText', '~> 1.0.7'
    pod 'BlocksKit', '~> 2.2.5'
    pod 'MJRefresh', '~> 3.1.15.3'
    pod 'KBRCategory'
    pod 'HyphenateLite'
end

四:podfile.lock文件深入

Podfile.lock 文件主要包含三个块:
PODS 用来记录每个pod的版本号
DEPENDENCIES 依赖的其他库
SPEC CHECKSUMS 每个库对应的podspec.json文件的checksum(SHA-1算法)。
通过这些信息可以确保多人协作的时候,大家使用的是相同版本的第三方库。

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

五:Manifest.lock文件

Manifest.lock文件格式与podfile.lock文件是一样的。主要用来对比远程与本地安装文件是否一样。
Manifest.lock是你的本地的清单,在你没做任何操作时时与podfile.lock文件内容一样的。但当你git pull 从其他开发人员那里拿到了podfile.lock文件,其他开发人员可能修改了podfile.lock文件,就造成安装清单不一致。需要你pod install重新安装,Manifest.lock这个文件,重新保持了两个文件的一致性。所以我们在工程文件里编译脚本里有这两个文件的比较。

diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [ $? != 0 ] ; then
    # print error to STDERR
    echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2
    exit 1
fi
# This output is used by Xcode 'outputs' to avoid re-running this script phase.
echo "SUCCESS" > "${SCRIPT_OUTPUT_FILE_0}"

还是给个截图解释下
/bin/sh 是指定脚本解释器(这里是shell脚本解释器)
inputFile 就是Podfile.lock文件与Mainifest.lock

Xnip2018-09-05_14-26-04

2018/9/4 posted in  iOS工具深入