bazel 链接_[bazel]-bazel的使用

本文详细介绍了如何使用Bazel构建iOS应用,包括安装Bazel、创建WORKSPACE和BUILD文件、配置规则,以及解决编译过程中的问题。适用于开发者熟悉Bazel在iOS项目中的应用。
摘要由CSDN通过智能技术生成

Change log

目录

一.是什么

二.安装

官网有安装教程.提供了三种安装方式.下面的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的时候做的事情.

以下只是结合实践并翻译官方文档而已.

step1: Create a WORKSPACE file

创建GXShell壳文件夹.

在GXShell文件夹下创建WORKSPACE文件

1.每个工作控件必须有一个命名为WORKSPACE的文件

2.并且需在根目录下.

目录如下:

543ced50a566

image.png

step2: Update the WORKSPACE file

在WORKSPACE文件里我们需要依赖rules_apple和bazel-skylib两个包

rules_apple: 作用是帮你编译苹果设备的软件.最好依赖他的最新Tag

在这里查看最新Tag号: https://github.com/bazelbuild/rules_apple/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等源文件.

现在这些都需要我们手动创建了.

543ced50a566

image.png

可以先通过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文件.

543ced50a566

image.png

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上了.

543ced50a566

image.png

附录一:

问题:

apple_binary:'apple_binary'规则中没有这样的属性'non_propagated_deps'

我的BUILD文件中并没有任何此类属性。

543ced50a566

image.png

在bazel的0.15版本non_propagated_deps这个属性被删除了.而我的bazel版本为0.15.2

543ced50a566

image.png

解决办法:

需要升级Apple规则。在新的Bazel版本下但是使用的rulers_apple是旧的就会报这个错.

需要将rulers_apple升级到了0.6.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值