回想一下我们发布 iOS 应用,不仅步骤繁琐,非常耗时。一旦其中一步失误了,又得重新来。作为一名优秀的工程师不应该让这些重复的工作在浪费我们的人生。在软件工程里面,我们一直都推崇把重复、流程化的工作交给程序完成。这次的文章主角就是为了解放我们而来—— fastlane,这个明星库在 github 已经高达 1w 多的start量,得到了广大码农们的认为。
Fastlane
fastlane 是 iOS (还有 Android ) 布署和发布最好的一套工具。它处理了所有重复的工作,例如生成截图,处理签名和发布应用。
安装
fastlane实际是由Ruby写的,使用Ruby的Gem安装是我们的不二选择
sudo gem install fastlane -NV
接着在终端进入项目里面(目前fastlane swift 正在测试,就以之前的版本讲解)
fastlane init
按照提示初始化完成之后,在项目下面生成 fastlane 文件夹
基本介绍
先普及两个重要的文件,初始化后在./fastlane文件件即可找到
Appfile
存放着 AppleID 或者 BundleID 等一些fastlane需要用到的信息。基本上我们不需要改动这个文件的内容。
它放到你项目下面的 ./fastlane文件夹下面,默认生成的文件如下:
app_identifier "net.sunapps.1" # The bundle identifier of your app
apple_id "felix@krausefx.com" # Your Apple email address
# 如果账号里面有多个team,可以指定所有的team
# team_name "Felix Krause"
# team_id "Q2CBPJ58CA"
# 指定 App Store Connect 使用的team
# itc_team_name "Company Name"
# itc_team_id "18742801"
更多详细的配置,可以参考一下文档
Appfile Doc
FastFile
一开始生成的Fastlane文件大概如下:
platform :ios do
before_all do
end
desc "Runs all the tests"
lane :test do
scan
end
# You can define as many lanes as you want
after_all do |lane|
end
error do |lane, exception|
# slack(
# message: "Error message"
# )
end
end
Fastfile里面包含的块类型有四种:
before_all 用于执行任务之前的操作,比如使用cocopods更新pod库
after_all 用于执行任务之后的操作,比如发送邮件,通知之前的
error 用于发生错误的操作
lane 定义用户的主要任务流程。例如打包ipa,执行测试等等
如下面,来讲解一下lane的组成。
desc "Push a new beta build to TestFlight" //该任务的描述
lane :beta do //定义名字为 beta 的任务
build_app(workspace: "expample.xcworkspace", scheme: "example") //构建App,又叫gym
upload_to_testflight //上传到testfilght,
end
该任务的作用就是构建应用并上传到 TestFilght。下面有两个 Action
build_app 生成 ipa 文件
upload_to_testflight 把 ipa 文件上传到 TestFilght
在控制台进入项目所在的文件夹下面,执行下面命令
fastlane beta
即可执行任务,按照上面的任务,会生成 ipa 并上传到 TestFilght。其实很简单,定义好任务,控制台执行任务即可。
实践
那么如何写一个我们属于自己的 lane 呢? 就以发布 ipa 到 fir 为例
desc "发布到Fir"
lane :pulish_to_fir do
# 运行 pod install
cocoapods
# 构建和打包ipa
gym(
clean: true,
output_directory: './firim',
scheme: 'xxxx',
configuration: 'Test',
export_options: {
method: 'development',
provisioningProfiles: {
"xxx.xxx.xxx": "match Development xxx.xxx.xxx"
},
}
)
# 上传ipa到fir.im服务器,在fir.im获取firim_api_token
firim(firim_api_token: "fir_token")
end
下面解释一下上面的内容
cocoapods
在项目里执行 pod install,详细例子可见 Doc
sh "./update_version.sh"
这是由作者本地写的更新版本号的脚本
gym (又名build_app)
gym 是fastlane的里面一部分,它可以方便生成和签名ipa,能为开发者省下不少功夫。
Doc
firim
firim 是一个插件,执行 fastlane add_plugin firim 即可把插件装好
总结
fastlane里面内置很多常用的Action,具体的使用方法建议多看一下官方文档。
fastlane项目里面也有很多其他公司的 例子,在不清楚怎么使用的时候,看看这些例子也未尝不是一种方法。
【无门槛免费领】
535G超强程序员编程
0基础从入门到精通自学视频教程!
万水千山总是情,点个 “ 在看” 行不行文章浏览阅读2k次。[http://www.cocoachina.com/ios/20160929/17610.html]组件化架构漫谈2016-09-29 08:20 编辑: 阿花君霸占路人 分类:iOS开发 来源:刘小壮的投稿49 40035iOS开发设计模式组件化架构滴滴架构淘宝架构招聘信息:cocos2d-x休闲游戏开发Java工程师Mac开_组件化架构设计
文章浏览阅读1.3k次。介绍Netdata 是一款 Linux 性能实时监测工具。Netdata是Linux系统实时性能监测工具,提供web界面的界面视角。它用可视化的手段,将被监测者最细微的细节,展现了出来。这样,你便可以清晰地了解你的系统和应用程序此时的状况。1.优美的界面:bootstrap框架下的控制界面2.自定义的控制界面:你可以使用简单的HTML代码去自定义控制界面(不需要使用javascript)3.极其的快速而高效:程序使用C进行编写(默认安装下,预计只有2%的单核CPU使用率和少许的内存使用率)4.零_redhat 7.8 离线安装 netdata
文章浏览阅读129次。文章目录1.内容概述2.岛屿数量2.1 题目描述1.内容概述2.岛屿数量2.1 题目描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"],_c++某网格向外面扩展不考虑方向
文章浏览阅读734次。介绍本系列中的前一个教程如何访问DOM中的元素 ,介绍了如何使用document对象的内置方法通过ID,类,标记名称和查询选择器来访问HTML元素。 我们知道,DOM被构造为一个以document节点为根节点和每个其他节点(包括元素,注释和文本节点)作为各个分支的节点树 。通常情况下,您将需要在DOM中移动,而不事先指定每个元素。 学习如何浏览DOM树并从分支转移到分支对于理解如何使用JavaSc..._遍历body所有子节点dom
文章浏览阅读1.7k次。前言本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数。下面话不多说了,来一起看看详细的介绍:如下例程里,???处是需要调用父类函数的地方,接下来结合例程具体介绍。# -*- coding:utf-8 -*-class Student:def __init__(self,name):s..._python函数中的变量可以在子函数中访问吗
文章浏览阅读543次。Animation概述System.Windows.Media.Animation 命名空间提供一些类型,这些类型支持属性动画功能,包括时间线、演示图板和关键帧。.17个“类型名+Animation”类,这些类使用插值。 22个“类型名+AnimationUsingKeyFrames”类,这些类使用关键帧动画。 3个“类型名+AnimationUsingPath”类,这些类使用基于路径的动画。简单动画DoubleAnimation在指定的Duration上使用线性..._必须为“system.windows.media.animation.doubleanimationusingkeyframes”指定 t
文章浏览阅读195次。Kotlin实现一对一直播软件源码底部弹出的列表对话框的相关代码1.activity_main.xml<LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <TextView android:id="@+id/tv1"_android anylayer弹出对话框
文章浏览阅读1w次,点赞6次,收藏29次。MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到…… 的效果,可以借助 、、 来实现。_mybatis choose when
文章浏览阅读3.2k次,点赞3次,收藏30次。FHO算法模拟了火鹰的觅食行为,是一个考虑放火、火势蔓延与捕捉猎物的过程,其算法流程如下图所示。FHO数学模型描述如下:Step 1: 首先,确定若干候选解X作为火鹰与猎物的位置向量,利用随机优化确定初始位置。表示如下:其中,N为候选解的总数,表示第i个候选解的第j个决策变量,表示候选解的初始位置,表示第i个候选解的第j个决策变量候选解的最小最大边界,rand∈(0,1)。_与pso算法相类似的算法
文章浏览阅读432次,点赞5次,收藏3次。Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。seata1.8.0官方介绍。_ks8部署seata集成到nacos
文章浏览阅读422次。有问题发到评论区_rtl8370使用
文章浏览阅读3.6k次,点赞3次,收藏3次。给每个下拉菜单绑定一个change事件。当下拉菜单选项改变时,在组件中设置新数据,使得下级下拉菜单的选项随之改变。Vue.js是构建用户界面的渐进式框架,它可以轻松实现下拉菜单的三级联动。为绑定下拉菜单的选项,我们需要设计一个对应的数据结构。可以使用一个数组变量表示三级联动的选项。将设计好的数据绑定到菜单的选项中,并在组件的mounted钩子函数中初始化数据。在Vue组件中,设计一个select组件,它包含三个联动的下拉菜单。为了实现多级联动,我们可以使用递归的方法在组件中实现。_vue三级联动下拉列表怎么实现