在單一儲存庫中工作最強大的方面之一是能夠在套件/團隊/層次結構之間共用程式碼。在這篇文章中,我將嘗試解釋一個非常簡單的現實世界場景
範例場景
想像一下,您想要開發一個函式庫來顯示以兆位元組為單位的檔案大小,您認為這可能對您的 monorepo 的其他部分有用。該函式庫接受整數大小(例如:2048 位元組),並且可以傳回人性化字串(例如:2 MB)。為了增加一些品質保證,我們還將為其編寫一個測試。
Bazel 如何實作程式碼共享?
從上面的場景我們知道,我們需要將此函數開發為共享庫,然後由另一個套件導入以供使用。 Bazel 允許我們在庫中定義函數並將其匯出到需要它的其他服務,從而使這變得非常簡單。正如我之前在本文底部連結的文章中所解釋的,我們還可以控制哪些其他函式庫也可以匯入它以供使用。
讓我們開始編碼
出於程式碼組織的目的,我們將在工作區的根目錄下有一個庫目錄,其中有一個名為 humanize_filesize 的子目錄,我們將在其中編寫庫代碼。
讓我們在 humanize_filesize.go 中寫一些非常基本的 Go 程式碼
package humanize_filesize import "fmt" // GetHumanizedFilesize takes size_in_bytes as an int32 pointer and returns the size in megabytes. func GetHumanizedFilesize(size_in_bytes *int32) string { if size_in_bytes != nil { size_in_megabytes := float64(*size_in_bytes) / (1024 * 1024) return fmt.Sprintf("%.4f MB", size_in_megabytes) } return "0 MB" }
此程式碼僅將 int32 作為輸入,並傳回計算出的 4 位十進位精度的可讀兆位元組字串
這個功能絕對不全面,絕對可以改進,但這不是這次練習的重點。
還要斷言我們的邏輯按預期工作,我們將在名為 humanize_filesize_test.go 的文件中添加一個非常基本的測試以及 go 代碼
package humanize_filesize import ( "testing" ) func TestHumanizeFilesize(t *testing.T) { tests := []struct { name string size_in_bytes *int32 expected string }{ { name: "nil bytes", size_in_bytes: nil, expected: "0 MB", }, { name: "2048 bytes", size_in_bytes: int32Ptr(2048), expected: "0.0020 MB", }, { name: "0 bytes", size_in_bytes: int32Ptr(0), expected: "0.0000 MB", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result := GetHumanizedFilesize(tt.size_in_bytes) if result != tt.expected { t.Errorf("expected %s, got %s", tt.expected, result) } }) } } func int32Ptr(n int32) *int32 { return &n }
一個非常簡單的測試,以 nil、int32 和 0 作為輸入進行基本測試
現在是如何匯出此函數的有趣部分,以便可以將其匯入到其他套件或服務中。這是我們必須定義 BUILD.bazel 檔案的地方。
load("@rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "humanize_filesize", srcs = ["humanize_filesize.go"], importpath = "basil/libraries/humanize_filesize", visibility = ["//visibility:public"], ) go_test( name = "humanize_filesize_test", srcs = ["humanize_filesize_test.go"], embed = [":humanize_filesize"], )
在這裡我們定義了兩個主要規則。一個用於實際庫,一個用於我們編寫的測試文件。
go_library 定義目標 humanize_filesize 使用 humanize_filesize.go 作為其來源之一,可以透過 importpath 中指定的路徑導入,並且它在工作區中公開可見,可供其他套件導入。我們將在以後的帖子中學習如何控制可見性。
go_test 定義了一個測試目標,其中嵌入了 go_library 輸出中的程式碼。
此時我們應該能夠透過運行我們的測試套件來測試庫,如下所示
bazel build //... && bazel run //libraries/ humanize_filesize: humanize_filesize_test
您應該可以看到如下所示的測試輸出,表示所有測試都已通過。
package humanize_filesize import "fmt" // GetHumanizedFilesize takes size_in_bytes as an int32 pointer and returns the size in megabytes. func GetHumanizedFilesize(size_in_bytes *int32) string { if size_in_bytes != nil { size_in_megabytes := float64(*size_in_bytes) / (1024 * 1024) return fmt.Sprintf("%.4f MB", size_in_megabytes) } return "0 MB" }
?哇喔! ! ! ?現在我們知道我們的圖書館正在按預期運作。
現在讓我們在 services 目錄中的服務 service1 中使用這個庫,我們將使用以下 go 程式碼和 BUILD.bazel 檔案在工作區的根目錄中建立該目錄。
service1.go
package humanize_filesize import ( "testing" ) func TestHumanizeFilesize(t *testing.T) { tests := []struct { name string size_in_bytes *int32 expected string }{ { name: "nil bytes", size_in_bytes: nil, expected: "0 MB", }, { name: "2048 bytes", size_in_bytes: int32Ptr(2048), expected: "0.0020 MB", }, { name: "0 bytes", size_in_bytes: int32Ptr(0), expected: "0.0000 MB", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result := GetHumanizedFilesize(tt.size_in_bytes) if result != tt.expected { t.Errorf("expected %s, got %s", tt.expected, result) } }) } } func int32Ptr(n int32) *int32 { return &n }
BUILD.bazel
load("@rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "humanize_filesize", srcs = ["humanize_filesize.go"], importpath = "basil/libraries/humanize_filesize", visibility = ["//visibility:public"], ) go_test( name = "humanize_filesize_test", srcs = ["humanize_filesize_test.go"], embed = [":humanize_filesize"], )
Go 程式碼非常簡單,它會導入我們先前聲明的函式庫,並使用我們庫中的 GetHumanizedFilesize 函數,傳遞一個隨機整數值並列印輸出。
現在,當執行 bazel build //services/service1 時,bazel 將解析我們目標的所有依賴項,包括我們開發和建置它們的程式庫。
service1 現在可以使用 bazel run //services/service1 執行,因為我們只定義了一個二進位目標。如果您有多個二進位目標,例如:serviceX,您可以使用 bazel run //services/service1:serviceX 來執行目標。預設情況下,當不指定目標時,bazel 將始終嘗試尋找與目錄同名的二進位目標並執行它。
那麼...就這樣吧。我們已經製作了您的第一個共享庫,可供我們 monorepo 的其他部分使用。
此範例的所有程式碼都可以在 https://github.com/nixclix/basil/pull/3/commits/61c673b8757860bd5e60eb2ab6c35f3f4da78c87
如果您喜歡這篇文章的內容,請隨時分享。另外,請訂閱並留下評論,表達您對這篇文章的看法,以及您是否希望看到我改進的地方。
以上是monorepo 中共享庫的實際範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

goisidealforbuildingscalablesystemsduetoitssimplicity,效率和建築物內currencysupport.1)go'scleansyntaxandaxandaxandaxandMinimalisticDesignenhanceProductivityAndRedCoductivityAndRedCuceErr.2)ItSgoroutinesAndInesAndInesAndInesAndineSandChannelsEnablenableNablenableNableNablenableFifficConcurrentscorncurrentprogragrammentworking torkermenticmminging

Initfunctionsingorunautomationbeforemain()andareusefulforsettingupenvorments和InitializingVariables.usethemforsimpletasks,避免使用輔助效果,andbecautiouswithTestingTestingTestingAndLoggingTomaintAnainCodeCodeCodeClarityAndTestesto。

goinitializespackagesintheordertheordertheyimported,thenexecutesInitFunctionswithinApcageIntheirdeFinityOrder,andfilenamesdetermineTheOrderAcractacractacrosmultiplefiles.thisprocessCanbeCanbeinepessCanbeInfleccessByendercrededBydeccredByDependenciesbetenciesbetencemendencenciesbetnependendpackages,whermayleLeadtocomplexinitialitialializizesizization

CustomInterfacesingoarecrucialforwritingFlexible,可維護,andTestableCode.TheyEnableDevelostOverostOcusonBehaviorBeiroveration,增強ModularityAndRobustness.byDefiningMethodSigntulSignatulSigntulSignTypaterSignTyperesthattypesmustemmustemmustemmustemplement,InterfaceSallowForCodeRepodEreusaperia

使用接口進行模擬和測試的原因是:接口允許定義合同而不指定實現方式,使得測試更加隔離和易於維護。 1)接口的隱式實現使創建模擬對像變得簡單,這些對像在測試中可以替代真實實現。 2)使用接口可以輕鬆地在單元測試中替換服務的真實實現,降低測試複雜性和時間。 3)接口提供的靈活性使得可以為不同測試用例更改模擬行為。 4)接口有助於從一開始就設計可測試的代碼,提高代碼的模塊化和可維護性。

在Go中,init函數用於包初始化。 1)init函數在包初始化時自動調用,適用於初始化全局變量、設置連接和加載配置文件。 2)可以有多個init函數,按文件順序執行。 3)使用時需考慮執行順序、測試難度和性能影響。 4)建議減少副作用、使用依賴注入和延遲初始化以優化init函數的使用。

go'SselectStatementTreamLinesConcurrentProgrambyMultiplexingOperations.1)itallowSwaitingOnMultipleChannEloperations,執行thefirstreadyone.2)theDefirstreadyone.2)thedefefcasepreventlocksbysbysbysbysbysbythoplocktrograpraproxrograpraprocrecrecectefnoopeready.3)

contextancandwaitgroupsarecrucialingoformanaginggoroutineseflect.1)context contextsallowsAllowsAllowsAllowsAllowsAllingCancellationAndDeadLinesAcrossapibiboundaries,確保GoroutinesCanbestoppedGrace.2)WaitGroupsSynChronizeGoroutines,確保Allimizegoroutines,確保AllizeNizeGoROutines,確保AllimizeGoroutines


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器