ปัจจุบัน cargo-raze เป็นผลิตภัณฑ์ที่ไม่ได้รับการบำรุงรักษาและไม่ได้รับการสนับสนุน
crate_universe
ใน rules_rust
เป็นผลิตภัณฑ์ที่ได้รับการสนับสนุนและบำรุงรักษาโดยมีเป้าหมายที่คล้ายกัน
เราเชื่อว่า crate_universe
รองรับฟังก์ชันทั้งหมดที่ได้รับการสนับสนุนจาก cargo-raze เราขอแนะนำให้คุณลองย้ายข้อมูลไปที่นั่น หากคุณพบการสนับสนุนหรือข้อบกพร่องที่ขาดหายไป โปรดยื่นเรื่องหรือประชาสัมพันธ์ต่อ rules_rust
cargo-raze
ได้รับการเก็บถาวรเพื่อสะท้อนถึงความจริงที่ว่าการประชาสัมพันธ์และประเด็นต่างๆ ที่ยื่นฟ้องนั้นไม่น่าจะได้รับการแก้ไข
โปรดติดต่อ #rust in the Bazel Slack หากคุณสนใจรับช่วงการบำรุงรักษาโครงการนี้
ปลั๊กอินสนับสนุน Cargo แบบทดลองสำหรับการกลั่น Cargo.toml ระดับพื้นที่ทำงานลงในเป้าหมาย BUILD ที่โค้ดที่ใช้ Rules_rust สามารถพึ่งพาได้โดยตรง
นี่ไม่ใช่ผลิตภัณฑ์อย่างเป็นทางการของ Google (ทดลองหรืออย่างอื่น) เป็นเพียงโค้ดที่ Google เป็นเจ้าของ
โปรเจ็กต์นี้สังเคราะห์ตรรกะการแก้ปัญหาการขึ้นต่อกันและฟังก์ชันการทำงานบางอย่างของ Cargo เช่น คุณสมบัติ และสร้างสคริปต์ลงในกฎปฏิบัติการที่ Bazel สามารถเรียกใช้เพื่อรวบรวม Rust crates แม้ว่ากฎ Rules_rust มาตรฐานสามารถใช้เพื่อรวบรวมโค้ด Rust ตั้งแต่เริ่มต้นได้ แต่รายละเอียดเล็กๆ น้อยๆ ของระบบนิเวศการพึ่งพาทำให้การเปลี่ยนแปลงแผนผังการพึ่งพาตามระบบนิเวศนั้นเป็นภาระ แม้แต่โค้ดที่มีการขึ้นต่อกันเพียงเล็กน้อยก็ตาม
cargo-raze สามารถสร้างเป้าหมายที่สามารถสร้างได้ในโหมดใดโหมดหนึ่งจากสองโหมด: การขายหรือการไม่ขาย ในโหมดผู้จำหน่าย นักพัฒนาใช้คำสั่งย่อย common cargo vendor
เพื่อดึงข้อมูลการขึ้นต่อกันที่ระบุโดยเวิร์กสเปซ Cargo.toml ลงในไดเร็กทอรีที่ cargo-raze เติมข้อมูลด้วยไฟล์ BUILD ในโหมดที่ไม่ใช่ผู้จำหน่าย cargo-raze จะสร้างรายการไฟล์ BUILD แบบแฟลต และมาโครระดับพื้นที่ทำงานที่สามารถเรียกใช้ในไฟล์ WORKSPACE เพื่อดึงการขึ้นต่อกันโดยอัตโนมัติในลักษณะเดียวกันกับ Cargo เอง
ในทั้งสองกรณี ขั้นตอนแรกคือการตัดสินใจว่าจะวางตำแหน่งการพึ่งพาสินค้าในพื้นที่ทำงานไว้ที่ใด ไลบรารีนี้ได้รับการออกแบบโดยคำนึงถึง monorepos โดยที่องค์กรจะตัดสินใจตามชุดการขึ้นต่อกันที่ทุกคนชี้ไป มีจุดมุ่งหมายให้ผู้มีส่วนได้ส่วนเสียในการพึ่งพาทำงานร่วมกันเพื่ออัพเกรดการพึ่งพาแบบอะตอมมิก และแก้ไขการแตกหักของโค้ดเบสพร้อมกัน ในกรณีที่ไม่สามารถทำได้ ยังคงเป็นไปได้ที่จะใช้ cargo-raze ในสถานการณ์ที่มีการกระจายอำนาจ แต่ไม่น่าเป็นไปได้ที่ที่เก็บข้อมูลที่แยกออกจากกันดังกล่าวจะโต้ตอบกันได้ดีกับการใช้งานในปัจจุบัน
ไม่ว่าแนวทางที่เลือกไว้ ควรนำrust_rules เข้าสู่ WORKSPACE นี่คือตัวอย่าง:
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
http_archive (
name = "rules_rust" ,
sha256 = "accb5a89cbe63d55dcdae85938e56ff3aa56f21eb847ed826a28a83db8500ae6" ,
strip_prefix = "rules_rust-9aa49569b2b0dacecc51c05cee52708b7255bd98" ,
urls = [
# Main branch as of 2021-02-19
"https://github.com/bazelbuild/rules_rust/archive/9aa49569b2b0dacecc51c05cee52708b7255bd98.tar.gz" ,
],
)
load ( "@rules_rust//rust:repositories.bzl" , "rust_repositories" )
rust_repositories ( edition = "2018" )
สำหรับโปรเจ็กต์ Bazel เท่านั้น ผู้ใช้ควรสร้าง Cargo.toml มาตรฐานที่มีการขึ้นต่อกันตามความสนใจก่อน ดูแลที่จะรวมคำสั่ง [lib]
เพื่อที่ Cargo จะไม่บ่นเกี่ยวกับไฟล์ต้นฉบับที่หายไปสำหรับลังจำลองนี้ นี่คือตัวอย่าง:
[ package ]
name = " compile_with_bazel "
version = " 0.0.0 "
# Mandatory (or Cargo tooling is unhappy)
[ lib ]
path = " fake_lib.rs "
[ dependencies ]
log = " =0.3.6 "
เมื่อ Cargo.toml มาตรฐานพร้อมใช้งานแล้ว ให้เพิ่มคำสั่ง [package.metadata.raze]
ตามส่วนถัดไป
การตั้งค่า Canonical Cargo เกือบทั้งหมดควรจะสามารถทำงานร่วมกับ cargo-raze
ได้ สมมติว่าตอนนี้พื้นที่ทำงาน Cargo ซ้อนอยู่ภายใต้พื้นที่ทำงาน Bazel ผู้ใช้สามารถเพิ่ม RazeSettings ลงในไฟล์ Cargo.toml เพื่อใช้ในการสร้างไฟล์ Bazel
# Above this line should be the contents of your Cargo.toml file
[ package . metadata . raze ]
# The path at which to write output files.
#
# `cargo raze` will generate Bazel-compatible BUILD files into this path.
# This can either be a relative path (e.g. "foo/bar"), relative to this
# Cargo.toml file; or relative to the Bazel workspace root (e.g. "//foo/bar").
workspace_path = " //cargo "
# This causes aliases for dependencies to be rendered in the BUILD
# file located next to this `Cargo.toml` file.
package_aliases_dir = " . "
# The set of targets to generate BUILD rules for.
targets = [
" x86_64-apple-darwin " ,
" x86_64-pc-windows-msvc " ,
" x86_64-unknown-linux-gnu " ,
]
# The two acceptable options are "Remote" and "Vendored" which
# is used to indicate whether the user is using a non-vendored or
# vendored set of dependencies.
genmode = " Remote "
ในโปรเจ็กต์ที่ใช้พื้นที่ทำงานของ Cargo ผู้ใช้ควรจัดระเบียบการตั้ง raze
ทั้งหมดลงในฟิลด์ [workspace.metadata.raze]
ในไฟล์ Cargo.toml
ระดับบนสุดซึ่งมีคำจำกัดความของ [workspace]
การตั้งค่าเหล่านี้ควรเหมือนกับการตั้งค่าที่เห็นใน [package.metadata.raze]
ในส่วนก่อนหน้า อย่างไรก็ตาม การตั้งค่าลังอาจยังคงอยู่ในไฟล์ Cargo.toml
ของสมาชิกพื้นที่ทำงาน:
# Above this line should be the contents of your package's Cargo.toml file
# Note that `some-dependency` is the name of an example dependency and
# `<0.3.0` is a semver version for the dependency crate's version. This
# should always be compaitble in some way with the dependency version
# specified in the `[dependencies]` section of the package defined in
# this file
[ package . metadata . raze . crates . some-dependency . '<0 . 3 . 0' ]
additional_flags = [
" --cfg=optional_feature_a " ,
" --cfg=optional_feature_b " ,
]
# This demonstrates that multiple crate settings may be defined.
[ package . metadata . raze . crates . some-other-dependency . '*' ]
additional_flags = [
" --cfg=special_feature " ,
]
ในโหมดระยะไกล จะมีการเลือกไดเร็กทอรีที่คล้ายกับโหมดการขาย ในกรณีนี้ ไฟล์จะมีเฉพาะไฟล์ BUILD คำแนะนำในการขายสำหรับ WORKSPACE และนามแฝงของการขึ้นต่อกันที่ชัดเจน จำเป็นต้องมีการประปาที่แตกต่างกันเล็กน้อย
สิ่งนี้เป็นการบอก Raze ไม่ให้คาดหวังว่าจะมีการจำหน่ายการขึ้นต่อกันและสร้างไฟล์ที่แตกต่างกัน
ขั้นแรกให้ติดตั้ง cargo-raze
$ cargo install cargo-raze
จากนั้น ดำเนินการ cargo raze จากภายในไดเร็กทอรี cargo
$ cargo raze
สุดท้าย ให้เรียกใช้ฟังก์ชันการดึงข้อมูลไลบรารีระยะไกลภายใน WORKSPACE ของคุณ:
load ( "//cargo:crates.bzl" , "raze_fetch_remote_crates" )
# Note that this method's name depends on your gen_workspace_prefix setting.
# `raze` is the default prefix.
raze_fetch_remote_crates ()
สิ่งนี้จะบอก Bazel ว่าจะหาการพึ่งพาได้จากที่ไหน และวิธีสร้างมัน: โดยใช้ไฟล์ที่สร้างใน //cargo
คุณสามารถพึ่งพาการขึ้นต่อกัน ที่ชัดเจน ในกฎ Rust ใดๆ โดยขึ้นอยู่กับ //cargo:your_dependency_name
ในโหมดผู้จัดจำหน่าย จะมีการเลือกรูทโดยตรงซึ่งจะเป็นที่ตั้งของการขึ้นต่อกันของผู้จำหน่ายและกลายเป็นประตูสู่กฎการสร้างเหล่านั้น //cargo
เป็นเรื่องปกติ แต่ //third_party/cargo
อาจเป็นที่ต้องการเพื่อตอบสนองความต้องการขององค์กร การขายโดยตรงไปยังรูทไม่ได้รับการสนับสนุนอย่างดีเนื่องจากลักษณะเฉพาะของการนำไปใช้งาน แต่อาจได้รับการสนับสนุนในอนาคต จากนี้ไป //cargo
จะเป็นไดเร็กทอรีที่สันนิษฐาน
ขั้นแรก ติดตั้งเครื่องมือที่จำเป็นสำหรับการขายและสร้างเป้าหมายที่สามารถสร้างได้
$ cargo install cargo-raze
หลังจากนั้น ให้ขายการพึ่งพาของคุณจากภายในไดเรกทอรี cargo/ นี่จะอัปเดตไฟล์ Cargo.lock
ของคุณด้วย
$ cargo vendor --versioned-dirs
สุดท้าย ให้สร้างไฟล์ BUILD ของคุณอีกครั้งจากภายในไดเร็กทอรี cargo/
$ cargo raze
ตอนนี้คุณสามารถพึ่งพาการขึ้นต่อกัน ที่ชัดเจน ในกฎ Rust ใด ๆ ได้โดยขึ้นอยู่กับ //cargo:your_dependency_name
Cargo-raze สามารถสร้างขึ้นทั้งหมดใน Bazel และใช้งานได้โดยไม่จำเป็นต้องตั้งค่า cargo บนเครื่องโฮสต์ ในการดำเนินการดังกล่าว เพียงเพิ่มสิ่งต่อไปนี้ลงในไฟล์ WORKSPACE ในโปรเจ็กต์ของคุณ:
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
http_archive (
name = "cargo_raze" ,
sha256 = "c664e258ea79e7e4ec2f2b57bca8b1c37f11c8d5748e02b8224810da969eb681" ,
strip_prefix = "cargo-raze-0.11.0" ,
url = "https://github.com/google/cargo-raze/archive/v0.11.0.tar.gz" ,
)
load ( "@cargo_raze//:repositories.bzl" , "cargo_raze_repositories" )
cargo_raze_repositories ()
load ( "@cargo_raze//:transitive_deps.bzl" , "cargo_raze_transitive_deps" )
cargo_raze_transitive_deps ()
ด้วยสิ่งนี้ ผู้ใช้สามารถเรียกใช้เป้าหมาย @cargo_raze//:raze
เพื่อสร้างไฟล์ BUILD ใหม่ เช่น:
bazel run @cargo_raze//:raze -- --manifest-path= $( realpath /Cargo.toml )
โปรดทราบว่าผู้ใช้ที่ใช้ genmode vendored
จะยังคงต้องขายการพึ่งพาของตนเนื่องจาก cargo-raze
ไม่ได้ทำสิ่งนี้เพื่อคุณในขณะนี้
บางลังเรียกใช้งาน "build script" ซึ่งถึงแม้จะไม่จำกัดทางเทคนิคว่าจะทำอะไรได้บ้าง แต่มักจะทำสิ่งหนึ่งจากสิ่งทั่วไปบางอย่าง
ตัวเลือกทั้งหมดที่ระบุไว้ด้านล่างนี้ระบุไว้ในไฟล์ src/settings.rs
ในบางกรณี ลังจะใช้เฉพาะข้อมูลพื้นฐานเพื่อสร้างไฟล์ต้นฉบับของ Rust กฎบิลด์สคริปต์เหล่านี้สามารถดำเนินการและใช้งานได้จริงภายใน Bazel โดยรวมคำสั่งใน Cargo.toml ของคุณก่อนการสร้าง:
[ package . metadata . raze . crates . clang-sys . '0 . 21 . 1' ]
gen_buildrs = true
การตั้งค่านี้บอกให้ cargo-raze สร้างเป้าหมายrust_binaryสำหรับสคริปต์บิลด์และกำหนดเอาต์พุตที่สร้างขึ้น (สไตล์ OUT_DIR) ไปยังลังพาเรนต์
สคริปต์บิลด์บางตัวปล่อยคำสั่งแบบมีเงื่อนไขเพื่อยืนยันว่า Cargo รู้วิธีเผยแพร่ น่าเสียดายที่การจัดการข้อมูลการพึ่งพาที่สร้างขึ้นในเวลาบิลด์ไม่ใช่เรื่องง่าย ดังนั้นหากแฟล็กเป็นที่รู้จักแบบคงที่ (บางทีเนื่องจากเป้าหมายการคอมไพล์เป็นที่รู้จักแบบคงที่) จึงสามารถจัดเตรียมได้จากภายใน Cargo.toml ในลักษณะดังต่อไปนี้
[ package . metadata . raze . crates . unicase . '2 . 1 . 0' ]
additional_flags = [
# Rustc is 1.15, enable all optional settings
" --cfg=__unicase__iter_cmp " ,
" --cfg=__unicase__defauler_hasher " ,
]
ธงที่ให้ไว้ในลักษณะนี้จะถูกส่งไปยังสนิมโดยตรง การอ้างอิงถึงส่วน build-script ของเอกสารประกอบเพื่อตีความสคริปต์ build และคำสั่ง stdout ที่พบอาจเป็นประโยชน์ ซึ่งมีให้ที่นี่: https://doc.rust-lang.org/cargo/reference/build-scripts.html
มีสองวิธีในการจัดเตรียมไลบรารีระบบที่ลังต้องการสำหรับการคอมไพล์ ประการแรกคือผู้จำหน่ายไลบรารีระบบโดยตรง สร้างกฎ BUILD สำหรับไลบรารีนั้น และเพิ่มการพึ่งพาไปยังลัง -sys
ที่เกี่ยวข้อง สำหรับ openssl บางส่วนอาจมีลักษณะดังนี้:
[ package . metadata . raze . crates . openssl-sys . '0 . 9 . 24' ]
additional_flags = [
# Vendored openssl is 1.0.2m
" --cfg=ossl102 " ,
" --cfg=version=102 " ,
]
additional_deps = [
" @//third_party/openssl:crypto " ,
" @//third_party/openssl:ssl " ,
]
[ package . metadata . raze . crates . openssl . '0 . 10 . 2' ]
additional_flags = [
# Vendored openssl is 1.0.2m
" --cfg=ossl102 " ,
" --cfg=version=102 " ,
" --cfg=ossl10x " ,
]
ในบางกรณี การเดินสายการพึ่งพาระบบโลคัลโดยตรงอาจเป็นทางเลือกที่ดีกว่า หากต้องการทำสิ่งนี้ โปรดดูส่วน new_local_repository
ของเอกสาร Bazel สำหรับเวอร์ชันที่คอมไพล์แล้วของ llvm ใน WORKSPACE อาจมีลักษณะดังนี้:
new_local_repository (
name = "llvm" ,
build_file = "BUILD.llvm.bazel" ,
path = "/usr/lib/llvm-3.9" ,
)
ในบางกรณี ลังระบบอาจจำเป็นต้องถูกแทนที่ทั้งหมด สิ่งนี้สามารถอำนวยความสะดวกได้โดยการลบและเสริมการพึ่งพาใน Cargo.toml รุ่นก่อน:
[ package . metadata . raze . crates . sdl2 . '0 . 31 . 0' ]
skipped_deps = [
" sdl2-sys-0.31.0 "
]
additional_deps = [
" @//cargo/overrides/sdl2-sys:sdl2_sys "
]
บางลังมีไบนารีที่มีประโยชน์ซึ่งสามารถนำมาใช้เป็นส่วนหนึ่งของกระบวนการรวบรวมได้: Bindgen เป็นตัวอย่างที่ดี Bindgen สร้างไฟล์ต้นฉบับของ Rust โดยการประมวลผลไฟล์ C หรือ C++ คุณสามารถเพิ่มคำสั่งลงใน Cargo.toml เพื่อบอกให้ Bazel เปิดเผยไบนารีดังกล่าวให้กับคุณ:
[ package . metadata . raze . crates . bindgen . '0 . 32 . 2' ]
gen_buildrs = true # needed to build bindgen
extra_aliased_targets = [
" cargo_bin_bindgen "
]
Cargo-raze นำหน้าเป้าหมายไบนารีด้วย cargo_bin_
ราวกับว่า Cargo อนุญาตให้ไบนารีและไลบรารีใช้ชื่อเป้าหมายเดียวกัน แต่ Bazel ไม่อนุญาตสิ่งนี้
ปัจจุบัน สินค้าไม่ได้รวบรวมข้อมูลเมตาเกี่ยวกับลังที่ไม่มีห้องสมุดใดๆ ซึ่งหมายความว่าการระบุสิ่งเหล่านี้ในส่วน [dependencies]
ของไฟล์ Cargo.toml
ของคุณจะไม่ส่งผลให้มีการสร้างเป้าหมาย Bazel Cargo-raze มีช่องพิเศษในการจัดการลังเหล่านี้เมื่อใช้ genmode = "Remote"
:
[ package . metadata . raze . binary_deps ]
wasm-bindgen-cli = " 0.2.68 "
ในตัวอย่างข้างต้น ลัง wasm-bindgen-cli
ถูกกำหนดเป็นการพึ่งพาแบบไบนารี และ Cargo-raze จะทำให้มั่นใจว่าข้อมูลเมตาสำหรับสิ่งนี้และลังอื่นๆ ที่กำหนดไว้ที่นี่จะรวมอยู่ในไดเร็กทอรีเอาต์พุตที่เป็นผลลัพธ์ ไฟล์ล็อคสำหรับเป้าหมายที่ระบุภายใต้ [package.metadata.raze.binary_deps]
จะถูกสร้างขึ้นในไดเร็กทอรี lockfiles
ภายในพาธที่ระบุโดย workspace_path
โปรดทราบว่าฟิลด์ binary_deps
สามารถไปในพื้นที่ทำงาน และ ข้อมูลเมตาของแพ็คเกจได้ อย่างไรก็ตาม สามารถมีคำจำกัดความของการพึ่งพาไบนารีได้เพียงคำเดียวในแต่ละครั้ง หากคุณมีแพ็คเกจหลายแพ็คเกจที่ขึ้นอยู่กับการขึ้นต่อกันของไบนารีเดียว คำจำกัดความนั้นจะต้องถูกย้ายไปยังเมตาดาต้าของเวิร์กสเปซ
การตั้งค่า default_gen_buildrs เป็น true จะทำให้ cargo-raze สร้างสคริปต์บิลด์สำหรับลังทั้งหมดที่ต้องการ:
[ package . metadata . raze ]
workspace_path = " //cargo "
genmode = " Remote "
default_gen_buildrs = true
การตั้งค่านี้เป็นการแลกเปลี่ยนระหว่างความสะดวกและความถูกต้อง เมื่อเปิดใช้งาน คุณจะพบว่าลังจำนวนมากใช้งานได้โดยไม่ต้องระบุแฟล็กใดๆ อย่างชัดเจน และไม่จำเป็นต้องเปิดใช้งานสคริปต์บิลด์แต่ละรายการด้วยตนเอง แต่การเปิดเครื่องจะถือว่าคุณอนุญาตให้ลังทั้งหมดที่คุณใช้รันโค้ดที่กำหนดเองในขณะสร้าง และการดำเนินการที่ลังทำอาจไม่ปิดสนิท
แม้จะเปิดใช้งานการตั้งค่านี้แล้ว คุณยังอาจจำเป็นต้องจัดเตรียมการตั้งค่าเพิ่มเติมสำหรับลังบางลัง ตัวอย่างเช่น ลังวงแหวนจำเป็นต้องเข้าถึงแผนผังต้นทาง ณ เวลาที่สร้าง:
[ package . metadata . raze . crates . ring . '*' ]
compile_data_attr = " glob([ " **/*.der " ]) "
หากคุณต้องการปิดการใช้งานสคริปต์การสร้างในแต่ละลัง คุณสามารถทำได้ดังต่อไปนี้:
[ package . metadata . raze . crates . some_dependency . '*' ]
gen_buildrs = false
Bazel ("เร็ว", "ถูกต้อง" เลือกสองข้อ) เป็นระบบการสร้างที่ผ่านการทดสอบการต่อสู้ซึ่งใช้โดย Google เพื่อรวบรวมโครงการขนาดใหญ่ที่มีหลายภาษาอย่างไม่น่าเชื่อโดยไม่ต้องใช้ความพยายามซ้ำซ้อน และไม่ประนีประนอมกับความถูกต้อง บรรลุผลสำเร็จในส่วนหนึ่งโดยการจำกัดกลไกที่ออบเจ็กต์การคอมไพล์ที่กำหนดสามารถใช้เพื่อค้นหาการขึ้นต่อกัน และโดยการบังคับให้หน่วยที่สามารถสร้างได้แสดงชุดการขึ้นต่อกันทั้งหมด คาดว่าอินพุตเป้าหมายบิลด์ที่เหมือนกันสองชุดจะสร้างผลลัพธ์สุดท้ายที่เทียบเท่าไบต์ต่อไบต์
ในการแลกเปลี่ยน ผู้ใช้จะได้รับรางวัลด้วยระบบการสร้างที่ปรับแต่งได้และขยายได้ ซึ่งรวบรวมเป้าหมายที่สามารถคอมไพล์ได้ทุกประเภท และอนุญาตให้แสดง "การพึ่งพาที่แปลกใหม่" เช่น ออบเจ็กต์ Protobuf, เชเดอร์กราฟิกที่คอมไพล์แล้ว หรือโค้ดที่สร้างขึ้น ในขณะที่ยังคงรวดเร็วและถูกต้อง
นอกจากนี้ยังเป็นไปได้ (แม้ว่าจะยังไม่ได้แสดงให้เห็นด้วยการวัดประสิทธิภาพ) ว่าแอปพลิเคชันขนาดใหญ่ที่สร้างขึ้นโดยคำนึงถึงจุดแข็งของ Bazel: หน่วยการสร้างที่มีรายละเอียดสูงจะคอมไพล์ได้เร็วขึ้นอย่างมากเนื่องจากสามารถแคชในเชิงรุกได้มากขึ้นและหลีกเลี่ยงการคอมไพล์โค้ดใหม่ได้มากในขณะที่วนซ้ำ
ไม่ว่าจะดีขึ้นหรือแย่ลง ระบบนิเวศของ Rust ขึ้นอยู่กับลังขนส่งสินค้าเป็นอย่างมาก เพื่อมอบฟังก์ชันการทำงานที่มักมีอยู่ในไลบรารีมาตรฐาน นี่เป็นสิ่งที่ยอดเยี่ยมจริงๆ สำหรับวิวัฒนาการของภาษา เพราะมันอธิบายกระบวนการที่มีโครงสร้างเพื่อการรักษาเสถียรภาพ (ลังทดลอง -> ลัง 1.0 -> RFC -> รวมอยู่ใน stdlib) แต่นั่นหมายความว่าคนที่ไม่สามารถเข้าถึงระบบนิเวศนี้จะต้อง สร้างล้อขึ้นมาใหม่มากมาย
นอกจากนั้น ยังมีกล่องที่ยอดเยี่ยมที่ช่วยให้นักพัฒนา Rust โต้ตอบกับระบบและไลบรารีมาตรฐานอุตสาหกรรม ซึ่งสามารถเร่งการพัฒนาในภาษาได้อย่างมาก
แม้ว่าภาระในการเลียนแบบฟังก์ชันการทำงานของ Cargo (หากเป็นไปได้!) จะสูง แต่ดูเหมือนว่าจะเป็นวิธีเดียวที่จะรักษาการรับประกัน (ความถูกต้อง ความสามารถในการทำซ้ำ) ที่ Bazel ขึ้นอยู่กับเพื่อรักษาประสิทธิภาพเอาไว้ มีความเป็นไปได้และเป็นไปได้ด้วย RFC บนเครื่องบินที่สินค้าจะมีความยืดหยุ่นเพียงพอที่จะนำไปใช้โดยตรงสำหรับการรวบรวม แต่ ณ จุดนี้ปรากฏว่าการรักษาความคล้ายคลึงของคุณลักษณะที่คล้ายคลึงกันนั้นแท้จริงแล้วง่ายกว่าการหลีกเลี่ยงขอบคมทั้งหมดที่แนะนำโดย ปฏิบัติต่อ Cargo เหมือนคอมไพเลอร์ Rust
ด้วยจาระบีข้อศอกเล็กน้อย คุณจึงสามารถสร้างได้เกือบทุกอย่าง รวมถึงโปรเจ็กต์ที่ต้องอาศัย openssl-sys ลังระบบจำนวนมากจะต้องระบุไลบรารีระบบที่ห่อไว้ และจำหน่ายให้กับโปรเจ็กต์ หรือบอก Bazel ว่าไลบรารีนั้นอยู่ที่ใดในระบบของคุณ บางส่วนอาจต้องมีการปรับแต่งแหล่งที่มาเล็กน้อย เช่น การกำจัดข้อกำหนดตัวแปรสภาพแวดล้อมการขนส่งสินค้าแบบฮาร์ดโค้ด การแก้ไขอาจไม่ใช่เรื่องเล็กน้อยในบางกรณี แต่มีลังที่ได้รับความนิยมมากที่สุดจำนวนหนึ่งได้ถูกสร้างขึ้นใน repo ตัวอย่าง ซึ่งมีอยู่ที่ https://github.com/acmcarther/cargo-raze-crater
ดูตัวอย่างการกำหนดค่าลังเหล่านี้:
การใช้โหมดผู้ขาย :
การใช้โหมดระยะไกล :
การคอมไพล์ OpenSSL :
ส่วน [package.metadata.raze]
ได้มาจากโครงสร้างที่ประกาศใน impl/src/settings.rs