Nếu bạn có câu hỏi hoặc cần được hỗ trợ, hãy xem bài viết Nhận trợ giúp.
Bazel là gì?
Bazel là một công cụ tự động hoá quá 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 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ư 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. Công cụ 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ể được 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 tập hợp các thư viện, tệp nhị phân và chương trình kiểm thử nhỏ được 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ả các tệp riêng lẻ 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 các tệp
BUILDđể xây dựng phần mềm cho nhiều kiến trúc, 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 hệ thống trong trung tâm dữ liệu của chúng tôi đến các ứng dụng 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 đầy đủ 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 gì phải được xây dựng lại khi bạn thay đổ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 là bản dựng gia tăng và sẽ luôn tạo ra cùng một kết quả. - 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 được thay đổi sẽ 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 để xây dựng tệp, nhưng người dùng phải 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 "Java test" (Kiểm thử Java), "C++ binary" (Tệp nhị phân C++) và các khái niệm như "target platform" (nền tảng mục tiêu) và "host platform" (nền tảng máy chủ). 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 chia nhỏ cơ sở mã thành 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 đơn vị cần xây dựng 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 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 tốt hơn.
- Pants, Buck: Cả hai công cụ này đều do các cựu nhân viên Google tạo và phát triển tại Twitter và Foursquare, cũng như Facebook. 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 bắt nguồ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 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 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 rất lâu, Google đã xây dựng phần mềm của mình bằng các tệp 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 gây ảnh hưởng đến năng suất của nhà phát triển và khả năng 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ó 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 để 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ề tính năng 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 khổng lồ.
- 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 họ dưới dạng
BUILDmục tiêu. - 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 đầu.
Bazel là nền tảng của triết lý này: vì Bazel yêu cầu tất cả các phần phụ thuộc phải được chỉ định đầy đủ, nên chúng tôi có thể dự đoán những chương trình và chương trình kiểm thử nào bị ảnh hưởng bởi một thay đổi và kiểm tra chúng trước khi gửi.
Bạn có thể tìm thêm thông tin cơ bản về quy trình phát triển tại Google trên blog về công cụ kỹ thuật.
Tại sao bạn 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 sẽ làm mất đi niềm vui lập trình.
Tại sao tôi muốn sử dụng Bazel?
- Bazel có thể giúp bạn giảm thời gian xây dựng 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ự, công cụ này có thể bỏ qua việc chạy lại các chương trình kiểm thử mà công cụ này 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, hệ thống máy tính xách tay và hệ thống CI, v.v.
- Bazel có thể xây dựng các ứng dụng máy 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 lần cam kết 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 một 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 ở điểm nào?
Bazel nổi bật trong việc xây dựng và kiểm thử các dự án có các 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 chương trình 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 sẽ tương đối dễ dàng, miễn là có JDK cho nền tảng đó.
Tôi không nên sử dụng Bazel cho mục đích 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à công cụ này không phù hợp để chạy các thao tác xây dựng 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 đâ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 QA của trang web.
- Một bước triển khai 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 tuần tự dài, thì Bazel có thể không giúp được nhiều. Bạn sẽ tăng tốc hơn bằng cách chia các bước dài thành các mục tiêu riêng biệt nhỏ hơn mà Bazel có thể chạy song song.
Bộ tính năng của Bazel ổn định như thế nào?
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 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 lỗi hồi quy và 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 sẽ hoạt động bình thườ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ể tìm thấy 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 như thế nào dưới dạng tệp nhị phân?
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. Đ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 bài viết 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 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 được 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ô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 nhằm đảm bảo khả năng tái tạo. Bằng cách này, chúng tôi 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ùng một cơ chế như các thay đổi đối với thư viện cơ sở ("sửa lỗi kiểm tra giới hạn trong OpenSSL").
Tôi có thể xây dựng 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 ít phần phụ thuộc trên các hệ thống UNIX thông thường và do đó, bạn có thể dễ dàng cài đặt bên 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, 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 con. Bạn có thể đóng gói các môi trường như vậy dưới dạng kho 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ể xây dựng hình ảnh Docker bằng Bazel không?
Có, bạn có thể sử dụng các quy tắc Docker của chúng tôi để xây dựng hình ảnh Docker có thể tái tạo.
Bazel có tự động giúp bản dựng của tôi có thể tái tạo 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 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 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. Tính năng 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 đượ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. Tệp ZIP và các kho lưu trữ khác đặc biệt dễ gặp phải vấn đề này.
- Tránh kết nối với mạng. Tính năng 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à việc 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 tệp nhị phân không?
Có, bạn có thể tìm thấy các tệp nhị phân của bả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 plugin IntelliJ with Bazel.
Đối với XCode, hãy xem Tulsi.
Đối với Eclipse, hãy xem plugin 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 plugin này.
Tôi sử dụng Jenkins/CircleCI/TravisCI. Bazel tương tác với hệ thống CI như thế nào?
Bazel trả về mã thoát khác 0 nếu lệnh gọi xây dựng hoặc kiểm thử không thành công và điều này sẽ đủ cho quá trình 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 được định cấu hình hệ thống CI để làm sạch 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 ở Bazel?
Xem Lộ trình của chúng tôi.
Tôi có thể sử dụng Bazel cho dự án INSERT LANGUAGE HERE 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. 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 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 tôi vẫn phải thường xuyên 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ộ. Đ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 mở nguồn Bazel chưa?
Việc mở nguồn Bazel vẫn đang trong quá trình phát triển. Cụ thể, chúng tôi vẫn đang mở nguồn:
- Nhiều chương trình kiểm thử đơn vị và tích hợp của chúng tôi (điều này sẽ giúp việc đóng góp bản vá dễ dàng hơn).
- Tích hợp IDE đầy đủ.
Ngoài mã, chúng tôi muốn cuối cùng sẽ có tất cả các bài đánh giá mã, theo dõi lỗi và quyết định thiết kế được thực hiện công khai, với sự tham gia của cộng đồng Bazel. Chúng tôi chưa đạt được điều đó, 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 đang mở mã, mặc dù một số hoạt động phát triển vẫn đang diễn ra 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 chính đáng 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ờ được mở nguồn 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à một số kết hợp của 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ờ 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 tại bazel-discuss@googlegroups.com.
Tôi 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 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?
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 công cụ này. Ngoài ra, việc thiếu hỗ trợ ban đầu cho 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. Kể từ khi dự án trưởng thành và ổn định hơn, Dự án nguồn mở Android đang trong quá trình di chuyển sang Bazel.
Bạn phát âm "Bazel" như thế nào?
Giống như "basil" (húng quế) trong tiếng Anh Mỹ: "BAY-zel". Từ này có vần với "hazel". IPA: /ˈbeɪzˌəl/