Câu hỏi thường gặp

Nếu bạn có câu hỏi hoặc cần hỗ trợ, vui lòng xem phần Nhận trợ giúp.

Bazel là gì?

Bazel là một công cụ tự động hóa các bản dựng và thử nghiệm phần mềm. Các nhiệm vụ bản dựng được hỗ trợ bao gồm trình biên dịch và trình liên kết đang chạy để tạo chương trình và thư viện có thể thực thi, đồng thời tập hợp các gói có thể triển khai cho Android, iOS và các môi trường mục tiêu khác. Bazel tương tự như các công cụ khác như Make, Ant, Gradle, Buck, Pants và Maven.

Ở Bazel có gì đặc biệt?

Bazel được thiết kế để phù hợp với cách phần mềm được phát triển tại Google. Tính năng này có các tính năng sau:

  • Hỗ trợ đa ngôn ngữ: Bazel hỗ trợ nhiều ngôn ngữ và có thể mở rộng để hỗ trợ các ngôn ngữ lập trình tùy ý.
  • Ngôn ngữ xây dựng cấp cao: Các dự án được mô tả bằng ngôn ngữ BUILD, một định dạng văn bản ngắn gọn, mô tả một dự án dưới dạng tập hợp các thư viện, tệp nhị phân và bài kiểm tra kết nối với nhau. Ngược lại, với các công cụ như Make, bạn phải mô tả từng tệp và lệnh gọi trình biên dịch.
  • Hỗ trợ nhiều nền tảng: Bạn có thể sử dụng cùng một công cụ và cùng một tệp BUILD để xây dựng phần mềm cho các kiến trúc khác nhau và thậm chí là các nền tảng khác nhau. Tại Google, chúng tôi sử dụng Bazel để xây dựng mọi thứ từ các ứng dụng máy chủ chạy trên hệ thống trong các trung tâm dữ liệu của chúng tôi đến các ứng dụng khách chạy trên điện thoại di động.
  • Khả năng tái tạo: Trong các tệp BUILD, mỗi thư viện, thử nghiệm và tệp nhị phân phải chỉ định hoàn toàn các phần phụ thuộc trực tiếp. Bazel sử dụng thông tin về phần phụ thuộc này để biết những mục phải làm lại khi bạn thay đổi tệp nguồn và những tác vụ nào có thể chạy song song. Điều này có nghĩa là tất cả các bản dựng đều tăng dần và sẽ luôn mang lại kết quả như nhau.
  • Có thể mở rộng: Bazel có thể xử lý các bản dựng lớn; tại Google, tệp nhị phân của máy chủ thường có tệp nguồn là 100.000 và việc xây dựng không thay đổi tệp nào sẽ mất khoảng 200 mili giây.

Tại sao Google không sử dụng...

  • Tạo, Ninja: Những công cụ này cho phép bạn kiểm soát chính xác những lệnh được gọi để tạo tệp, nhưng người dùng có thể tùy ý viết các quy tắc chính xác.
    • Người dùng tương tác với Bazel ở cấp độ cao hơn. Ví dụ: Bazel đã tích hợp các quy tắc cho "thử nghiệm Java", "tệp nhị phân C++" và các khái niệm như "nền tảng mục tiêu" và "nền tảng lưu trữ". Những quy tắc này đã được kiểm tra để đánh giá là phù hợp.
  • Ant và Maven: Ant và Maven chủ yếu nhắm đến Java, trong khi Bazel xử lý nhiều ngôn ngữ. Bazel khuyến khích việc chia nhỏ cơ sở mã trong các đơn vị nhỏ hơn có thể tái sử dụng và chỉ có thể xây dựng lại những cơ sở cần xây dựng lại. Điều này sẽ giúp đẩy nhanh quá trình phát triển khi làm việc với các cơ sở mã lớn hơn.
  • Gradle: Các tệp cấu hình của Bazel có cấu trúc tốt hơn nhiều so với Gradle, giúp Bazel hiểu chính xác chức năng của mỗi hành động. Cách này cho phép song song hơn và tái tạo hiệu quả hơn.
  • Pants, Buck: Cả hai công cụ này đều do cựu nhân viên của Google tạo ra và phát triển tại Twitter và Foursquare và Facebook. Các mô hình này được mô hình hóa sau Bazel, nhưng các bộ tính năng của chúng lại khác nhau, vì vậy, chúng không thể thay thế cho chúng ta.

