最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何使用Bazel構(gòu)建Golang程序

 更新時間:2023年01月26日 12:37:53   作者:喵個咪  
這篇文章主要為大家介紹了如何使用Bazel構(gòu)建Golang程序?qū)嵗斀?,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

使用Bazel構(gòu)建Golang程序

在這篇簡短的文章中,我們將介紹如何將 Golang 與 Bazel 構(gòu)建系統(tǒng)結(jié)合使用。

具體來說,我們將討論三個場景:

  • 從頭開始一個 Golang 項目;
  • 將一個現(xiàn)有的 Golang 項目轉(zhuǎn)換為 Bazel 構(gòu)建;
  • 以及將一個第三方 Golang 項目引入到您的 Bazel 構(gòu)建系統(tǒng)。

從頭開始一個 Golang 項目

讓我們從將 Go 與 Bazel 結(jié)合使用的基礎(chǔ)知識開始。

為此,我們需要從 github.com/bazelbuild/… 獲取 Go 語言的官方構(gòu)建規(guī)則。

在配置部分,您會發(fā)現(xiàn):我們需要將以下這段 Starlark 語言代碼,放入名為 WORKSPACE 的配置文件里面:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "io_bazel_rules_go",
    sha256 = "8e968b5fcea1d2d64071872b12737bbb5514524ee5f0a4f54f5920266c261acb",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.28.0/rules_go-v0.28.0.zip",
        "https://github.com/bazelbuild/rules_go/releases/download/v0.28.0/rules_go-v0.28.0.zip",
    ],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
go_rules_dependencies()
go_register_toolchains(version = "1.16.5")

讓我們逐步了解這段代碼所做的事情。

首先,我們使用load指令來加載并提取新功能,以在 Bazel 文件當中能夠使用該功能。我們調(diào)用了兩次load指令,第一次用于導入下載 HTTP 代碼庫的能力,第二次則是從剛下載的代碼庫中加載特定于 Go 的命令。

對于導入本身,我們需要提供一個導入名稱。通常的命名方案是:逆反域名,后面跟命名空間和項目名稱;并需將/.全部都轉(zhuǎn)換為下劃線_。例如:github.com/user/project變成com_github_user_projectio_bazel_rules_go這個項目由于是Bazel官方項目中的一部分,所以它使用的是bazel.io而不是github.com。

如果您并不熟悉 Bazel,那么,您需要了解到:實際的構(gòu)建配置是通過BUILD文件完成的。我們可以將 Go 視為任何其他語言,并使用遵循相同結(jié)構(gòu)的規(guī)則:go_binary、go_librarygo_test。我在我的 Github 上準備了一個最小化的例子:github.com/HappyCerber…。您會注意到,我們需要從導入的io_bazel_rules_go代碼庫中加載這些規(guī)則,以使其在BUILD文件中可用。

將現(xiàn)有項目轉(zhuǎn)換為 Bazel 構(gòu)建

現(xiàn)在我們知道,從頭全新開始是很容易。但是,如果您已經(jīng)有一個 Golang 項目,并且需要將其轉(zhuǎn)換為 使用 Bazel 構(gòu)建怎么辦?為此,我們需要使用 Bazel 官方項目中提供的另一個工具 Gazelle ( github.com/bazelbuild/… )。

為了演示,我將使用一個第三方項目 ( github.com/aler9/rtsp-… ),我目前正在為即將到來的系統(tǒng)設(shè)計課程修改該項目。

首先,我們需要創(chuàng)建一個WORKSPACE文件,并從 Gazelle 代碼庫的設(shè)置部分復制粘貼代碼。

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "io_bazel_rules_go",
    sha256 = "8e968b5fcea1d2d64071872b12737bbb5514524ee5f0a4f54f5920266c261acb",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.28.0/rules_go-v0.28.0.zip",
        "https://github.com/bazelbuild/rules_go/releases/download/v0.28.0/rules_go-v0.28.0.zip",
    ],
)
http_archive(
    name = "bazel_gazelle",
    sha256 = "62ca106be173579c0a167deb23358fdfe71ffa1e4cfdddf5582af26520f1c66f",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz",
        "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz",
    ],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
