使用BUCK进行iOS项目打包

关于BUCK

BUCK是Facebook开源的快速打包工具,可以用于多种语言及平台的项目打包,例如:C、C++、Java、iOS、Android等等。用于大型的iOS、Android项目,可以显著提升打包效率。

关于BUCK介绍的一些链接如下:

BUCK官网

What Makes Buck so Fast?:介绍了BUCK如何做到性能提升

BUCK源码: 里面有源码和大量Unit Test提供了很多示例,同时查看Issues可以找到很多问题的解决方案

iOS快速编译BUCK

基于Facebook Buck改造Android构建系统之初体验

 

核心概念

Build Rule

build rule is a procedure for producing an output file from a set of input files.

Build Target

build target is a string that is used to identify a build rule in your project.

Build File 

build file is a file named BUCK that defines one or more build rules.

.buckconfig

The root of your project must contain a configuration file named .buckconfig.

 

iOS打包相关Rule

Rule
产出
作用

apple_asset_catalog()

没有特定产出,可以作为apple_bundle()的依赖Contains resources stored in Apple asset catalog directories

apple_binary()

静态库:.a fileAn apple_binary() rule builds a native executable from the supplied set of Objective-C/C++ source files

apple_bundle()

.app 或者 .appex (apple watch extension)An apple_bundle() rule takes an Apple binary and all of the resources and asset catalogs in the rule's transitive dependencies and generates a bundle containing all of those files. 

apple_library()

静态库:.a fileAn apple_library() rule represents a set of Objective-C/C++ source files

apple_package()

ipa fileAn apple_package() rule takes the output of an apple_bundle() rule and compresses it in an IPA (iOS App Store Package) file. 

apple_resource()

This rule does not have any output on its own and can be built only as a dependency (either direct or transitive) of an apple_bundle() rule.An apple_resource() rule contains sets of resource directories, files and file variants that can be bundled in an application bundle. 

apple_test()

An apple_test() rule contains Objective-C/C++ code which can be built and used to test code contained in other rules.

core_data_model()

This rule does not have any output on its own and can be built only as a dependency (either direct or transitive) of an apple_bundle() rule, in which case all core_data_model() rules that the bundle rule depends on are merged and placed into the final output bundle together.An core_data_model() rule contains models for Apple's Core Data framework. 

prebuilt_apple_framework()

引用.framework库
   

 

使用BUCK用于iOS工程打包

目录组织结构

对于一个多个子工程组成,通过依赖关系最终集成为单个可执行文件。使用BUCK,需要为每一个子工程都创建BUCK文件,在根目录配置.buckconfig。大致目录结构如下:

 

|—.buckconfig

|—BUCK

|—SubProject1

|---------src

|---------BUCK

|—SubProject2

|---------src

|---------BUCK

|—SubProject3

|---------src

|---------BUCK

|—SubProject4

|---------src

|---------BUCK

......

 

每个子工程的BUCK文件,负责配置build rule,生成静态.a 文件,然后最终通过根目录中的BUCK,来生成.ipa文件。

 

.buckconfig配置

[cache]mode = dir[cxx]cflags = -std=gnu11cxxflags = -std=c++14 -stdlib=libc++default_platform = iphonesimulator-x86_64combined_preprocess_and_compile = true[alias]SubProject1 = //SubProject1: SubProject1LibSubProject2 = //SubProject2: SubProject2LibSubProject3 = //SubProject3: SubProject3LibSubProject4 = //SubProject4: SubProject4Lib
  [apple]xctool_zip_target = //third-party/ios/xctool:xctool-minimal-zip
 
[project]ignore = .buckd, \.hg, \.git, \.idea, \buck-cache, \buck-out, \

 

cxx:定义了一些C++编译的参数

alias: 定义了一些build target的别名。例如CTFoundation为例,在CTFoundation中的BUCK文件中定义了CTFoundationLib的rule,所以如果要打包CTFoundation,可以通过别名的方式,命令如下:

# 未用别名
buck build //SubProject1:SubProject1Lib
  
# 使用别名
buck build SubProject1

 

apple: 指定了xctool的文件地址。Buck的iOS打包是依赖于xctool,所以需要把xctool的相关代码引入,具体内容可以参考示例: 

git clone git@github.com:fbsamples/bucksamples.git
cd bucksamples/cross-platform-scale-2015-demo/

 