Bazel đến từ đâu?

Bazel là một hương vị của công cụ mà Google sử dụng để tạo phần mềm máy chủ của mình trong nội bộ. Ứng dụng này đã mở rộng để phát triển phần mềm khác, chẳng hạn như những ứng dụng dành cho thiết bị di động (iOS, Android) kết nối với máy chủ của chúng tôi.

Bạn có viết lại công cụ nội bộ của mình là nguồn mở không? Có phải là Phuộc không?

Bazel chia sẻ hầu hết mã của công cụ với công cụ nội bộ và các quy tắc của công cụ được sử dụng cho hàng triệu bản dựng mỗi ngày.

Tại sao Google xây dựng Bazel?

Cách đây không lâu, Google đã xây dựng phần mềm của mình bằng các tệp Files Make lớn, được tạo ra. Điều này dẫn đến các bản dựng chậm và không đáng tin cậy, bắt đầu ảnh hưởng đến năng suất của nhà phát triển và sự linh hoạt của công ty. Bazel là một cách để giải quyết những vấn đề này.

Bazel có cần cụm xây dựng không?

Theo mặc định, Bazel chạy hoạt động xây dựng tại địa phương. Tuy nhiên, Bazel cũng có thể kết nối với một nhóm bản dựng để thực hiện các thử nghiệm và bản dựng nhanh hơn nữa. Hãy xem tài liệu của chúng tôi về cách thực thi và lưu vào bộ nhớ đệm từ xalưu bộ nhớ đệm từ xa để biết thêm thông tin.

Quá trình phát triển của Google hoạt động như thế nào?

Đối với cơ sở mã máy chủ của chúng tôi, chúng tôi sử dụng quy trình phát triển sau đây:

  • Tất cả mã máy chủ của chúng tôi đều nằm trong một hệ thống kiểm soát phiên bản khổng lồ.
  • Mọi người đều xây dựng phần mềm bằng Bazel.
  • Các nhóm khác nhau sở hữu những phần khác nhau của cây nguồn và làm cho các thành phần của chúng có sẵn dưới dạng mục tiêu BUILD.
  • Phân nhánh chủ yếu được sử dụng để quản lý các bản phát hành, vì vậy, mọi người phát triển phần mềm của mình ở bản sửa đổi.

Bazel là nền tảng của triết lý này: vì Bazel yêu cầu phải chỉ định đầy đủ các phần phụ thuộc, nên chúng tôi có thể dự đoán những chương trình và thử nghiệm nào bị ảnh hưởng bởi thay đổi và xem xét trước khi gửi.

Bạn có thể tìm hiểu thêm về quá trình phát triển tại Google trên blog về công cụ kỹ thuật.

Tại sao lại mở Bazel?

Việc xây dựng phần mềm phải thú vị và dễ dàng. Các bản dựng có tốc độ chậm và không thể dự đoán giúp bạn không cần lập trình.

Tại sao tôi muốn sử dụng Bazel?

  • Bazel có thể mang lại cho bạn thời gian xây dựng nhanh hơn vì nó có thể chỉ biên dịch lại các tệp cần được biên dịch lại. Tương tự như vậy, công cụ này có thể bỏ qua các lần chạy lại thử nghiệm mà công cụ này biết là chưa thay đổi.
  • Bazel tạo ra kết quả xác định. Điều này giúp loại bỏ độ lệch giữa các bản dựng tăng dần và sạch, máy tính xách tay và hệ thống CI, v.v.
  • Bazel có thể tạo các ứng dụng máy chủ và máy chủ khác nhau bằng cùng một công cụ từ cùng một không gian làm việc. Ví dụ: bạn có thể thay đổi giao thức máy khách/máy chủ theo một cam kết duy nhất và kiểm tra để đảm bảo rằng ứng dụng di động đã cập nhật hoạt động với máy chủ được cập nhật, xây dựng cả hai bằng cùng một công cụ, khai thác tất cả các lợi ích nói trên của Bazel.

