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

Báo cáo vấn đề Xem nguồn

Nếu bạn có thắc mắc hoặc cần được hỗ trợ, hãy xem phần Nhận trợ giúp.

Bazel là gì?

Bazel là một công cụ tự động hoá quy trình xây dựng và kiểm thử phần mềm. Các tác vụ xây dựng được hỗ trợ bao gồm chạy các trình biên dịch và trình liên kết để tạo ra các 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ư Tạo, Ant, Gradle, Buck, Quần và Maven.

Bazel có điểm 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. 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 tuỳ ý.
  • Ngôn ngữ bản 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ả 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 thử nhỏ liên kết với nhau. Ngược lại, với các công cụ như Tạo, 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à chính các tệp BUILD để tạo phần mềm cho nhiều cấu trúc và thậm chí là nhiều nền tảng. 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 các hệ thống trong 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, chương trình kiểm thử 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 phần phụ thuộc này để biết những phần nào phải được tạo lại khi bạn thay đổi tệp nguồn, cũng như những tác vụ nào có thể chạy song song. Điều này có nghĩa là tất cả bản dựng đều mang tính gia tăng và sẽ luôn tạo ra cùng một kết quả.
  • 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 máy chủ thường có 100 nghìn tệp nguồn và các bản dựng không có tệp nào được thay đổi mất khoảng 200 mili giây.

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

  • Make, Ninja: Các công cụ này cho phép kiểm soát rất chính xác những lệnh nào được gọi để xây dựng tệp, nhưng người dùng có quyền viết quy tắc chính xác hay không.
    • Người dùng tương tác với Bazel ở mức độ cao hơn. Ví dụ: Bazel đã tích hợp sẵn các quy tắc cho quy trình "kiểm thử 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 thử nghiệm để trở nên rõ ràng.
  • Ant và Maven: Ant và Maven chủ yếu hướng đến Java, trong khi Bazel xử lý nhiều ngôn ngữ. Bazel khuyến khích việc chia nhỏ cơ sở mã thành các đơn vị nhỏ hơn có thể sử dụng lại và chỉ xây dựng lại những đơn vị cần xây dựng lại. Việc này giúp đẩy nhanh tốc độ phát triển khi xử lý các cơ sở mã lớn hơn.
  • Gradle: Các tệp cấu hình Bazel có cấu trúc tốt hơn nhiều so với Gradle, cho phép Bazel hiểu chính xác chức năng của từng hành động. Điều này giúp cải thiện độ song song và khả năng tái tạo tốt hơn.
  • Quần, Buck: Cả hai công cụ này đều được tạo và phát triển bởi các nhân viên cũ của Google tại Twitter, Foursquare và Facebook tương ứng. Các tính năng này được mô hình hoá theo Bazel, nhưng bộ tính năng thì khác, nên đây không phải là giải pháp thay thế khả thi đối với chúng tôi.

Bazel từ đâu đến?

Bazel là một phiên bản của công cụ mà Google sử dụng để xây dựng phần mềm máy chủ trong nội bộ. Nền tảng này cũng đã mở rộng để xây dựng cả những phần mềm khác, chẳng hạn như những ứng dụng 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 thành công cụ nguồn mở không? Đó có phải là cái nĩa không?

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

Tại sao Google tạo ra Bazel?

Cách đây rất lâu, Google dùng các tệp Makefile có kích thước lớn và được tạo để xây dựng phần mềm của mình. Các vấn đề này dẫn đến các bản dựng chậm và không đáng tin cậy, ảnh hưởng đến năng suất làm việc của các nhà phát triển và tính linh hoạt của công ty. Bazel là cách để giải quyết những vấn đề này.

Bazel có cần cụm bản dựng không?

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

Quy 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ủ, chúng tôi sử dụng quy trình phát triển sau đây:

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

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

Bạn có thể tìm hiểu thêm thông tin về quá trình phát triển tại Google trên blog của eng tools.

Tại sao bạn 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 chậm và khó dự đoán sẽ lấy đi sự thú vị của chương trình.

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

  • Bazel có thể cho bạn thời gian xây dựng nhanh hơn vì chỉ có thể biên dịch lại các tệp cần biên dịch lại. Tương tự như vậy, tính năng này có thể bỏ qua việc chạy lại các chương trình kiểm thử mà nó biết là không thay đổi.
  • Bazel đưa ra các kết quả mang tính tất định. Điều này giúp loại bỏ sự sai 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 nhiều ứng dụng máy khách và ứng dụng máy chủ 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ủ trong một lần xác nhận và kiểm thử để đảm bảo ứng dụng di động đã cập nhật hoạt động với máy chủ đã cập nhật, xây dựng cả hai bằng cùng một công cụ, từ đó thu được tất cả lợi ích nêu trên của Bazel.

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

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

Bazel giỏi nhất ở khía cạnh nào?

Bazel rất nổi bật trong việc xây dựng và thử nghiệm các dự án với những đặc điểm sau:

  • Các dự án có cơ sở mã lớn
  • Các dự án được 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
  • 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 đổi sang các nền tảng UNIX khác sẽ tương đối dễ dàng, miễn là nền tảng có JDK.