go_rules_dependencies()
go_register_toolchains(version = "1.16.5")
gazelle_dependencies()

您會注意到,上述代碼也導入了上一節(jié)中所提到的規(guī)則。

現(xiàn)在,要真正運行 Gazelle,我們需要將以下代碼添加到我們的主BUILD文件中:

load("@bazel_gazelle//:def.bzl", "gazelle")
# gazelle:prefix github.com/aler9/rtsp-simple-server 
gazelle(name = "gazelle")

gazelle:prefix注釋后面的路徑是整個項目所使用的 Go 導入路徑。例如,main.go中有以下包的導入:

import (
    "os"
    "github.com/aler9/rtsp-simple-server/internal/core"
)

至此,我們終于可以真正運行Gazelle,讓它BUILD為我們的項目生成文件了。

bazel run //:gazelle

之后,我們應該BUILD自動生成項目的所有文件:

git status
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 BUILD
 WORKSPACE
 bazel-bin
 bazel-out
 bazel-test
 bazel-testlogs
 internal/aac/BUILD.bazel
 internal/conf/BUILD.bazel
 internal/confenv/BUILD.bazel
 internal/confwatcher/BUILD.bazel
 internal/core/BUILD.bazel
 internal/externalcmd/BUILD.bazel
 internal/h264/BUILD.bazel
 internal/hls/BUILD.bazel
 internal/logger/BUILD.bazel
 internal/rlimit/BUILD.bazel
 internal/rtcpsenderset/BUILD.bazel
 internal/rtmp/BUILD.bazel
nothing added to commit but untracked files present (use "git add" to track)

但是,如果您嘗試使用bazel build //...命令構(gòu)建項目,實際上您會看到許多關(guān)于未定義代碼庫的錯誤。這是因為我們?nèi)匀蝗鄙夙椖恳蕾図椀亩x。然而,Gazelle 連這件事也可以為我們辦好(to_macro參數(shù)是可選的):

bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=deps.bzl%go_dependencies

此命令將生成一個文件名為deps.bzl的新文件(如果我們在WORKSPACE中有使用repository_macro指令定義過,那么我們省略該to_macro指令),加載該文件,以導入構(gòu)建項目所需的所有代碼庫。