Tôi có thể xem ví dụ không?

Có; xem một ví dụ đơn giản hoặc đọc Mã nguồn Nguồn để biết một ví dụ phức tạp hơn.

Bazel ở đâu ngon nhất?

Bazel tỏa sáng trong việc xây dựng và thử nghiệm dự án với những tài sản sau:

  • Các dự án có cơ sở mã lớn
  • Các dự án viết bằng (nhiều) ngôn ngữ đã biên dịch
  • Các dự án triển khai trên nhiều nền tảng
  • Các dự án có thử nghiệm mở rộng

Tôi có thể chạy Bazel ở đâu?

Bazel chạy trên Linux, macOS (OS X) và Windows.

Việc chuyển sang các nền tảng UNIX khác tương đối dễ dàng, miễn là JDK có sẵn cho nền tảng đó.

Tôi không nên dùng Bazel cho mục đích gì?

  • Bazel cố gắng khéo léo về việc lưu vào bộ nhớ đệm. Điều này có nghĩa là không phù hợp để chạy các thao tác bản dựng có kết quả không được lưu vào bộ nhớ đệm. Ví dụ: bạn không được chạy các bước sau đây từ Bazel:
    • Một bước biên dịch tìm nạp dữ liệu từ Internet.
    • Bước kiểm tra kết nối với bản sao QA của trang web của bạn.
    • Một bước triển khai làm thay đổi cấu hình đám mây của trang web.
  • Nếu bản dựng của bạn bao gồm một vài bước dài tuần tự, Bazel có thể không trợ giúp được nhiều. Bạn sẽ có nhiều tốc độ hơn bằng cách chia nhỏ các bước dài thành các mục tiêu nhỏ hơn, riêng biệt mà Bazel có thể chạy song song.

Tính năng của Bazel được đặt ở mức ổn định?

Các tính năng cốt lõi (C++, Java và quy tắc vỏ) có mục đích sử dụng rộng rãi bên trong Google, vì vậy các tính năng này được thử nghiệm kỹ lưỡng và rất ít tỷ lệ rời bỏ ứng dụng. Tương tự, chúng tôi thử nghiệm các phiên bản mới của Bazel trên hàng trăm nghìn mục tiêu mỗi ngày để tìm hồi quy và chúng tôi phát hành các phiên bản mới nhiều lần mỗi tháng.

Tóm lại, ngoại trừ các tính năng được đánh dấu là thử nghiệm, Bazel chỉ nên hoạt động. Các thay đổi đối với quy tắc không phải trong thử nghiệm sẽ tương thích ngược. Bạn có thể xem danh sách trạng thái hỗ trợ tính năng chi tiết hơn trong tài liệu hỗ trợ của chúng tôi.

Bazel có ổn định ở dạng tệp nhị phân không?

Bên trong Google, chúng tôi đảm bảo rằng các sự cố Bazel rất hiếm khi xảy ra. Thao tác này cũng cần phải áp dụng cho cơ sở mã nguồn mở của chúng tôi.

Làm cách nào để bắt đầu sử dụng Bazel?

Xem phần Bắt đầu.

Docker có giải quyết được các vấn đề về khả năng tái tạo không?

Với Docker, bạn có thể dễ dàng tạo hộp cát với các bản phát hành hệ điều hành cố định, ví dụ: Ubuntu 12.04, Fedora 21. Điều này giải quyết vấn đề về khả năng tái tạo cho môi trường hệ thống, tức là "Tôi cần phiên bản nào của /usr/bin/c++?"

Docker không giải quyết khả năng tái tạo liên quan đến các thay đổi trong mã nguồn. Việc chạy Make bằng một tệp Makefile được viết không hoàn hảo bên trong vùng chứa Docker vẫn có thể mang lại kết quả không thể đoán trước.

Bên trong Google, chúng tôi kiểm tra các công cụ kiểm soát nguồn đối với khả năng tái tạo. Bằng cách này, chúng ta có thể kiểm tra các thay đổi đối với công cụ (“nâng cấp GCC lên 4.6.1”) với cơ chế giống như thay đổi đối với thư viện cơ sở (“kiểm tra ranh giới kiểm tra trong UTM”).

Tôi có thể tạo tệp nhị phân để triển khai trên Docker không?

Với Bazel, bạn có thể xây dựng các tệp nhị phân độc lập, được liên kết tĩnh trong C/C++ và các tệp jar độc lập cho Java. Các tệp này chạy một vài phần phụ thuộc trên các hệ thống UNIX thông thường, và do đó, việc cài đặt bên trong vùng chứa Docker là đơn giản.

Bazel có các quy ước về việc cấu trúc các chương trình phức tạp hơn, ví dụ: một chương trình Java sử dụng một tập hợp các tệp dữ liệu hoặc chạy một chương trình khác dưới dạng quy trình phụ. Bạn có thể đóng gói các môi trường đó dưới dạng tệp lưu trữ độc lập để triển khai trên các hệ thống khác nhau, bao gồm cả hình ảnh Docker.

Tôi có thể tạo hình ảnh Docker bằng Bazel không?

Có, bạn có thể sử dụng quy tắc Docker của chúng tôi để tạo hình ảnh Docker có thể tái tạo.

Liệu Bazel có tự động tái tạo các bản dựng của tôi không?

Đối với tệp nhị phân Java và C++, hãy giả sử bạn không thay đổi chuỗi công cụ. Nếu bạn đang xây dựng các bước liên quan đến công thức nấu ăn tùy chỉnh (ví dụ: thực thi tệp nhị phân thông qua tập lệnh shell bên trong quy tắc), bạn cần phải chú ý thêm:

  • Không sử dụng các phần phụ thuộc chưa được khai báo. Thực thi hộp cát (–spawn_strategy=sandboxed, chỉ trên Linux) có thể giúp tìm thấy các phần phụ thuộc chưa được khai báo.
  • Tránh lưu trữ dấu thời gian và mã nhận dạng khách hàng trong các tệp tạo ra. Tệp ZIP và các tệp lưu trữ khác đặc biệt dễ gặp vấn đề này.
  • Tránh kết nối với mạng. Việc thực thi hộp cát cũng có thể giúp ích cho bạn tại đây.
  • Tránh các quy trình sử dụng số ngẫu nhiên, cụ thể là việc truyền tải từ điển ngẫu nhiên trong nhiều ngôn ngữ lập trình.

Bạn có bản phát hành nhị phân không?

Có, bạn có thể tìm thấy tệp nhị phân phát hành mới nhất và xem chính sách phát hành của chúng tôi

Tôi sử dụng Eclipse/IntelliJ/XCode. Bazel tương tác như thế nào với IDE?

Đối với IntelliJ, hãy xem IntelliJ with Bazel Plugin.

Đối với XCode, hãy xem Tulsi.

Đối với Eclipse, hãy xem Trình bổ trợ E4B.

Đối với các IDE khác, hãy xem bài đăng trên blog về cách các trình bổ trợ này hoạt động.

Tôi sử dụng Jenkins/CircleCI/TravisCI. Bazel tương tác với hệ thống CI bằng cách nào?

Bazel sẽ trả về một mã thoát khác 0 nếu lệnh gọi xây dựng hoặc thử nghiệm không thành công, và số này sẽ đủ cho việc tích hợp CI cơ bản. Vì Bazel không cần các bản dựng rõ ràng để đảm bảo tính chính xác, nên hệ thống CI không được định cấu hình để dọn dẹp trước khi bắt đầu chạy/chạy thử.

Bạn có thể xem thêm thông tin chi tiết về mã thoát trong Hướng dẫn sử dụng.

Chúng tôi có thể mong đợi những tính năng nào trong tương lai trên Bazel?

