รายชื่อผู้รับจดหมาย: bazel-go-discuss
หย่อน: #ไปต่อ Bazel Slack #bazel ไปหย่อน
กฎอยู่ในขั้นเบต้าของการพัฒนา พวกเขาสนับสนุน:
ขณะนี้พวกเขาไม่สนับสนุนหรือให้การสนับสนุนอย่างจำกัดสำหรับ:
กฎ Go ได้รับการทดสอบและรองรับบนแพลตฟอร์มโฮสต์ต่อไปนี้:
ผู้ใช้ได้รายงานความสำเร็จบนแพลตฟอร์มอื่น ๆ หลายแห่ง แต่มีการทดสอบกฎเฉพาะในรายการด้านบนเท่านั้น
หมายเหตุ: ตั้งแต่เวอร์ชัน v0.38.0 เป็นต้นไป Rules_go ต้องใช้ Bazel ≥ 5.4.0 จึงจะทำงานได้
รับประกันว่าสาขา master
จะทำงานกับ Bazel เวอร์ชันล่าสุดเท่านั้น
ในการสร้างโค้ด Go ด้วย Bazel คุณจะต้อง:
patch
, cat
และเครื่องมือ Unix อื่นๆ อีกจำนวนหนึ่งใน PATH
โดยปกติคุณไม่จำเป็นต้องติดตั้ง Go toolchain Bazel จะดาวน์โหลดอันหนึ่ง
โปรดดูคำแนะนำในการตั้งค่าเฉพาะของ Windows โดยใช้ Rules_go บน Windows จำเป็นต้องติดตั้งและกำหนดค่าเครื่องมือเพิ่มเติมหลายอย่าง
หากคุณใช้ Bzlmod ระบบการจัดการการพึ่งพาภายนอกใหม่ของ Bazel โปรดดูคู่มือ Go with Bzlmod เฉพาะแทน
สร้างไฟล์ที่ด้านบนของพื้นที่เก็บข้อมูลชื่อ WORKSPACE
และเพิ่มข้อมูลโค้ดด้านล่าง (หรือเพิ่มลงใน WORKSPACE
ที่มีอยู่) สิ่งนี้บอกให้ Bazel ดึงข้อมูล Rules_go และการขึ้นต่อกัน Bazel จะดาวน์โหลด Go toolchain ที่รองรับล่าสุดและลงทะเบียนเพื่อใช้งาน
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
http_archive (
name = "io_bazel_rules_go" ,
integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=" ,
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip" ,
"https://github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip" ,
],
)
load ( "@io_bazel_rules_go//go:deps.bzl" , "go_register_toolchains" , "go_rules_dependencies" )
go_rules_dependencies ()
go_register_toolchains ( version = "1.23.1" )
คุณสามารถใช้ Rules_go ที่ master
โดยใช้ git_repository แทน http_archive และชี้ไปที่การคอมมิตล่าสุด
เพิ่มไฟล์ชื่อ BUILD.bazel
ในไดเร็กทอรีรากของโปรเจ็กต์ของคุณ คุณจะต้องมีไฟล์บิลด์ในแต่ละไดเร็กทอรีที่มีโค้ด Go แต่คุณจะต้องมีไฟล์ในไดเร็กทอรีรากด้วย แม้ว่าโปรเจ็กต์ของคุณจะไม่มีโค้ด Go ก็ตาม สำหรับไบนารี่ "Hello, world" ไฟล์ควรมีลักษณะดังนี้:
load ( "@io_bazel_rules_go//go:def.bzl" , "go_binary" )
go_binary (
name = "hello" ,
srcs = [ "hello.go" ],
)
คุณสามารถสร้างเป้าหมายนี้ได้ด้วย bazel build //:hello
หากโปรเจ็กต์ของคุณสามารถสร้างด้วย go build
คุณสามารถสร้างและอัปเดตไฟล์บิลด์ของคุณโดยอัตโนมัติโดยใช้ gazelle
เพิ่มที่เก็บ bazel_gazelle
และการขึ้นต่อกันใน WORKSPACE
ของคุณ มันควรมีลักษณะเช่นนี้:
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" ) http_archive ( name = "io_bazel_rules_go" , integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=" , urls = [ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip" , "https://github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip" , ], ) http_archive ( name = "bazel_gazelle" , integrity = "sha256-12v3pg/YsFBEQJDfooN6Tq+YKeEWVhjuNdzspcvfWNU=" , urls = [ "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz" , "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.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.23.1" ) gazelle_dependencies ()
เพิ่มโค้ดด้านล่างลงในไฟล์ BUILD.bazel
ในไดเร็กทอรีรากของโปรเจ็กต์ของคุณ แทนที่สตริงหลัง prefix
ด้วยคำนำหน้าเส้นทางการนำเข้าที่ตรงกับโปรเจ็กต์ของคุณ ควรเหมือนกับเส้นทางโมดูลของคุณ หากคุณมีไฟล์ go.mod
load ( "@bazel_gazelle//:def.bzl" , "gazelle" )
# gazelle:prefix github.com/example/project
gazelle ( name = "gazelle" )
นี่เป็นการประกาศกฎไบนารีของ gazelle
ซึ่งคุณสามารถรันได้โดยใช้คำสั่งด้านล่าง:
bazel run //:gazelle
สิ่งนี้จะสร้างไฟล์ BUILD.bazel
พร้อมเป้าหมาย go_library, go_binary และ go_test สำหรับแต่ละแพ็คเกจในโปรเจ็กต์ของคุณ คุณสามารถรันคำสั่งเดียวกันนี้ได้ในอนาคตเพื่ออัพเดตไฟล์บิลด์ที่มีอยู่ด้วยไฟล์ต้นฉบับ การขึ้นต่อกัน และตัวเลือกใหม่
หากโปรเจ็กต์ของคุณไม่เป็นไปตามแบบแผน go build
หรือคุณไม่ต้องการใช้ gazelle คุณสามารถเขียนไฟล์ build ด้วยมือได้
ในแต่ละไดเร็กทอรีที่มีโค้ด Go ให้สร้างไฟล์ชื่อ BUILD.bazel
เพิ่มคำสั่ง load
ที่ด้านบนของไฟล์สำหรับกฎที่คุณใช้
load ( "@io_bazel_rules_go//go:def.bzl" , "go_binary" , "go_library" , "go_test" )
สำหรับแต่ละไลบรารี ให้เพิ่มกฎ go_library เหมือนด้านล่างนี้ ไฟล์ต้นฉบับแสดงอยู่ในแอตทริบิวต์ srcs
แพ็กเกจที่นำเข้านอกไลบรารีมาตรฐานจะแสดงรายการอยู่ในแอตทริบิวต์ deps
โดยใช้ป้ายกำกับ Bazel ที่อ้างถึงกฎ go_library ที่เกี่ยวข้อง ต้องระบุเส้นทางการนำเข้าของไลบรารีด้วยแอตทริบิวต์ importpath
go_library (
name = "foo_library" ,
srcs = [
"a.go" ,
"b.go" ,
],
importpath = "github.com/example/project/foo" ,
deps = [
"//tools" ,
"@org_golang_x_utils//stuff" ,
],
visibility = [ "//visibility:public" ],
)
สำหรับการทดสอบ ให้เพิ่มกฎ go_test เหมือนด้านล่างนี้ ไลบรารีที่กำลังทดสอบควรแสดงอยู่ในแอตทริบิวต์ embed
go_test (
name = "foo_test" ,
srcs = [
"a_test.go" ,
"b_test.go" ,
],
embed = [ ":foo_lib" ],
deps = [
"//testtools" ,
"@org_golang_x_utils//morestuff" ,
],
)
สำหรับไบนารี ให้เพิ่มกฎ go_binary เช่นเดียวกับกฎด้านล่าง
go_binary (
name = "foo" ,
srcs = [ "main.go" ],
)
สำหรับที่เก็บ Go แต่ละรายการ ให้เพิ่มกฎ go_repository ลงใน WORKSPACE
เช่นเดียวกับกฎด้านล่าง กฎนี้มาจากพื้นที่เก็บข้อมูล Gazelle ดังนั้นคุณจะต้องโหลดมัน gazelle update-repos สามารถสร้างหรืออัปเดตกฎเหล่านี้โดยอัตโนมัติจากไฟล์ go.mod หรือ Gopkg.lock
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
# Download the Go rules.
http_archive (
name = "io_bazel_rules_go" ,
integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=" ,
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip" ,
"https://github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip" ,
],
)
# Download Gazelle.
http_archive (
name = "bazel_gazelle" ,
integrity = "sha256-12v3pg/YsFBEQJDfooN6Tq+YKeEWVhjuNdzspcvfWNU=" ,
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz" ,
"https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz" ,
],
)
# Load macros and repository rules.
load ( "@io_bazel_rules_go//go:deps.bzl" , "go_register_toolchains" , "go_rules_dependencies" )
load ( "@bazel_gazelle//:deps.bzl" , "gazelle_dependencies" , "go_repository" )
# Declare Go direct dependencies.
go_repository (
name = "org_golang_x_net" ,
importpath = "golang.org/x/net" ,
sum = "h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=" ,
version = "v0.23.0" ,
)
# Declare indirect dependencies and register toolchains.
go_rules_dependencies ()
go_register_toolchains ( version = "1.23.1" )
gazelle_dependencies ()
หากต้องการสร้างโค้ดจากบัฟเฟอร์โปรโตคอล คุณจะต้องเพิ่มการพึ่งพา com_google_protobuf
ให้กับ WORKSPACE
ของคุณ
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
http_archive (
name = "com_google_protobuf" ,
sha256 = "535fbf566d372ccf3a097c374b26896fa044bf4232aef9cab37bd1cc1ba4e850" ,
strip_prefix = "protobuf-3.15.0" ,
urls = [
"https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v3.15.0.tar.gz" ,
"https://github.com/protocolbuffers/protobuf/archive/v3.15.0.tar.gz" ,
],
)
load ( "@com_google_protobuf//:protobuf_deps.bzl" , "protobuf_deps" )
protobuf_deps ()
คุณจะต้องลงทะเบียน toolchain C/C++ สำหรับแพลตฟอร์มการดำเนินการ (แพลตฟอร์มที่ Bazel ดำเนินการ) เพื่อสร้าง protoc
กฎ proto_library จัดเตรียมโดยที่เก็บ rules_proto
protoc-gen-go
ซึ่งเป็นปลั๊กอินคอมไพเลอร์ Go proto จัดทำโดยที่เก็บ com_github_golang_protobuf
ทั้งสองถูกประกาศโดย go_rules_dependencies คุณไม่จำเป็นต้องประกาศการขึ้นต่อกันอย่างชัดเจน เว้นแต่คุณต้องการใช้เวอร์ชันอื่นโดยเฉพาะ ดูการแทนที่การขึ้นต่อกันสำหรับคำแนะนำในการใช้เวอร์ชันอื่น
การขึ้นต่อกันของ gRPC จะไม่ถูกประกาศตามค่าเริ่มต้น (มีมากเกินไป) คุณสามารถประกาศได้ใน WORKSPACE โดยใช้ go_repository คุณอาจต้องการใช้ gazelle update-repos เพื่อนำเข้าจาก go.mod
ดูการพึ่งพา Proto การพึ่งพา gRPC สำหรับข้อมูลเพิ่มเติม ดูเพิ่มเติมที่ การหลีกเลี่ยงข้อขัดแย้ง
เมื่อลงทะเบียนการขึ้นต่อกันทั้งหมดแล้ว คุณสามารถประกาศกฎ proto_library และ go_proto_library เพื่อสร้างและคอมไพล์โค้ด Go จากไฟล์ .proto
load ( "@rules_proto//proto:defs.bzl" , "proto_library" )
load ( "@io_bazel_rules_go//proto:def.bzl" , "go_proto_library" )
proto_library (
name = "foo_proto" ,
srcs = [ "foo.proto" ],
deps = [ "//bar:bar_proto" ],
visibility = [ "//visibility:public" ],
)
go_proto_library (
name = "foo_go_proto" ,
importpath = "github.com/example/protos/foo_proto" ,
protos = [ ":foo_proto" ],
visibility = [ "//visibility:public" ],
)
เป้าหมาย go_proto_library
อาจถูกนำเข้าและขึ้นอยู่กับเช่นเดียวกับ go_library
ปกติ
โปรดทราบว่าเวอร์ชันล่าสุดของ Rules_go รองรับทั้ง APIv1 ( github.com/golang/protobuf
) และ APIv2 ( google.golang.org/protobuf
) ตามค่าเริ่มต้น รหัสจะถูกสร้างขึ้นด้วย github.com/golang/protobuf/cmd/protoc-gen-gen
เพื่อให้เข้ากันได้กับอินเทอร์เฟซทั้งสอง รหัสไคลเอ็นต์อาจนำเข้าโดยใช้ไลบรารีรันไทม์หรือทั้งสองอย่าง
ไป
บัฟเฟอร์โปรโตคอล
การพึ่งพาและการทดสอบ
ใช่ แต่ไม่ใช่โดยตรง
Rules_go เรียกใช้คอมไพเลอร์ Go และตัวเชื่อมโยงโดยตรง โดยยึดตามเป้าหมายที่อธิบายด้วย go_binary และกฎอื่นๆ Bazel และ Rules_go มีบทบาทเหมือนกับคำสั่ง go
ร่วมกัน ดังนั้นจึงไม่จำเป็นต้องใช้คำสั่ง go
ในพื้นที่ทำงาน Bazel
อย่างไรก็ตาม ยังคงเป็นความคิดที่ดีที่จะปฏิบัติตามแบบแผนที่กำหนดโดยคำสั่ง go
(เช่น หนึ่งแพ็คเกจต่อไดเร็กทอรี เส้นทางแพ็คเกจตรงกับเส้นทางไดเร็กทอรี) เครื่องมือที่เข้ากันไม่ได้กับ Bazel จะยังคงใช้งานได้ และโปรเจ็กต์ของคุณสามารถพึ่งพาโดยโปรเจ็กต์ที่ไม่ใช่ Bazel ได้
หากคุณจำเป็นต้องใช้คำสั่ง go
เพื่อทำงานที่ Bazel ไม่ครอบคลุม (เช่น การเพิ่มการพึ่งพาใหม่ให้กับ go.mod
) คุณสามารถใช้การร้องขอ Bazel ต่อไปนี้เพื่อเรียกใช้ไบนารี go
ของ Go SDK ที่กำหนดค่า Bazel ได้:
bazel run @io_bazel_rules_go//go -- < args >
ต้องการใช้สิ่งนี้มากกว่าการรัน go
โดยตรง เนื่องจากจะทำให้แน่ใจได้ว่าเวอร์ชันของ Go จะเหมือนกับเวอร์ชันที่ใช้โดย Rules_go
ใช่ แต่ไม่ใช่โดยตรง Bazel ละเว้นไฟล์ go.mod
และการขึ้นต่อกันของแพ็คเกจทั้งหมดจะต้องแสดงผ่านแอตทริบิวต์ deps
ในเป้าหมายที่อธิบายด้วย go_library และกฎอื่นๆ
คุณสามารถดาวน์โหลดโมดูล Go ในเวอร์ชันเฉพาะเป็นพื้นที่เก็บข้อมูลภายนอกได้โดยใช้ go_repository ซึ่งเป็นกฎพื้นที่ทำงานที่ Gazelle จัดเตรียมไว้ สิ่งนี้จะสร้างไฟล์บิลด์โดยใช้เนื้อทรายด้วย
คุณสามารถนำเข้ากฎ go_repository จากไฟล์ go.mod
โดยใช้ gazelle update-repos
ใช้เพื่อรักษาเส้นทางการนำเข้าให้สอดคล้องกันในไลบรารีที่สามารถสร้างด้วย go build
ก่อนที่แอตทริบิวต์ importpath
จะพร้อมใช้งาน
เพื่อที่จะคอมไพล์และลิงก์อย่างถูกต้อง Rules_go จะต้องทราบพาธการนำเข้า Go (สตริงที่ใช้นำเข้าแพ็คเกจได้) สำหรับแต่ละไลบรารี ตอนนี้ได้รับการตั้งค่าอย่างชัดเจนด้วยแอตทริบิวต์ importpath
ก่อนที่จะมีแอ็ตทริบิวต์นั้น เส้นทางการนำเข้าถูกอนุมานโดยการเชื่อมโยงสตริงจากกฎ go_prefix
พิเศษกับแพ็กเกจและชื่อเลเบลของไลบรารี ตัวอย่างเช่น หาก go_prefix
คือ github.com/example/project
สำหรับไลบรารี //foo/bar:bar
Rules_go จะอนุมานพาธการนำเข้าเป็น github.com/example/project/foo/bar/bar
การพูดติดอ่างในตอนท้ายเข้ากันไม่ได้กับ go build
ดังนั้นหากชื่อป้ายกำกับคือ go_default_library
เส้นทางการนำเข้าจะไม่รวมไว้ ดังนั้นสำหรับไลบรารี //foo/bar:go_default_library
เส้นทางการนำเข้าจะเป็น github.com/example/project/foo/bar
เนื่องจาก go_prefix
ถูกลบออกและแอตทริบิวต์ importpath
กลายเป็นข้อบังคับ (ดู #721) ชื่อ go_default_library
จึงไม่ตอบสนองวัตถุประสงค์ใดๆ อีกต่อไป เราอาจตัดสินใจหยุดใช้มันในอนาคต (ดู #265)
คุณสามารถคอมไพล์ข้ามได้โดยตั้งค่าสถานะ --platforms
บนบรรทัดคำสั่ง ตัวอย่างเช่น:
$ bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 //cmd
ตามค่าเริ่มต้น cgo จะถูกปิดใช้งานเมื่อทำการคอมไพล์ข้าม หากต้องการคอมไพล์ข้ามด้วย cgo ให้เพิ่มส่วนต่อท้าย _cgo
ให้กับแพลตฟอร์มเป้าหมาย คุณต้องลงทะเบียนกลุ่มเครื่องมือ C/C++ ที่คอมไพล์ข้ามกับ Bazel เพื่อให้สิ่งนี้ทำงานได้
$ bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64_cgo //cmd
แหล่งที่มาเฉพาะแพลตฟอร์มที่มีแท็กบิลด์หรือส่วนต่อท้ายชื่อไฟล์จะถูกกรองโดยอัตโนมัติในเวลารวบรวม คุณสามารถเลือกรวมการขึ้นต่อกันเฉพาะแพลตฟอร์มด้วยนิพจน์ select
(Gazelle ทำสิ่งนี้โดยอัตโนมัติ)
go_library (
name = "foo" ,
srcs = [
"foo_linux.go" ,
"foo_windows.go" ,
],
deps = select ({
"@io_bazel_rules_go//go/platform:linux_amd64" : [
"//bar_linux" ,
],
"@io_bazel_rules_go//go/platform:windows_amd64" : [
"//bar_windows" ,
],
"//conditions:default" : [],
}),
)
หากต้องการสร้างเป้าหมาย go_binary เฉพาะสำหรับแพลตฟอร์มเป้าหมายหรือใช้เวอร์ชัน golang SDK เฉพาะ ให้ใช้กฎ go_cross_binary สิ่งนี้มีประโยชน์สำหรับการสร้างไบนารีหลายรายการสำหรับแพลตฟอร์มที่แตกต่างกันในบิลด์เดียว
หากต้องการสร้างเป้าหมาย go_test เฉพาะสำหรับแพลตฟอร์มเป้าหมาย ให้ตั้งค่าแอตทริบิวต์ goos
และ goarch
ในกฎนั้น
คุณสามารถพึ่งพากฎ go_binary หรือ go_test ได้อย่างเท่าเทียมกันผ่านการเปลี่ยนแปลงการกำหนดค่า Bazel บน //command_line_option:platforms
(มีปัญหากับแนวทางนี้ก่อน Rules_go 0.23.0)
Bazel ดำเนินการทดสอบในแซนด์บ็อกซ์ ซึ่งหมายความว่าการทดสอบจะไม่สามารถเข้าถึงไฟล์ได้โดยอัตโนมัติ คุณต้องรวมไฟล์ทดสอบโดยใช้แอตทริบิวต์ data
ตัวอย่างเช่น หากคุณต้องการรวมทุกอย่างไว้ในไดเร็กทอรี testdata
:
go_test (
name = "foo_test" ,
srcs = [ "foo_test.go" ],
data = glob ([ "testdata/**" ]),
importpath = "github.com/example/project/foo" ,
)
ตามค่าเริ่มต้น การทดสอบจะดำเนินการในไดเร็กทอรีของไฟล์บิลด์ที่กำหนดไว้ โปรดทราบว่าสิ่งนี้เป็นไปตามแบบแผนการทดสอบ Go ไม่ใช่แบบแผน Bazel ที่ตามด้วยภาษาอื่นซึ่งทำงานในรูทของที่เก็บ ซึ่งหมายความว่าคุณสามารถเข้าถึงไฟล์ทดสอบโดยใช้เส้นทางสัมพัทธ์ คุณสามารถเปลี่ยนไดเร็กทอรีทดสอบได้โดยใช้แอตทริบิวต์ rundir
ดู go_test
Gazelle จะเพิ่มแอตทริบิวต์ data
เช่นเดียวกับที่กล่าวมาข้างต้นโดยอัตโนมัติ หากคุณมีไดเร็กทอรี testdata
เว้นแต่ จะมีไฟล์ .go หรือไฟล์ build ที่สามารถสร้างได้ ซึ่งในกรณีนี้ testdata
จะถือเป็นแพ็คเกจปกติ
โปรดทราบว่าใน Windows ไฟล์ข้อมูลจะไม่พร้อมสำหรับการทดสอบโดยตรง เนื่องจากไฟล์ข้อมูลทดสอบต้องใช้ลิงก์สัญลักษณ์ และตามค่าเริ่มต้น Windows จะไม่อนุญาตให้ผู้ใช้ที่ไม่มีสิทธิ์สร้างลิงก์สัญลักษณ์ คุณสามารถใช้ไลบรารี github.com/bazelbuild/rules_go/go/tools/bazel เพื่อเข้าถึงไฟล์ข้อมูลได้
ตำแหน่งที่ go_binary
เขียนไฟล์ปฏิบัติการนั้นไม่เสถียรในเวอร์ชันของ Rules_go และไม่ควรขึ้นอยู่กับ ไดเร็กทอรีพาเรนต์มีข้อมูลการกำหนดค่าบางอย่างอยู่ในชื่อ วิธีนี้จะช่วยป้องกันแคชของ Bazel ไม่ให้ถูกวางยาเมื่อมีการสร้างไบนารีเดียวกันในการกำหนดค่าที่แตกต่างกัน ชื่อฐานไบนารีอาจขึ้นอยู่กับแพลตฟอร์ม: บน Windows เราจะเพิ่มนามสกุล .exe
หากต้องการขึ้นอยู่กับไฟล์สั่งการในกฎ go_test
ให้อ้างอิงไฟล์สั่งการในแอตทริบิวต์ data
(เพื่อให้มองเห็นได้) จากนั้นขยายตำแหน่งใน args
ตำแหน่งจริงจะถูกส่งไปยังการทดสอบบนบรรทัดคำสั่ง ตัวอย่างเช่น:
go_binary (
name = "cmd" ,
srcs = [ "cmd.go" ],
)
go_test (
name = "cmd_test" ,
srcs = [ "cmd_test.go" ],
args = [ "$(location :cmd)" ],
data = [ ":cmd" ],
)
ดู //tests/core/cross สำหรับตัวอย่างการทดสอบที่เข้าถึงไบนารี่
หรือคุณสามารถตั้งค่าแอตทริบิวต์ out
ของ go_binary ให้กับชื่อไฟล์ที่ต้องการได้ โปรดทราบว่าเมื่อตั้งค่า out
ไบนารี่จะไม่ถูกแคชเมื่อเปลี่ยนการกำหนดค่า
go_binary (
name = "cmd" ,
srcs = [ "cmd.go" ],
out = "cmd" ,
)
go_test (
name = "cmd_test" ,
srcs = [ "cmd_test.go" ],
data = [ ":cmd" ],
)
ดูการหลีกเลี่ยงข้อขัดแย้งในเอกสารประกอบโปรโต
สิ่งนี้ไม่ได้รับการสนับสนุน เมื่อใช้ go_proto_library กับคอมไพเลอร์ @io_bazel_rules_go//proto:go_grpc
การพึ่งพาโดยนัยจะถูกเพิ่มใน @org_golang_google_grpc//:go_default_library
หากคุณเชื่อมโยงสำเนาอื่นของแพ็คเกจเดียวกันจาก //vendor/google.golang.org/grpc:go_default_library
หรือที่อื่น คุณอาจพบข้อขัดแย้งในการคอมไพล์หรือรันไทม์
หากคุณใช้ Gazelle โดยเปิดใช้งานการสร้างกฎ Proto การนำเข้า google.golang.org/grpc
จะได้รับการแก้ไขโดยอัตโนมัติไปที่ @org_golang_google_grpc//:go_default_library
เพื่อหลีกเลี่ยงความขัดแย้ง ควรละเว้น gRPC ของผู้จำหน่ายในกรณีนี้
หากคุณจำเป็นต้องใช้แพ็คเกจ gRPC ที่จำหน่ายโดยเฉพาะ วิธีที่ดีที่สุดคือหลีกเลี่ยงการใช้ go_proto_library
เลย คุณสามารถตรวจสอบไฟล์ .pb.go ที่สร้างไว้ล่วงหน้าและสร้างไฟล์เหล่านั้นด้วยกฎ go_library
Gazelle จะสร้างกฎเหล่านี้เมื่อการสร้างกฎโปรโตถูกปิดใช้งาน (เพิ่ม # gazelle:proto disable_global
ให้กับไฟล์รูทบิลด์ของคุณ)
ดูการแทนที่การพึ่งพาสำหรับคำแนะนำเกี่ยวกับการแทนที่ที่เก็บที่ประกาศใน go_rules_dependencies
อ้างอิง:
หากต้องการรันการทดสอบ Bazel บน Travis CI คุณจะต้องติดตั้ง Bazel ในสคริปต์ before_install
ดูไฟล์การกำหนดค่าของเราที่ลิงก์ด้านบน
คุณจะต้องเรียกใช้ Bazel ด้วยแฟล็กจำนวนหนึ่งเพื่อป้องกันไม่ให้ใช้หน่วยความจำจำนวนมากในสภาพแวดล้อมการทดสอบ
--host_jvm_args=-Xmx500m --host_jvm_args=-Xms500m
: ตั้งค่าขนาดฮีป JVM สูงสุดและเริ่มต้น การรักษาแบบเดียวกันหมายความว่า JVM จะไม่ใช้เวลาในการเพิ่มฮีป การเลือกขนาดฮีปนั้นค่อนข้างจะเป็นไปตามอำเภอใจ ไฟล์การกำหนดค่าอื่น ๆ แนะนำให้มีขีดจำกัดสูงถึง 2,500 ม. ค่าที่สูงกว่าหมายถึงการสร้างที่เร็วขึ้น แต่มีความเสี่ยงสูงที่ OOM kill--bazelrc=.test-bazelrc
: ใช้ไฟล์การกำหนดค่า Bazel เฉพาะสำหรับ Travis CI คุณสามารถใส่ตัวเลือกที่เหลือส่วนใหญ่ได้ที่นี่build --spawn_strategy=standalone --genrule_strategy=standalone
: ปิดการใช้งานแซนด์บ็อกซ์สำหรับบิลด์ Sandboxing อาจล้มเหลวภายในคอนเทนเนอร์ของ Travis เนื่องจากไม่อนุญาตให้เรียก mount
ระบบtest --test_strategy=standalone
: ปิดการใช้งานแซนด์บ็อกซ์สำหรับการทดสอบเช่นกัน--local_resources=1536,1.5,0.5
: ตั้งค่าขีดจำกัด Bazel บน RAM ที่มีอยู่ในหน่วย MB, แกนประมวลผลที่พร้อมใช้งานสำหรับการประมวลผล และแกนประมวลผลที่พร้อมใช้งานสำหรับ I/O ค่าที่สูงกว่าหมายถึงการสร้างที่เร็วขึ้น แต่มีความขัดแย้งและความเสี่ยงที่ OOM จะถูกทำลายมากขึ้น--noshow_progress
: ระงับข้อความความคืบหน้าในเอาต์พุตสำหรับบันทึกที่สะอาดกว่า--verbose_failures
: รับข้อความแสดงความล้มเหลวโดยละเอียดเพิ่มเติม--test_output=errors
: แสดง test stderr ในบันทึก Travis โดยปกติแล้ว ผลลัพธ์การทดสอบจะเป็นไฟล์บันทึกที่ Travis ไม่ได้บันทึกหรือรายงาน การดาวน์โหลดบน Travis ค่อนข้างช้า (เครือข่ายมีการโต้แย้งกันอย่างหนัก) ดังนั้นคุณจะต้องลดจำนวน I/O เครือข่ายในบิลด์ของคุณให้เหลือน้อยที่สุด การดาวน์โหลด Bazel และ Go SDK เป็นส่วนสำคัญของการดาวน์โหลด เพื่อหลีกเลี่ยงการดาวน์โหลด Go SDK คุณสามารถขอคอนเทนเนอร์ที่มี Go เวอร์ชันที่ติดตั้งไว้ล่วงหน้าในไฟล์ .travis.yml
ของคุณ จากนั้นเรียก go_register_toolchains(go_version = "host")
ในไฟล์ WORKSPACE
เฉพาะของ Travis
คุณอาจถูกล่อลวงให้ใส่แคชของ Bazel ลงในแคช Travis ของคุณ แม้ว่าวิธีนี้จะช่วยเพิ่มความเร็วในการสร้างของคุณได้อย่างมาก แต่ Travis จะเก็บแคชไว้บน Amazon และการถ่ายโอนจะใช้เวลานานมาก บิลด์ที่สะอาดดูเหมือนเร็วกว่าในทางปฏิบัติ
Rules_go รองรับเฉพาะ Go SDK ที่เผยแพร่อย่างเป็นทางการเท่านั้น อย่างไรก็ตาม คุณยังสามารถทดสอบเวอร์ชันเบต้าและ RC ได้โดยส่ง version
เช่น "1.16beta1"
ไปยัง go_register_toolchains ดูเพิ่มเติมที่go_download_sdk
load ( "@io_bazel_rules_go//go:deps.bzl" , "go_register_toolchains" , "go_rules_dependencies" )
go_rules_dependencies ()
go_register_toolchains ( version = "1.17beta1" )