BUCK文件配置

独立子工程的BUCK配置

下面以一个独立的子工程作为示例,而且没有其他依赖,所以可以作为第一个示例。它的BUCK文件配置如下:

apple_library(name = 'SubProject1Lib',preprocessor_flags = ['-fobjc-arc','-Wno-deprecated-declarations','-fmodules'],compiler_flags = ['-Wno-objc-designated-initializers','-fembed-bitcode'],linker_flags = ['-F$DEVELOPER_DIR/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks','-F$DEVELOPER_DIR/../SharedFrameworks','-F$DEVELOPER_DIR/Library/PrivateFrameworks',],srcs = glob(['src/**/**/**/*.m',]),frameworks = ['$SDKROOT/System/Library/Frameworks/Foundation.framework',],exported_headers = {'xxx1.h': './src/xxx.h','xxx2.h': './src/xxx2.h',...},#header_namespace = '',visibility = ['PUBLIC',],
)

 

整个BUCK文件就一个apple_library,产出libCTLocation.a文件。可以看到里面可以指定一下编译的flags、依赖的framework、源代码、对外暴露的头文件等等。

通过命令 buck build CTLocation就可以打包查看,在buck-out目录中可以看到生成出来的.a文件。

 

需要注意的exported_headers的配置:

The set of header files that are made available for inclusion to the source files in this target and all targets that transitively depend on this one. These should be specified as either a list of header files or a dictionary of header names to header files. The header names can contain forward slashes (/). If a list of header files is specified, the headers can be imported with #import "$HEADER_PATH_PREFIX/$HEADER_NAME" or, if a header file that belongs to the same rule is being imported, with #import "$HEADER_NAME", where $HEADER_PATH_PREFIX is the value of the target's header_path_prefix attribute, and $HEADER_NAME is the filename of the header file. If a dictionary is specified, each header can be imported with #import "$HEADER_NAME", where $HEADER_NAME is the key corresponding to this file. In this case, the header_path_prefix attribute is ignored. In either case, quotes in the import statements can be replaced with angle brackets.

 

可以有两种配置格式,数组和字典。

使用数组的时候,其他代码引用是需要加上前缀例如:#import "SubProject1/xxx.h",默认前缀和apple_library的name一致,可以通过设置header_path_prefix改变。

使用字典的时候,其他代码引用时候可以通过key来引用,例如:

// BUCK配置:
exported_headers = {'xxx.h': './src/xxx.h',
}// 其他代码引用
#import "xxx.h"

依赖资源文件

如果代码中有资源文件,需要通过apple_resource来引用

apple_resource(name = 'SubProject1Resource',files = glob(['*.png']),dirs = [],
)

 

特殊的Compiler flag

在iOS中,有些源代码需要一些特殊的compiler flag,例如非ARC的源码。在src里面可以进行配置:

srcs = glob(['SubProject1/**/**/**/*.m',], excludes = ['**/**/xxx1.m','**/**/xxx2.m'])+[('src/xxx1.m', ['-Wno-shorten-64-to-32']),('src/xxx2.m', ['-fno-objc-arc'])]

引用外部framework

prebuilt_apple_framework(name = 'BuckTest',framework = 'BuckTest.framework',preferred_linkage = 'shared',visibility = ['PUBLIC'],
)

 

引用外部.a 静态库

如下项目有依赖外部的.a库,可以通过以下方法引用

cxx_library(name = 'lib1',srcs = [],exported_headers = {'xxx.h': 'libs/xxx.h',},visibility = ['PUBLIC'],
)apple_library(name = 'SubProject1Lib',deps = [':lib1'],...libraries = ['libs/xxx.a',],

 

当前BUCK的局限性

BUCK本身目前还在快速迭代中,所以很多rule还没有完善、文档不全,社区也够活跃,遇到问题会比较难找到解决方案。

目前iOS项目中碰到的一些限制问题:

    • 自定义的script,在XCode的build phase中可以自定义一些shell脚本,但是在BUCK中没有找到对应的方式
    • 无法生成.bundle资源包,iOS打包过程中每个子工程都会产出一个.a和.bundle文件,但是BUCK打包不会产出.bundle文件只会有.a,资源文件只能通过apple_resource()来管理作为其他rule的依赖。
    • 通过apple_library()生成.a文件似乎目前还没办法指定valid architectures。

转载于:https://www.cnblogs.com/wdsunny/p/7481500.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机excel表格相关考试视频,1189.5天通过职称计算机考试:Excel 2003中文电子表格(考点视频串讲+全真模拟).pdf...

<<5天通过职称计算机考试&#xff1a;Excel 2003中文电子表格(考点视频串讲&#xff0b;全真模拟)>>猛点这里下载全部内容目录&#xff1a;第1章 Excel应用基础考点1 Excel的启动与退出1&#xff0e;考点分析2&#xff0e;经典试题考点2 熟悉Excel窗口的操作1&…

cvc降噪和主动降噪_1MORE 主动降噪圈铁耳机图集

1MORE在今年推出了一款主动降噪耳机&#xff0c;这款耳机定价虽然稍高达到1299元&#xff0c;不过它还是相比其他主流价位的主动降噪耳机有很多的不同点。1MORE主动降噪耳机使用的似乎是高通蓝牙SoC的方案&#xff0c;使用了动铁动圈的扬声器组合。支持前馈反馈的双Mic主动降噪…

北师大计算机试题五答案,北京师范大学计算机软件及理论2022考研招生分析、参考书、真题等复习指导解析...

原标题&#xff1a;北京师范大学计算机软件及理论2022考研招生分析、参考书、真题等复习指导解析一、院系及专业介绍北京师范大学信息学科植根于学校百年沃土&#xff0c;经过半个多世纪的发展壮大&#xff0c;现已拥有计算机科学与技术一级学科博士后科研流动站和博士学位授权…

C++primer 13.6.2节练习

练习13.49 13.50 1 #include <iostream>2 #include <string>3 #include <utility>4 #include <memory>5 #include <algorithm>6 #include <vector>7 8 using namespace std;9 10 class String {11 friend ostream &print(ostream …

北约科技组织展望未来20年军事新兴与颠覆性技术趋势

来源&#xff1a;创新研究2020年5月4日&#xff0c;北约科技组织&#xff08;NATO Science & Technology Organization&#xff09;发布《科技趋势&#xff1a;2020-2040》&#xff08;Science & Technology Trends 2020-2040&#xff09;&#xff0c;分析评估未来20年…

feign 整合sentinel_SpringCloud实战五-Sentinel上

场景微服务会划分出多个模块&#xff0c;模块之间的调用频率可能比较高&#xff0c;这时可能会存在服务雪崩&#xff08;一个服务失败&#xff0c;导致整条链路的服务都失败的情形&#xff09;的&#xff0c;如图&#xff1a;随着时间的推移&#xff0c;从刚开始的C不可用变成了…

计算机院校人气排名,2019高校人气排行榜_最具人气大学排行榜7月榜单发布 清华大学排第一...

最具人气大学排行榜7月榜单发布 清华大学排第一JPG&#xff0c;395x289&#xff0c;231KB&#xff0c;342_249大学人气排行榜 你的大学上榜了吗JPG&#xff0c;392x290&#xff0c;231KB&#xff0c;337_250大学人气排行榜 你的大学上榜了吗JPG&#xff0c;596x447&#xff0c;…

170905-MyBatis中的关系映射

关系映射 参考文档复习&#xff1a;1对1&#xff0c;1对多&#xff0c;多对多 1.映射(多)对一、(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表&#xff0c;则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性。则必须关联其它的数据表 …

【AI-CPS】【工业互联网】从观望到行动:全球工业物联网市场生态全景观察

以下文章来源于资本实验室 &#xff0c;作者齐达在当前&#xff0c;诸如5G&#xff0c;物联网、边缘计算、人工智能、机器人、区块链、增材制造和虚拟现实/增强现实等技术正在加速融合到工业物联网&#xff08;Industrial Internet of Things&#xff0c;IIoT&#xff09;的肥沃…

光华科技光刻胶_光刻胶领衔国产替代,20只相关优质个股曝光,快看看有没有你的...

光刻胶(3.78%)领涨股&#xff1a;扬帆新材&#xff08;300637&#xff09;&#xff0c;上涨家数&#xff1a;20&#xff0c;下跌家数&#xff1a;4&#xff0c;涨停家数&#xff1a;320只光刻胶概念优质股20只光刻胶优质股&#xff0c;按涨跌幅大小排序&#xff0c;分别为&…

17福师《计算机应用基础,福师17春秋学期《计算机应用基础》在线在线作业一.doc...

一、单选题(共40道试题&#xff0c;共80分。)V1.Windows98桌面上&#xff0c;不能打开"我的电脑"的操作是&#xff1a;A.在"资源管理器"中选取"我的电脑"B.用鼠标左键双击"我的电脑"图标C.先用鼠标右键双击"我的电脑"图标&a…

考虑玩家移动速度的射击

E4自带第一人称射击模板中的射击在玩家移速较慢的情况下没有明显问题&#xff0c;但如果玩家在高速移动时候&#xff08;例如骑摩托车或者开车&#xff09;&#xff0c;就会发现子弹的速度很奇怪&#xff0c;没有考虑到玩家本身的移动速度&#xff0c;因此本身也是不符合物理规…

荐读:五月最值得阅读的15篇人工智能文章

本文经授权转载自学术头条&#xff08; ID: SciTouTiao&#xff09;&#xff0c;转载请联系出处来源&#xff1a;学术头条作者&#xff1a;吴婷婷在过去一个月中&#xff0c;15篇最值得阅读的AI文章&#xff08;附链接&#xff09;&#xff1a;1、沃森的创造者想教人工智能一个…

hbase集群 数据写入_Hbase实用技巧:全量+增量数据的迁移方法

摘要&#xff1a;本文介绍了一种Hbase迁移的方法&#xff0c;可以在一些特定场景下运用。背景在Hbase使用过程中&#xff0c;使用的Hbase集群经常会因为某些原因需要数据迁移。大多数情况下&#xff0c;可以跟用户协商用离线的方式进行迁移&#xff0c;迁移离线数据的方式就比较…

计算机网络IP分配大题,2018年IP分片网络大题

【知识回顾】(1)分片的数据长度必须是8B的整数倍(2)路由器端口号也需要占用该子网中的一个IP地址。【真题】第一问&#xff1a;IP地址【解析】因为192.168.1.0/24这个IP均分给两个部门&#xff0c;所以可以销售部的网络号为0&#xff0c;技术部的子网号为128.即技术部子网地址为…

lte核心网由哪些设备组成_投影地面互动的实现由哪些设备组成?「振邦视界」...

地面互动投影技术是比较受大众欢迎的多媒体展示技术&#xff0c;新奇的互动体验让人们流连忘返&#xff0c;地面互动投影目前也被运用到各个行业领域中&#xff0c;对品牌的宣传有着很大的作用&#xff0c;是一种新型的利益化手段。那么地面互动投影的实现是由哪些设备组成的呢…

十二、泛型、反射和异常

一、泛型 泛型是javaSE1.5的新特性&#xff0c;泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数&#xff0c;这种参数类型可以用在类、接口和方法的创建中&#xff0c;分别称为泛型类、泛型接口、泛型方法。 在javaSE1.5之前&#xff0c;没有泛型…

计算机日期的格式怎么写,在excel表格中怎么把日期格式改成文本格式(excle表格中改变日期格式)...

wps表格中如何改变日期格式平常最常是最简单的日入就是数字格式了&#xff0c;比如以今例&#xff0c;我们一般都会输入“20141214“&#xff0c;如图步骤阅读2①那么如何将这种格式转换成2014-12-14呢&#xff1f;方法&#xff1a;鼠标选中此单元格&#xff0c;然后右键鼠标选…

张首晟谈牛顿的《自然哲学的数学原理》

出版于1729年的第一英文版牛顿名著《自然哲学的数学原理》本文转载自丹华资本&#xff08;DanhuaCapital &#xff09;2016-01-28公众号张首晟文章。了解我的朋友都知道我最不欢喜礼品&#xff0c;总觉得物质生活越简单越好。所以每逢圣诞佳节&#xff0c;天伦之乐&#xff0c;…

前端填空题_一年前端面试总结|入职字节|2020.8

站在未来看现在你当像鸟飞向你的山前言普通本科&#xff0c;软件工程专业&#xff0c;2019年毕业进入奇安信集团&#xff08;前360企业安全&#xff09;&#xff0c;实习期间遇到一群可以一起嗨的朋友&#xff0c;感觉很幸福&#xff0c;也很庆幸能够遇到hin nice的导师&#x…