Xem Sơ đồ đường đi của chúng tôi.

Tôi có thể sử dụng Bazel cho dự án CHÈN NGÔN NGỮ TẠI ĐÂY không?

Bazel có thể mở rộng. Bất cứ ai cũng có thể hỗ trợ cho những ngôn ngữ mới. Nhiều ngôn ngữ được hỗ trợ, hãy xem build eneventlopedia để biết danh sách các đề xuất và awesomebazel.com để biết danh sách đầy đủ hơn.

Nếu bạn muốn phát triển các phần mở rộng hoặc tìm hiểu cách hoạt động của phần mở rộng, hãy xem tài liệu về cách mở rộng Bazel.

Tôi có thể đóng góp vào cơ sở mã Bazel không?

Hãy xem nguyên tắc đóng góp của chúng tôi.

Tại sao không phải tất cả quá trình phát triển đều được thực hiện trong trạng thái mở?

Chúng tôi vẫn phải thường xuyên tái cấu trúc giao diện giữa mã công khai trong Bazel và các tiện ích nội bộ của chúng tôi. Điều này khiến việc phát triển ngoài trời trở nên khó khăn.

Bạn có đang sử dụng nguồn mở Bazel không?

Nguồn mở Bazel đang trong quá trình xây dựng. Cụ thể, chúng tôi vẫn đang nỗ lực tạo nguồn mở:

  • Nhiều bài kiểm tra đơn vị và tích hợp của chúng tôi (khiến những bản vá đóng góp dễ dàng hơn).
  • Tích hợp IDE đầy đủ.

Ngoài việc sử dụng mã, cuối cùng chúng tôi cũng muốn nhận được tất cả các bài đánh giá về mã, tính năng theo dõi lỗi và quyết định thiết kế nhờ cộng đồng Bazel. Chúng tôi chưa ở đó, vì vậy một số thay đổi sẽ chỉ xuất hiện trong kho lưu trữ Bazel mà không có giải thích rõ ràng. Mặc dù thiếu minh bạch, nhưng chúng tôi muốn hỗ trợ các nhà phát triển bên ngoài và cộng tác. Do đó, chúng tôi sẽ mở mã này, mặc dù một số bước phát triển vẫn đang diễn ra nội bộ đối với Google. Vui lòng cho chúng tôi biết nếu có điều gì đó không rõ ràng hoặc không hợp lý khi chúng tôi chuyển sang mô hình mở.

Có phần nào của Bazel không bao giờ có nguồn mở không?

Có, một số cơ sở mã tích hợp với công nghệ dành riêng cho Google hoặc chúng tôi đã tìm cách loại bỏ (hoặc là một số kết hợp cả hai). Các phần này của cơ sở mã không có sẵn trên GitHub và có thể sẽ không bao giờ bị như vậy.

Làm cách nào để liên hệ với nhóm?

Chúng tôi có thể liên hệ với bạn tại bazel-Talk@googlegroups.com.

Tôi có thể báo cáo lỗi ở đâu?

Mở một vấn đề trên GitHub.

Bạn có biết từ "Blaze" trong cơ sở mã không?

Đây là tên nội bộ cho công cụ. Vui lòng gọi Bazel là Bazel.

Tại sao các dự án khác của Google (Android, Chrome) sử dụng các công cụ xây dựng khác?

Trước khi phát hành bản Alpha đầu tiên, Bazel không còn bên ngoài, vì vậy không thể sử dụng dự án nguồn mở như Chromium và Android. Ngoài ra, việc thiếu hỗ trợ Windows ban đầu là một vấn đề khi xây dựng các ứng dụng Windows, chẳng hạn như Chrome. Vì dự án đã hoàn thiện và ổn định hơn, nên Dự án nguồn mở Android đang trong quá trình chuyển sang Bazel.

Bạn phát âm từ "Bazel" như thế nào?

Cách tương tự như “basil” (Thảo mộc) trong tiếng Anh Mỹ: “BAY-zel”. Khi đó, bài hát sẽ thơ mộng với “hazel”. IPA: / {2/}beszž̙l/