load("@bazel_gazelle//:deps.bzl", "go_repository")
def go_dependencies():
    go_repository(
        name = "com_github_alecthomas_template",
        importpath = "github.com/alecthomas/template",
        sum = "h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=",
        version = "v0.0.0-20190718012654-fb15b899a751",
    )
    go_repository(
        name = "com_github_alecthomas_units",
        importpath = "github.com/alecthomas/units",
        sum = "h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=",
        version = "v0.0.0-20190924025748-f65c72e2690d",
    )
    go_repository(
        name = "com_github_aler9_gortsplib",
        importpath = "github.com/aler9/gortsplib",
        sum = "h1:Bf0hzdN1jUWsb5Mzezq1pd18EIBeKXxk5clIpHZJ1Lk=",
        version = "v0.0.0-20210724151831-dae5a1f04033",
    )
    go_repository(
...

在這個代碼庫里,我實際上遇到了一個小問題。構(gòu)建仍然是失敗的,因為它導入的org_golang_x_tools被錯誤地推斷為依賴項(通過從deps.bzl中刪除它來修復這個問題)。您可以在我的項目分支:github.com/HappyCerber…上看到rtsp-simple-server的最終結(jié)果。

您可以在后續(xù)繼續(xù)使用 Gazelle 來管理依賴項,這也是您可以將代碼庫引入基于 Bazel 的項目而無需實際轉(zhuǎn)換它的方法:

bazel run //:gazelle -- update-repos github.com/some/repo

密封測試(Hermetic tests)

您可能會遇到的最后一個問題是密封測試。如果您看到測試因訪問被拒絕、文件未找到或操作不允許失敗而失敗,那是因為 Bazel 強制執(zhí)行密封測試。這意味著每個測試都必須完全獨立并且獨立于任何其他測試。

對于單元測試,任何文件都需要作為測試的依賴項提供并通過運行文件機制訪問(github.com/bazelbuild/…)。

環(huán)境變量中提供了每個測試的臨時目錄,您將使用TEST_TMPDIR而不是傳統(tǒng)的os.TempDir()函數(shù)。

密封集成和系統(tǒng)測試需要從一開始就仔細設(shè)計,因此轉(zhuǎn)換現(xiàn)有的此類測試可能很棘手。遺憾的是,我在這里沒有放之四海而皆準的建議。

雖然將您的測試轉(zhuǎn)換為密封測試可能很煩人,但這是一項值得的努力,它將為您帶來更好的測試可重復性和更低的易碎性。

原文 翻譯自:Golang With Bazel

以上就是詳解如何使用Bazel構(gòu)建Golang程序的詳細內(nèi)容,更多關(guān)于Bazel構(gòu)建Golang程序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談Go1.18中的泛型編程

    淺談Go1.18中的泛型編程

    本文主要介紹了Go1.18中的泛型編程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言panic和recover的用法實例

    Go語言panic和recover的用法實例

    panic()和recover()是Go語言中用于處理錯誤的兩個重要函數(shù),本文主要介紹了Go語言panic和recover的用法實例,panic()用于中止程序并引發(fā)panic,而recover()用于捕獲panic并恢復程序的執(zhí)行,感興趣的可以了解一下
    2024-01-01
  • Go gRPC超時控制Deadlines用法詳解

    Go gRPC超時控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • go select編譯期的優(yōu)化處理邏輯使用場景分析

    go select編譯期的優(yōu)化處理邏輯使用場景分析

    select 是 Go 中的一個控制結(jié)構(gòu),類似于用于通信的 switch 語句。每個 case 必須是一個通信操作,要么是發(fā)送要么是接收。接下來通過本文給大家介紹go select編譯期的優(yōu)化處理邏輯使用場景分析,感興趣的朋友一起看看吧
    2021-06-06
  • Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明

    Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明

    這篇文章主要介紹了Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go 語言中的select語句詳解及工作原理

    Go 語言中的select語句詳解及工作原理

    在Go語言中,select語句是用于處理多個通道(channel)操作的一種控制結(jié)構(gòu),它類似于 switch 語句,本文給大家介紹Go 語言中的select語句詳解及工作原理,感興趣的朋友一起看看吧
    2025-04-04
  • 基于gin的golang web開發(fā)之認證利器jwt

    基于gin的golang web開發(fā)之認證利器jwt

    這篇文章主要介紹了基于gin的golang web開發(fā)之認證利器jwt,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 使用Golang創(chuàng)建單獨的WebSocket會話

    使用Golang創(chuàng)建單獨的WebSocket會話

    WebSocket是一種在Web開發(fā)中非常常見的通信協(xié)議,它提供了雙向、持久的連接,適用于實時數(shù)據(jù)傳輸和實時通信場景,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,包括建立連接、消息傳遞和關(guān)閉連接等操作,需要的朋友可以參考下
    2023-12-12
  • go語言中的json與map相互轉(zhuǎn)換實現(xiàn)

    go語言中的json與map相互轉(zhuǎn)換實現(xiàn)

    本文主要介紹了go語言中的json與map相互轉(zhuǎn)換實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Go+Redis實現(xiàn)延遲隊列實操

    Go+Redis實現(xiàn)延遲隊列實操

    這篇文章主要介紹了Go+Redis實現(xiàn)延遲隊列實操,延遲隊列是一種非常使用的數(shù)據(jù)結(jié)構(gòu),我們經(jīng)常有需要延遲推送處理消息的場景,比如延遲60秒發(fā)送短信,延遲30分鐘關(guān)閉訂單,消息消費失敗延遲重試等
    2022-09-09

最新評論

龙江县| 石狮市| 苗栗市| 布尔津县| 五华县| 二连浩特市| 张掖市| 资中县| 鹤庆县| 剑河县| 肇源县| 灵台县| 大英县| 缙云县| 富阳市| 海丰县| 抚顺县| 古蔺县| 麦盖提县| 虞城县| 囊谦县| 兴海县| 玉田县| 兴城市| 莱州市| 赤壁市| 永福县| 如东县| 长泰县| 慈利县| 三门峡市| 息烽县| 台湾省| 贵阳市| 馆陶县| 卫辉市| 利辛县| 临江市| 娄底市| 宜良县| 阜康市|