Bazel研究一:運(yùn)行HelloWorld

前言

源碼: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的名稱,會(huì)生成一個(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的名稱,會(huì)生成一個(gè)xxx.xcodeproj的文件
bazel run //HelloOC:my_xcodeproj

四、截圖:

整體結(jié)構(gòu)如下:


image.png

運(yùn)行效果:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容