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

Báo cáo sự cố Xem nguồn

Nếu bạn có thắc mắc 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 hoá các quá trình xây dựng và kiểm thử phần mềm. Các nhiệm vụ bản dựng được hỗ trợ bao gồm chạy trình biên dịch và trình liên kết để tạo 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 cũng tương tự như các công cụ khác như Make, Ant, Gradle, Buck, Quần 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. Thư viện 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 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ả một dự án dưới dạng các tập hợp thư viện, tệp nhị phân và kiểm thử nhỏ liên kết 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ợ đa 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 nhiều cấu trúc, thậm chí là cho 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ừ ứng dụng máy chủ chạy trên các hệ thống trong trung tâm dữ liệu cho đến ứng dụng khách chạy trên điện thoại di động.
  • Khả năng lặp lại: Trong các tệp BUILD, mỗi thư viện, tệp 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 về phần phụ thuộc này để biết những yếu tố cần xây dựng lại khi bạn thay đổi tệp nguồn, cũng như biết những tác vụ có thể chạy song song. Điều này có nghĩa là tất cả các bản dựng đều có khả năng 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 của máy chủ thường có 100 nghìn tệp nguồn và các bản dựng không thay đổi tệp sẽ mất khoảng ~200 mili giây.

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

  • Make, 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 nào được gọi để tạo tệp, nhưng người dùng có thể quyết định 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 sẵn 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 máy chủ". Những quy tắc này đã được thử nghiệm cho hiệu quả cao.
  • Ant và Maven: Ant và Maven chủ yếu hướng tới 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ị có thể tái sử dụng nhỏ hơn 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 giúp tăng tốc độ 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 Bazel có cấu trúc nhiều hơn so với Gradle, cho phép Bazel hiểu chính xác từng thao tác. Điều này cho phép độ song song cao hơn và khả năng mô phỏng tốt hơn.
  • Pants, Buck: Cả hai công cụ này đều do các nhân viên cũ của Google tạo ra và phát triển tại Twitter, Foursquare và Facebook. Chúng tôi đã lập mô hình cho Bazel nhưng các bộ tính năng của họ lại khác. Vì vậy, những trò chơi này không thể thay thế được.

Bazel đến từ đâu?

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

Bazel chia sẻ hầu hết 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 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 lâu, Google đã xây dựng phần mềm bằng cách sử dụng các Makefiles lớn, được tạo. Đ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à tính 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 các hoạt động xây dựng trên máy. Tuy nhiên, Bazel cũng có thể kết nối với một cụm bản dựng để xây dựng và kiểm thử 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 vào bộ nhớ đệm từ xa để biết thêm thông tin chi tiết.

Google phát triển như thế nào?

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

  • Tất cả 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ồ duy nhất.
  • Mọi người đều xây dựng phần mềm của mình bằng Bazel.
  • Các nhóm khác nhau 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 các phần đó dưới dạng mục tiêu BUILD.
  • 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 đầu.

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

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

Tại sao anh 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ông thể đoán trước khiến việc lập trình trở nên thú vị.

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

  • Bazel có thể giúp bạn xây dựng thời gian nhanh hơn vì nó 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, công cụ này có thể bỏ qua các thử nghiệm đang chạy lại và biết rằng vẫn chưa thay đổi.
  • Bazel tạo ra kết quả xác định. Điều này giúp loại bỏ sai lệch giữa các bản dựng tăng dần và sạch sẽ, máy tính xách tay và hệ thống CI, v.v.
  • Bazel có thể tạo các ứng dụng khá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ủ trong một cam kết duy nhất và kiểm tra xem ứng dụng được cập nhật trên thiết bị di động có 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ụ, nhận tất cả lợi ích nói 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 ví dụ phức tạp hơn.

Món Bazel là gì tốt nhất?

Bazel nổi bật tại các dự án xây dựng và thử nghiệm với các thuộc tính sau:

  • Các dự án có cơ sở mã lớn
  • Các dự án viết bằng (nhiều) ngôn ngữ được 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 sẽ tương đối dễ dàng, miễn là có JDK cho nền tảng.

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

  • Bazel luôn cố gắng thông minh khi lưu vào bộ nhớ đệm. Nghĩa là không phù hợp để chạy các hoạt động xây dựng có dữ liệu đầ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 từ Bazel:
    • 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 phiên bản QA của trang web.
    • 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 và tuần tự, Bazel có thể không trợ giúp được nhiều. Bạn sẽ tăng 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ỏ và 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à shell) được sử dụng rộng rãi trong Google, vì vậy chúng được thử nghiệm kỹ lưỡng và có tỷ lệ rời bỏ rất ít. 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 phiên bản mới nhiều lần mỗi tháng.

Nói ngắn gọn, ngoại trừ các tính năng được đánh dấu là thử nghiệm, Bazel sẽ chỉ hoạt động. Các thay đổi đối với quy tắc không thử nghiệm sẽ 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 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 gặp. Thao tác này cũng nên giữ lại 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 không giải quyết được các vấn đề về khả năng tái tạo?

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 được vấn đề tái lập đối với 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 các 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ả không thể đoán trước.

Bên trong Google, chúng tôi kiểm tra các công cụ trong phần kiểm soát nguồn để đảm bảo khả năng tái lập. Bằng cách này, chúng tôi có thể kiểm tra những thay đổi đối với công cụ (“nâng cấp GCC lên 4.6.1”) với cơ chế tương tự như các thay đổi đối với thư viện cơ sở (“khắc phục sự cố kiểm tra giới hạn 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ể xây dựng các tệp nhị phân được liên kết tĩnh độc lập trong C/C++ và các tệp jar độc lập cho Java. Các tệp này chạy với một số phần phụ thuộc trên hệ thống UNIX thông thường, và do đó, việc cài đặt bên trong vùng chứa Docker sẽ đơn giản.

Bazel có các quy ướ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 để có thể triển khai trên các hệ thống khác, 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ó thể tạo lại các bản dựng tự động có thể mô phỏng không?

Đối với tệp nhị phân Java và C++, có, giả sử bạn không thay đổi chuỗi công cụ. Nếu bạn có các bước tạo bản dựng 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 một quy tắc), bạn sẽ cần chú ý thêm:

  • Đừ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 người dùng trong các tệp được tạo. Các tệp ZIP và những bản lưu trữ khác đặc biệt dễ gặp phải vấn đề này.
  • Tránh kết nối mạng. Việc thực thi hộp cát cũng có thể giúp ích trong trường hợp này.
  • Tránh các quy trình sử dụng số ngẫu nhiên, cụ thể là truyền tải từ điển được sắp xếp 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ể xem các tệp nhị phân của bản phát hành mới nhất và tham khảo chính sách phát hành

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 trình bổ trợ IntelliJ với Bazel.

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

Đối với Eclipse, hãy xem bài viết 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/SquareCI/TravisCI. Bazel tương tác với hệ thống CI như thế nào?

Bazel sẽ trả về mã thoát khác 0 nếu lệnh gọi bản dựng hoặc thử nghiệm không thành công và điều này là đủ để 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ử.

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 ở 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 không?

Bazel có thể mở rộng. Bất kỳ ai cũng có thể hỗ trợ thêm các ngôn ngữ mới. Nhiều ngôn ngữ được hỗ trợ: hãy xem bách khoa toàn thư về bản dựng để 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 tiện ích hoặc tìm hiểu cách hoạt động, 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 tất cả các hoạt động phát triển đều được thực hiện trong phiên đấu giá mở?

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

Bạn đã hoàn tất nguồn mở Bazel chưa?

Tính năng tìm nguồn mở Bazel đang trong quá trình hoàn thiện. Cụ thể, chúng tôi vẫn đang xử lý nguồn mở:

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

Ngoài việc lập trình, chúng tôi muốn tất cả các hoạt động đánh giá mã, theo dõi lỗi và quyết định thiết kế đều diễn ra công khai với sự tham gia của cộng đồng Bazel. Chúng tôi chưa tồn tại nên 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ù thiếu thông tin minh bạch, 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 sẽ mở mã, mặc dù một số hoạt động phát triển vẫn đang diễn ra trong nội bộ 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ã đang tích hợp với công nghệ của Google cụ thể hoặc chúng tôi đã tìm kiếm lý do để loại bỏ (hoặc là sự kết hợp của cả hai). Những 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ờ.

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

Bạn có thể liên hệ với chúng tôi theo địa chỉ bazel-Thảo@googlegroups.com.

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

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

Từ "Blaze" trong cơ sở mã có nghĩa là gì?

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

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

Cho đến bản phát hành đầu tiên (Alpha), Bazel chưa có ứng dụng bên ngoài, nên các dự án nguồn mở như Chromium và Android không thể sử dụng ứng dụng này. Ngoài ra, việc thiếu khả năng hỗ trợ Windows ban đầu là một vấn đề trong việc 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 “Bazel” như thế nào?

Cách nói tương tự như “basil” (thược thảo) trong tiếng Anh (Mỹ) là: “BAY-zel”. Nhạc này có âm điệu với “hazel”. IPA: /TEAMbeɪz Google,əl/