前言
源碼:https://github.com/h42330789/StudyBazel
一直想研究Telegram的源碼沦零,下載下來按步驟能正常在模擬器運(yùn)行,想使用
LookIn
這個(gè)工具研究下疾渴,方便查看研究搞坝,發(fā)現(xiàn)Telegram是使用Bazel
管理的大門桩撮,不知道如何集成LookIn店量,特研究學(xué)習(xí)下Bazel
一鞠呈、安裝Bzael
參考:
在 macOS 上安裝 Bazel
Bazel教程:構(gòu)建iOS應(yīng)用[翻譯]
基于 Bazel 的 iOS Monorepo 工程實(shí)踐
Bazel iOS Hello World (Objective-C, Mac M1)
Build an iOS Framework (Objective-C) by Bazel
https://github.com/deeplearningmakeeasy/bazelioshelloworld
https://medium.com/@DeepLearningMakeEasy
# 使用brew安裝 bazel
brew install bazel
# 查看bazel版本
bazel --version
二旱爆、準(zhǔn)備一個(gè)空項(xiàng)目HelloOC
2.1 使用Xcode創(chuàng)建一個(gè)HelloOC的項(xiàng)目,然后刪掉配置文件后控,只保留源碼文件
2.2 在HelloOC同層文件夾下創(chuàng)建WORKSPACE
文件浩淘,內(nèi)容如下:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
# rules required for ios-app
http_archive(
name = "build_bazel_rules_apple",
sha256 = "cd3b62efed8eaf306050817205d5139de3189be422ee009038783c3da0b04483",
strip_prefix = "rules_apple-5b7c929ec4f3618a3f558c7ccae64f155f2646b7",
url = "https://github.com/bazelbuild/rules_apple/archive/5b7c929ec4f3618a3f558c7ccae64f155f2646b7.tar.gz",
)
load(
"@build_bazel_rules_apple//apple:repositories.bzl",
"apple_rules_dependencies",
)
apple_rules_dependencies()
load(
"@build_bazel_rules_swift//swift:repositories.bzl",
"swift_rules_dependencies",
)
swift_rules_dependencies()
load(
"@build_bazel_rules_swift//swift:extras.bzl",
"swift_rules_extra_dependencies",
)
swift_rules_extra_dependencies()
load(
"@build_bazel_apple_support//lib:repositories.bzl",
"apple_support_dependencies",
)
apple_support_dependencies()
# rules required by ios-app Xcode integration
http_archive(
name = "rules_xcodeproj",
sha256 = "7967b372bd1777214ce65c87a82ac0630150b7504b443de0315ea52e45758e0c",
url = "https://github.com/MobileNativeFoundation/rules_xcodeproj/releases/download/1.3.3/release.tar.gz",
)
load(
"@rules_xcodeproj//xcodeproj:repositories.bzl",
"xcodeproj_rules_dependencies",
)
xcodeproj_rules_dependencies()
# rules required by backend
http_archive(
name = "io_bazel_rules_appengine",
strip_prefix = "rules_appengine-03121ae8efa634f7219f53970650a4445a72b759",
# TODO: update to a release version that contains 339f6aba67fcedb7268cf54d1163cf7704a277ca.
# This commit fixes the Maven artifact URLs to use "https" instead of "http".
# We don't specify sha256, because the sha256 of GitHub-served non-release archives isn't
# stable.
urls = ["https://github.com/bazelbuild/rules_appengine/archive/03121ae8efa634f7219f53970650a4445a72b759.tar.gz"],
)
load(
"@io_bazel_rules_appengine//appengine:java_appengine.bzl",
"java_appengine_repositories",
)
2.3
在HelloOC里創(chuàng)建BUILD
文件吴攒,內(nèi)如如下:
# load ios application rule
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
# load build in objc_library rule
load("@rules_cc//cc:defs.bzl", "objc_library")
load(
"@rules_xcodeproj//xcodeproj:defs.bzl",
"top_level_target",
"xcodeproj",
)
# 源代碼的庫
objc_library(
# 名字隨意取
name = "HelloWorldOC_source",
srcs = [
# 這里可以全部單獨(dú)列出來张抄,也可以使用*.m這樣的通配符方式
"Source/AppDelegate.m",
"Source/SceneDelegate.m",
"Source/ViewController.m",
"Source/main.m",
],
hdrs = glob(["Source/*.h"]),
# 資源文件
data = [
"Source/Base.lproj/Main.storyboard",
"Source/Base.lproj/LaunchScreen.storyboard",
],
deps = []
)
# 生成ipa,bazel build //BUILD所在文件夾名稱:ios_application的名稱
# bazel build //HelloOC:My-HelloOC-app
# 模擬器運(yùn)行洼怔,bazel run //BUILD所在文件夾名稱:ios_application的名稱
# bazel run //HelloOC:My-HelloOC-app
ios_application(
# 名字隨便起署惯,用于生成ipa使用
name = "My-HelloOC-app",
# 這個(gè)bundle_id一定要與Info.plist里的一致
bundle_id = "studyBazel.helloOC.aa",
# 支持的版本
families = [
"iphone",
"ipad",
],
infoplists = ["Source/Info.plist"],
launch_storyboard = "Source/Base.lproj/LaunchScreen.storyboard",
app_icons = glob(["Source/Assets.xcassets/AppIcon.appiconset/*.png"])
+ glob(["Source/Assets.xcassets/AppIcon.appiconset/*.json"]),
# 支持的iOS最小版本
minimum_os_version = "13.0",
# provisioning_profile = "<your_profile_name>.mobileprovision", # Uncomment and set your own profile.
visibility = ["http://visibility:public"],
# 依賴的源代碼
deps = [":HelloWorldOC_source"],
)
# 這里是為了生存Xcodeproj文件
# bazel run //BUILD所在文件夾名稱:xcodeproj的名稱,會生成一個(gè)xxx.xcodeproj的文件
# bazel run //HelloOC:my_xcodeproj
xcodeproj(
name = "my_xcodeproj",
build_mode = "bazel",
# 生成的xxx.codeproj的名稱
project_name = "My_helloOC",
tags = ["manual"],
top_level_targets = [
top_level_target(
# 要與ios_application里定義的名字一樣
":My-HelloOC-app",
target_environments = ["simulator"],
),
],
)
三镣隶、運(yùn)行命令:
# 生成ipa极谊,bazel build //BUILD所在文件夾名稱:ios_application的名稱
bazel build //HelloOC:My-HelloOC-app
# 模擬器運(yùn)行,bazel run //BUILD所在文件夾名稱:ios_application的名稱
bazel run //HelloOC:My-HelloOC-app
# 生成xcode項(xiàng)目
# bazel run //BUILD所在文件夾名稱:xcodeproj的名稱安岂,會生成一個(gè)xxx.xcodeproj的文件
bazel run //HelloOC:my_xcodeproj
四轻猖、截圖:
整體結(jié)構(gòu)如下:
運(yùn)行效果: