- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章iOS中使用Fastlane实现自动化打包和发布由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
简介 。
Fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化打包、发布等工作,可以节省大量的时间.
Github:https://github.com/fastlane/fastlane 。
官网:https://fastlane.tools/ 。
文档:https://docs.fastlane.tools/ 。
安装 。
1、首先要安装正确的 Ruby 版本。在终端窗口中用下列命令来确认
1
|
ruby -v
|
2、然后检查 Xcode 命令行工具是否安装。在终端窗口中输入命令:
1
|
xcode-select --install
|
如果未安装,终端会开始安装,如果报错误:command line tools are already installed, use "Software Update" to install updates.代表已经安装.
3、以上依赖配置好之后就可以通过 rubygem 进行安装了:
1
|
$ sudo gem install fastlane
|
安心等待一会,fastlane就安装完成了.
初始化 。
打开终端,cd到你的工程目录,然后执行fastlane init:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
$ cd to/your/ios/project
$ fastlane init
[
14
:
21
:
43
]: Detected iOS/Mac project in current directory...
[
14
:
21
:
43
]: This setup will help you get up and running in no time.
[
14
:
21
:
43
]: fastlane will check what tools you're already using and set up
[
14
:
21
:
43
]: the tool automatically
for
you. Have fun!
[
14
:
21
:
43
]: Created
new
folder
'./fastlane'
.
[
14
:
21
:
43
]: $ xcodebuild -showBuildSettings -project ./xxx.xcodeproj
[
14
:
21
:
48
]: Your Apple ID (e.g. fastlane
@krausefx
.com): xxx
@xxx
.xom
[
14
:
21
:
54
]: Verifying that app is available on the Apple Developer Portal and iTunes Connect...
[
14
:
21
:
54
]: Starting login with user
'xxx@xxx.com'
+----------------+--------------------------------------+
| Detected Values |
+----------------+--------------------------------------+
| Apple ID | xxx
@xxx
.com |
| App Name | xxx |
| App Identifier | com.xxx.xxx |
| Project | /Users/lisong/Desktop/xxx/x |
| | xx.xcodeproj |
+----------------+--------------------------------------+
[
14
:
22
:
06
]: Please confirm the above values (y/n)
y
[
14
:
22
:
09
]: Created
new
file
'./fastlane/Appfile'
. Edit it to manage your preferred app metadata information.
[
14
:
22
:
09
]: Loading up
'deliver'
,
this
might take a few seconds
[
14
:
22
:
09
]: Login to iTunes Connect (xxx
@xxx
.com)
[
14
:
22
:
13
]: Login successful
+-----------------------+------------------------+
| deliver
2.30
.
1
Summary |
+-----------------------+------------------------+
| screenshots_path | ./fastlane/screenshots |
| metadata_path | ./fastlane/metadata |
| username | xxx
@xxx
.com |
| app_identifier | com.xxx.xxx |
| edit_live |
false
|
| platform | ios |
| skip_binary_upload |
false
|
| skip_screenshots |
false
|
| skip_metadata |
false
|
| force |
false
|
| submit_for_review |
false
|
| automatic_release |
false
|
| dev_portal_team_id | WKR87TTKML |
| overwrite_screenshots |
false
|
+-----------------------+------------------------+
[
14
:
22
:
21
]: Writing to
'fastlane/metadata/zh-Hans/description.txt'
...
[
14
:
22
:
21
]: Writing to
'fastlane/metadata/review_information/notes.txt'
[
14
:
22
:
21
]: Successfully created
new
configuration files.
[
14
:
22
:
22
]: Successfully downloaded large app icon
[
14
:
22
:
22
]: Downloading all existing screenshots...
[
14
:
22
:
27
]: Downloading existing screenshot
'1_iphone4_1.1.jpg'
for
language
'zh-Hans'
···
[
14
:
22
:
34
]: Downloading existing screenshot
'5_iphone6_5.5.jpg'
for
language
'zh-Hans'
[
14
:
22
:
34
]: Successfully downloaded all existing screenshots
[
14
:
22
:
34
]: Successfully created
new
Deliverfile at path
'fastlane/Deliverfile'
[
14
:
22
:
34
]: $ xcodebuild -list -project ./xxx.xcodeproj
[
14
:
22
:
35
]:
'snapshot'
not enabled.
[
14
:
22
:
35
]:
'cocoapods'
enabled.
[
14
:
22
:
35
]:
'carthage'
not enabled.
[
14
:
22
:
35
]: Created
new
file
'./fastlane/Fastfile'
. Edit it to manage your own deployment lanes.
[
14
:
22
:
35
]: fastlane will collect the number of errors
for
each action to detect integration issues
[
14
:
22
:
35
]: No sensitive/
private
information will be uploaded
[
14
:
22
:
35
]: Learn more at https:
//github.com/fastlane/fastlane#metrics
[
14
:
22
:
35
]: Successfully finished setting up fastlane
|
在 “Your Apple ID” 这一步输入苹果开发者账号。在“Please confirm the above values”这一步,确认信息,没问题输入 y。然后,fastlane 会进行一系列的初始化操作,包括下载 App Store 上的元数据和截屏文件.
等待初始化完成之后,工程目录下就多了一个 fastlane目录,其内容如下:
咱们来看两个主要的,Appfile和Fastfile.
Appfile 。
Appfile用来存放app_identifier,apple_id和team_id。 了解详情,它的格式是这样的:
1
2
3
|
app_identifier
"com.xxx.xxx"
# app的bundle identifier
apple_id
"xxx@xxx.com"
# 你的Apple ID
team_id
"XXXXXXXXXX"
# Team ID
|
你也可以为每个lane(后面会讲到)提供不同的 app_identifier, apple_id 和 team_id,例如:
1
2
3
4
5
6
7
8
9
|
app_identifier
"com.aaa.aaa"
apple_id
"aaa@aaa.com"
team_id
"AAAAAAAAAA"
for_lane :inhouse
do
app_identifier
"com.bbb.bbb"
apple_id
"bbb@bbb.com"
team_id
"AAAAAAAAAA"
end
|
这里就是为Fastfile中定义的:inhouse设置单独的信息.
Fastfile 。
Fastfile管理你所创建的 lane ,了解详情。它的格式是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
···
# 自动更新fastlane 工具
# update_fastlane
#需要的fastlane的最小版本,在每次执行之后会检查是否有新版本,如果有会在最后末尾追加新版本提醒
fastlane_version
"2.30.1"
#默认使用平台是 ios,也就是说文件可以定义多个平台
default_platform :ios
platform :ios
do
before_all
do
# ENV[
"SLACK_URL"
] =
"https://hooks.slack.com/services/..."
cocoapods
end
desc
"Runs all the tests"
lane :test
do
scan
end
desc
"提交一个新的Beta版本到 Apple TestFlight"
desc
"This will also make sure the profile is up to date"
lane :beta
do
# match(type:
"appstore"
) # more information: https:
//codesigning.guide
gym(scheme:
"Docment"
) # Build your app - more options available
pilot
# sh
"your_script.sh"
end
desc
"部署一个新版本到App Store"
lane :release
do
# match(type:
"appstore"
)
# snapshot
gym(scheme:
"Docment"
) # Build your app - more options available
deliver(force:
true
)
# frameit
end
# 你可以定义自己的lane
#执行lane成功后的回调
after_all
do
|lane|
# slack(
# message:
"Successfully deployed new App Update."
# )
end
# 如果流程发生异常会走这里并终止
error
do
|lane, exception|
# slack(
# message: exception.message,
# success:
false
# )
end
end
我们也可以定义一个自己的lane:
desc
"企业版"
lane :inHouse
do
gym(scheme:
"XXX"
,
export_method:
"enterprise"
,
output_directory
"./build"
, # 打包后的 ipa 文件存放的目录
output_name
"XXX"
# ipa 文件名
)
end
|
其中一个lane就是一个任务,里面是一个个的action组成的工作流.
利用目前支持的工具可以做所有包含自动化和可持续化构建的每个环节,例如:
scan 自动化测试工具,很好的封装了 Unit Test 。
sigh 针对于 iOS 项目开发证书和 Provision file 的下载工具 。
match 同步团队每个人的证书和 Provision file 的超赞工具 。
gym 针对于 iOS 编译打包生成 ipa 文件 。
deliver 用于上传应用的二进制代码,应用截屏和元数据到 App Store 。
snapshot 可以自动化iOS应用在每个设备上的本地化截屏过程 。
执行 。
定义完lane之后怎么执行呢?打开终端,切换到项目的根目录:执行fastlane lane'name就可以了。成功之后会在相应的路径下生成ipa文件,如果报错的话就根据错误信息好好查看文档.
其他 。
1、这里是官方提供的一些例子.
2、想了解fastlane命令的话可以执行$ fastlane –help 。
3、查看可用任务的列表,可以执行命令$ fastlane lanes 。
4、fastlane也提供了很多插件方便我们使用,例如pgyer(发布app到蒲公英)。我们也可以打完包直接传到蒲公英上,具体的可以看蒲公英提供的文档.
如果你感觉有些插件不符合自己的情况,你甚至可以自定义插件 。
5、多个 lane 的话实际上是可以相互调用的,这个其实特别实用。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
default_platform :ios
platform :ios
do
lane :prepare
do
cocoapods
match
end
desc
'fastlane build'
'fastlane build type:adhoc'
lane :build
do
|options|
# 调用上面的 prepare 任务
prepare
case
options[:type]
when
'adhoc'
adhoc
else
appstore
end
end
lane : adhoc
do
···
end
lane : appstore
do
···
end
end
|
我们可以在 Fastfile 文件中添加一个函数来设置version号和build号.
default_platform :ios 。
1
2
3
4
5
6
7
8
|
def prepare_version(options)
increment_version_number(
version_number: options[:version]
)
increment_build_number(
build_number: options[:build]
)
end
|
然后可以在一个lane中使用这个函数:
1
2
3
4
5
|
lane :appstore
do
|options|
···
prepare_version(options)
···
end
|
然后执行这个lane的时候:
1
|
$ fastlane appstore version:
2.4
.
0
build:
2.0
|
好啦,先说到这里吧,Fastlane能做的事情还有很多,大家可以去好好看看文档,研究一些高级的用法吧! 。
原文链接:http://blog.csdn.net/kiritochen/article/details/72722251 。
最后此篇关于iOS中使用Fastlane实现自动化打包和发布的文章就讲到这里了,如果你想了解更多关于iOS中使用Fastlane实现自动化打包和发布的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!