Nếu bạn có câu hỏi hoặc cần được hỗ trợ, hãy xem phần Yêu cầu trợ giúp.
Bazel là gì?
Bazel là một công cụ tự động hoá các bản 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 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 lắp rá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át triển phần mềm tại Google. Ứng dụ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 tuỳ ý.
- 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 các tập hợp gồm các thư viện, tệp nhị phân và kiểm thử nhỏ có mối 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ợ nhiều nền tảng: Bạn có thể dùng cùng một công cụ và cùng các tệp
BUILD
để tạo phần mềm cho nhiều cấu trúc, thậm chí là nhiều nền tảng. Tại Google, chúng tôi sử dụng Bazel để tạo 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 cho đế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 tệp
BUILD
, mỗi thư viện, bài kiểm thử và tệp nhị phân phải chỉ định đầy đủ các phần phụ thuộc trực tiếp của nó. Bazel sử dụng thông tin về phần phụ thuộc này để biết những gì phải được tạo lại khi bạn thực hiện thay đổi đối với một 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 tạo ra cùng một kết quả. - Có khả năng mở rộng: Bazel có thể xử lý các bản dựng lớn; tại Google, một tệp nhị phân máy chủ thường có 100.000 tệp nguồn và các bản dựng không có tệp nào 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 được gọi để tạo tệp, nhưng người dùng phải tự 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 có các quy tắc tích hợp cho "Kiểm thử Java", "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ữ". Các quy tắc này đã được kiểm thử kỹ lưỡng để đảm bảo không có lỗi.
- 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ỉ có thể tạo lại những đơn vị cần tạo lại. Điều này giúp tăng tốc 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 Bazel có cấu trúc chặt chẽ 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 thao tác. Điều này cho phép tăng tính song song và khả năng tái tạo.
- Pants, Buck: Cả hai công cụ này đều do các cựu nhân viên Google tại Twitter, Foursquare và Facebook tạo ra và phát triển. Chúng được mô hình hoá theo Bazel, nhưng bộ tính năng của chúng khác nhau, vì vậy chúng không phải là lựa chọn thay thế khả thi cho chúng tôi.
Bazel đến từ đâu?
Bazel là một phiên bản của công cụ mà Google sử dụng để tạo phần mềm máy chủ nội bộ. Công cụ này cũng được mở rộng để xây dựng các phần mềm khác, chẳng hạn như ứ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 dưới dạng nguồn mở không? Đây có phải là một nhánh 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 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 đã tạo phần mềm của mình bằng cách sử dụng các Makefile 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à khả năng thích ứng của công ty. Bazel là một cách để giải quyết những vấn đề này.
Bazel có yêu cầu cụm bản dựng không?
Theo mặc định, Bazel chạy các thao tác 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 bản 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ề thực thi và lưu vào bộ nhớ đệm từ xa và lưu vào bộ nhớ đệm từ xa để biết thêm thông tin 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:
- 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 duy nhất, khổng lồ.
- Mọi người đều tạo phần mềm 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 họ 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 họ ở bản sửa đổi đầu.
Bazel là nền tảng của triết lý này: vì Bazel yêu cầu bạn chỉ định đầy đủ tất cả 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à kiểm thử nào chịu ảnh hưởng của một thay đổi, đồng thời kiểm tra chúng trước khi gửi.
Bạn có thể xem thêm thông tin về quy trình phát triển tại Google trên blog về các công cụ kỹ thuật.
Tại sao bạn lại mở Bazel?
Việc xây dựng phần mềm phải thật thú vị và dễ dàng. Các bản dựng chậm và khó đoán sẽ làm mất đi niềm vui lập trình.
Tại sao tôi nên sử dụng Bazel?
- Bazel có thể giúp bạn rút ngắn thời gian tạo bản dựng vì chỉ cần biên dịch lại những tệp cần biên dịch lại. Tương tự, nó có thể bỏ qua việc chạy lại các kiểm thử mà nó biết là không thay đổi.
- Bazel tạo ra kết quả xác định. Điều này giúp loại bỏ sự sai lệch giữa các bản dựng gia tăng và bản dựng 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à máy chủ bằng cùng một công cụ trong 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ận dụng tất cả cá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 ví dụ phức tạp hơn.
Bazel phù hợp nhất với những trường hợp nào?
Bazel nổi bật trong việc tạo và kiểm thử các dự án có những thuộc tính sau:
- Dự án có cơ sở mã lớn
- Dự án được viết bằng (nhiều) ngôn ngữ biên dịch
- Dự án triển khai trên nhiều nền tảng
- Dự án có nhiều kiểm thử
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à có JDK cho nền tảng đó.
Tôi không nên dùng Bazel cho những việc gì?
- Bazel cố gắng thông minh về việc lưu vào bộ nhớ đệm. Điều này có nghĩa là không nên chạy các thao tác tạo mà đầ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:
- Một bước biên dịch để tìm nạp dữ liệu trên 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 giúp 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ự, thì Bazel có thể không giúp được nhiều. Bạn sẽ tăng tốc độ bằng cách chia 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 ổn định đến mức nào?
Các tính năng cốt lõi (quy tắc C++, Java và shell) được sử dụng rộng rãi trong Google, vì vậy, chúng được kiểm thử kỹ lưỡng và có rất ít thay đổi. Tương tự, chúng tôi kiểm thử 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 ra các lỗi 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.
Nói tóm lại, ngoại trừ những tính năng được đánh dấu là thử nghiệm, Bazel sẽ hoạt động bình thường. Các thay đổi đối với quy tắc không phải quy tắc thử nghiệm sẽ tương thích ngược. Bạn có thể xem danh sách chi tiết hơn về 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ưới dạng một tệp nhị phâ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. Điều này cũng á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 không giải quyết được vấn đề về khả năng tái tạo sao?
Với Docker, bạn có thể dễ dàng tạo các hộp cát 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 vấn đề về 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 một vùng chứa Docker vẫn có thể mang lại kết quả khó đoán.
Trong Google, chúng tôi kiểm tra các công cụ trong hệ thống kiểm soát nguồn để có thể 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") bằng cơ chế tương tự như các thay đổi đối với thư viện cơ sở ("khắc phục lỗi kiểm tra ranh giớ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, được liên kết tĩnh bằng C/C++ và các tệp jar độc lập cho Java. Các lệnh này chạy với một số ít phần phụ thuộc trên các hệ thống UNIX thông thường, do đó, bạn có thể dễ dàng cài đặt trong một vùng chứa Docker.
Bazel có các quy ước để cấu trúc các chương trình phức tạp hơn, chẳng hạn như 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 con. 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 về Docker của chúng tôi để tạo các hình ảnh Docker có thể tái tạo.
Bazel có tự động tạo các bản dựng có thể tái tạo không?
Đối với các tệp nhị phân Java và C++, có, giả sử bạn không thay đổi chuỗi công cụ. Nếu có các bước tạo 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 một quy tắc), bạn sẽ cần phải cẩn thận hơn:
- Không sử dụng các phần phụ thuộc chưa được khai báo. Việc thực thi trong hộp cát (–spawn_strategy=sandboxed, chỉ trên Linux) có thể giúp tìm các phần phụ thuộc chưa 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. Tệp ZIP và các tệp lưu trữ khác đặc biệt dễ bị ảnh hưởng.
- Tránh kết nối với mạng. Việc thực thi trong 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 biệt là quá trình duyệt từ điển được ngẫu nhiên hoá 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 các 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 các IDE như thế nào?
Đố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 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/CircleCI/TravisCI. Bazel tương tác với các hệ thống CI như thế nào?
Bazel trả về 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. Điều này là đủ cho việc tích hợp CI cơ bản. Vì Bazel không cần các 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 ta có thể mong đợi những tính năng nào trong tương lai của Bazel?
Xem Lộ trình của chúng tôi.
Tôi có thể dùng Bazel cho dự án INSERT LANGUAGE HERE của mình không?
Bazel có thể mở rộng. Bất kỳ ai cũng có thể thêm ngôn ngữ mới được hỗ trợ. 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 chúng 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 mọi hoạt động phát triển đều được thực hiện công khai?
Chúng ta vẫn phải tái cấu trúc cá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 ta thường xuyên. Điều này khiến việc phát triển công khai trở nên khó khăn.
Bạn đã hoàn tất việc cung cấp mã nguồn mở cho Bazel chưa?
Việc cung cấp mã nguồn mở cho Bazel vẫn đang trong quá trình thực hiện. Cụ thể, chúng tôi vẫn đang nỗ lực để cung cấp mã nguồn mở cho:
- Nhiều kiểm thử đơn vị và kiểm thử tích hợp của chúng tôi (giúp bạn đóng góp các bản vá dễ dàng hơn).
- Tích hợp đầy đủ với IDE.
Ngoài mã, chúng tôi muốn 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 công khai, có sự tham gia của cộng đồng Bazel. Chúng tôi chưa đạt được mục tiêu này, 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 vẫn muốn hỗ trợ và cộng tác với các nhà phát triển bên ngoài. Do đó, chúng tôi sẽ mở mã nguồn, mặc dù một số hoạt động phát triển vẫn diễn ra nội bộ trong Google. Vui lòng cho chúng tôi biết nếu bạn thấy 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ó những phần nào của Bazel sẽ không bao giờ là 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 đang tì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ã nguồn không có trên GitHub và có lẽ sẽ không bao giờ có.
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-discuss@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 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) 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ó sẵn bên ngoài, vì vậy các dự án nguồn mở như Chromium và Android không thể sử dụng Bazel. Ngoài ra, việc ban đầu thiếu hỗ trợ Windows là một vấn đề đối với việc tạo các ứng dụng Windows, chẳng hạn như Chrome. Vì dự án đã trưởng thành và trở nên ổn định hơn, nên Dự án nguồn mở Android đang trong quá trình di chuyển sang Bazel.
Bạn phát âm từ "Bazel" như thế nào?
Giống như "basil" (rau húng quế) trong tiếng Anh của Hoa Kỳ: "BAY-zel". Từ này có vần với "hazel". IPA: /ˈbeɪzˌəl/