Tôi không nên sử dụng Bazel cho những việc gì?

  • Bazel cố gắng rất khôn ngoan trong việc lưu vào bộ nhớ đệm. Điều này có nghĩa là thao tác này không phù hợp để chạy các thao tác xây dựng có đầu ra không được lưu vào bộ nhớ đệm. Ví dụ: Bạn không nên 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.
    • Một bước kiểm thử kết nối với phiên bản đảm bảo chất lượng của trang web.
    • 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 có một vài bước tuần tự dài, thì Bazel có thể không giúp được bạn nhiều. Bạn sẽ có được tốc độ cao 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.

Bộ tính năng của Bazel có ổn định không?

Các tính năng cốt lõi (C++, Java và quy tắc shell) được sử dụng rộng rãi bên trong Google, vì vậy chúng được kiểm thử kỹ lưỡng và có rất ít tỷ lệ người dùng rời bỏ. 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 sự hồi quy. Đồng thời, 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 thử nghiệm sẽ có khả năng tương thích ngược. Bạn có thể xem danh sách chi tiết hơn về các trạng thái hỗ trợ tính năng trong tài liệu hỗ trợ của chúng tôi.

Bazel ổn định đến mức nào ở dạng tệp nhị phân?

Trong Google, chúng tôi đảm bảo rằng các sự cố Bazel là rất hiếm khi xảy ra. Điều này cũng sẽ ảnh hưởng đến 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?

Hãy xem mục Bắt đầu.

Docker không giải quyết được các vấn đề về khả năng tái tạo phải 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, Panama 21. Điều này sẽ 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 /usr/bin/c++ nào?”

Docker không giải quyết khả năng tái tạo liên quan đến những thay đổi trong mã nguồn. Việc chạy Make với một 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ả ngoài dự đoán.

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

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ể tạo các tệp nhị phân độc lập, liên kết tĩnh trong C/C++ và các tệp jar độc lập cho Java. Các mã này chạy với 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 sẽ đơn giản bên trong vùng chứa Docker.

Bazel có các quy ước về việc xây dựng 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 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 những môi trường như vậy dưới dạng các tệp lưu trữ độc lập để có thể triển khai trên nhiều hệ thống, 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 các quy tắc Docker để tạo hình ảnh Docker có thể tái tạo.

Bazel có tự động tạo các công trình của tôi không?

Đối với các tệp nhị phân Java và C++, giả sử bạn không thay đổi chuỗi công cụ. Nếu có các bước xây dựng liên quan đến công thức tuỳ 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 sẽ cần phải cẩn thận hơn:

  • Không được sử dụng các phần phụ thuộc chưa được khai báo. Quá trình thực thi hộp cát (–spawn_strategy=sandboxed, chỉ có 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 người dùng trong các tệp đã tạo. ZIP và các tệp lưu trữ khác đặc biệt dễ bị lỗi này.
  • Tránh kết nối mạng. Phương pháp thực thi hộp cát cũng có thể giúp ích cho bạn.
  • 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 được chọ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 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 với IDE như thế nào?

Đối với IntelliJ, hãy xem IntelliJ với trình bổ trợ Bazel.

Đố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 hoạt động của các trình bổ trợ này.

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

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

Thông tin chi tiết khác về mã thoát có 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 ở Bazel?

Xem Lộ trình của chúng tôi.

Tôi có thể sử dụng Bazel cho dự án CHÈN NGÔN NGỮ Ở ĐÂY của mình không?

Bazel có thể mở rộng. Bất kỳ ai cũng có thể thêm tính năng hỗ trợ cho các ngôn ngữ mới. Hỗ trợ nhiều ngôn ngữ: xem từ điển bách khoa toàn thư để biết danh sách các đề xuất và truy cập awesomebazel.com để xem danh sách đầy đủ hơn.

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

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

Xem nguyên tắc đóng góp của chúng tôi.

Tại sao không phải mọi hoạt động phát triển đều được thực hiện ngoài trời?

Chúng ta 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ộ. Điều này khiến chúng tôi khó thực hiện nhiều việc phát triển ở chế độ mở.

Bạn đã tạo xong nguồn mở cho Bazel chưa?

Tính năng tìm nguồn mở cho Bazel đang trong quá trình hoàn thiện. Cụ thể, chúng tôi vẫn đang nghiên cứu nguồn mở:

  • Chúng tôi có nhiều bài kiểm thử đơn vị và bài kiểm thử tích hợp (để việc đóng góp bản vá trở nên dễ dàng hơn).
  • Tích hợp IDE đầy đủ.

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

Có phần nào của Bazel sẽ không bao giờ được cung cấp dưới dạng nguồn mở không?

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

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

Bạn có thể truy cập vào bazel-discuss@googlegroups.com.

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

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

Có vấn đề gì với từ "Blaze" trong cơ sở mã?

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

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

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

“Bazel” phát âm như thế nào?

Tương tự như “basil” (loại thảo mộc) trong tiếng Anh của người Mỹ: “BAY-zel”. Từ này phát âm với “hazel”. IPA: / Điều khá mới: