Change log
目录
[bazel]-导读
[bazel]-概念和术语
[bazel]-bazel的使用
[bazel]-tulsi的使用
[bazel]-如何编译
[bazel]-缓存
[bazel]-影响缓存命中的因素
[bazel]-优化
项目地址
一.是什么
bazel原理: http://www.cnblogs.com/Jack47/p/build-in-the-cloud.html
bazel官网: https://docs.bazel.build/versions/master/bazel-overview.html
二.安装
官网有安装教程.提供了三种安装方式.下面的homebrew是其中一种安装方式.
step1: install the JDK
Download the JDK from Oracle's JDK Page. Look for "macOS" under "Java SE Development Kit" and download JDK version 8.
step2: 通过homebrew安装bazel (需要先安装homebrew)
// 安装bazel
brew install bazel
// 查看bazel版本
bazel version
// 升级bazel
brew upgrade bazel
三.怎么用
bazel其实就是帮你做点击Xcode Run的时候做的事情.
官网安装步骤:https://docs.bazel.build/versions/master/tutorial/ios-app.html
以下只是结合实践并翻译官方文档而已.
step1: Create a WORKSPACE file
创建GXShell壳文件夹.
在GXShell文件夹下创建WORKSPACE文件
1.每个工作控件必须有一个命名为WORKSPACE的文件
2.并且需在根目录下.
目录如下:
step2: Update the WORKSPACE file
在WORKSPACE文件里我们需要依赖rules_apple和bazel-skylib两个包
rules_apple: 作用是帮你编译苹果设备的软件.最好依赖他的最新Tag
在这里查看最新Tag号: https://github.com/bazelbuild/rules_apple/releases
bazel-skylib: 作用是帮你管理你的源文件
在这里查看最新Tag号: https://github.com/bazelbuild/bazel-skylib/releases
在WORKSPACE里添加依赖的代码如下:
load('@bazel_tools//tools/build_defs/repo:git.bzl', 'git_repository')
git_repository(
name = "build_bazel_rules_apple",
remote = "https://github.com/bazelbuild/rules_apple.git",
tag = "0.6.0",
)
load(
"@build_bazel_rules_apple//apple:repositories.bzl",
"apple_rules_dependencies",
)
apple_rules_dependencies()
git_repository(
name = "bazel_skylib",
remote = "https://github.com/bazelbuild/bazel-skylib.git",
tag = "0.5.0",
)
step3: Create the source files
在GXShell文件夹里创建universal文件夹.
相当于使用Xcode创建新项目时自动帮你创建的Target文件夹.
而且Xcode还自动帮你创建了main.m AppDelegate.h/AppDelegate.m等源文件.
现在这些都需要我们手动创建了.
可以先通过Xcode创建一个新工程.然后把这几个文件复制过来.
问题一: Info.plist文件里必须指定Localization native development region.随便改成什么.因为是面向国内的APP.所以我改为China.
问题二: 这里因为我没使用Main.storyboard.所以需要在Info.plist文件里将Main.storyboard这一选项删除.
step4: Create a BUILD file
在bazel眼里.所有的target或者静态库都是独立的.
那么也就是说所有的target或者静态库都需要有一个BUILD文件来管理.
以此来告诉bazel他应该如果编译你的源文件.
所以我们需要在universal这个target下创建一个管理universal的BUILD文件.
step5: Add the rule load statement
在universal下的BUILD文件添加如下规则.
这段代码其实就是个声明.
告诉bazel需要用build_bazel_rulers_apple这个库里的那个规则来编译universal这个Target.
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
step6: Add an objc_library rule
继续在universal下的BUILD文件添加如下规则
这个objc_library是告诉bazel以下三件事情
1.name >> universal这个Target被编译成静态库后叫什么名字.
2.srcs >> universal这个target下哪些源文件需要被编译.我这里使用通配符.即universal文件夹下所有.h/.m都需要被编译.
3.hdrs >> universal这个taget哪些头文件是public
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
objc_library(
name = "universal_lib",
srcs = [
"universal/main.m",
"universal/AppDelegate.m",
"universal/ViewController.m",
],
hdrs = [
"universal/AppDelegate.h",
"universal/ViewController.h",
],
enable_modules = 1,
)
step7: Add an ios_application rule
继续在universal下的BUILD文件添加如下规则
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
objc_library(
name = "universal_lib",
srcs = [
"universal/main.m",
"universal/AppDelegate.m",
"universal/ViewController.m",
],
hdrs = [
"universal/AppDelegate.h",
"universal/ViewController.h",
],
enable_modules = 1,
)
ios_application(
name = "universal",
bundle_id = "com.sunxxxx.universal",
families = [
"iphone",
"ipad",
],
minimum_os_version = "9.0",
infoplists = [":universal/Info.plist"],
visibility = ["//visibility:public"],
deps = [
":universal_lib"
],
)
这个ios_application是告诉bazel一下7件事
1.name >> 你app的名字
2.bundle_id >> app的唯一标识符
3.familier >> 支持iphone还是ipad还是都支持
4.munimum_os_version >> 最低支持的系统版本
5.infoplists >> info.plist文件路径
6.visibility >> 该库对其他库是否可见
7.deps >> 你依赖的静态库名字
step8: Build the app for the simulator
最后一步.使用bazel build命令编译你的app
然后bazel会生成ipa包在bazel-bin/universal/xx.ipa
然后你就可以拿着这个ipa包安装到device上了.
附录一:
问题:
apple_binary:'apple_binary'规则中没有这样的属性'non_propagated_deps'
我的BUILD文件中并没有任何此类属性。
apple_binary支持的所有属性: https://docs.bazel.build/versions/master/be/objective-c.html#apple_binary
在bazel的0.15版本non_propagated_deps这个属性被删除了.而我的bazel版本为0.15.2
解决办法:
需要升级Apple规则。在新的Bazel版本下但是使用的rulers_apple是旧的就会报这个错.
需要将rulers_apple升级到了0.6.0
下一篇:[bazel]-tulsi的使用