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

Báo cáo vấn đề Xem nguồn Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Nếu bạn có câu hỏi 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á các bản dựng và kiểm thử phần mềm. Các tác vụ bản dựng được hỗ trợ bao gồm việc 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, cũng như 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. Lớp 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ả 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ỏ đượ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ả 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 để 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 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 tệp BUILD, mỗi thư viện, 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 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 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ả bản dựng đều tăng dần và sẽ luôn tạo ra kết quả giống 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ó 100 nghìn 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 cung cấp quyền kiểm soát rất chính xác đối với những lệnh được gọi để tạo tệp, nhưng người dùng phải viết đúng quy tắ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 sẵn cho "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ữ". Các quy tắc này đã được kiểm thử thực tế để đảm bảo độ tin cậy.
  • 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 phân chia 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 các đơn vị cần tạo lại. Điều này 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: 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 hành động. Đ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ại Twitter, Foursquare và Facebook tạo ra và phát triển. Các công cụ này đượ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à giải pháp 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 để xây dựng phần mềm máy chủ nội bộ. Công cụ này cũng đã 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 đã viết lại công cụ nội bộ dưới dạng nguồn mở chưa? Đó 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 xây dựng Bazel?

Cách đây rất lâu, Google đã xây dựng phần mềm bằ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 các nhà phát triển và sự nhanh nhạy 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 bản 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 để 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 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 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 quản lý 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 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 chúng 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 họ ở bản sửa đổi chính.

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 ta có thể dự đoán những chương trình và chương trình kiểm thử nào sẽ chịu ảnh hưởng của một thay đổi và kiểm tra chúng trước khi gửi.

Bạn có thể xem thêm thông tin cơ bản về quy trình phát triển tại Google trên blog 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ó đoán sẽ làm mất đi niềm vui khi 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ỉ biên dịch lại các tệp cần biên dịch lại. Tương tự, trình kiểm thử có thể bỏ qua việc chạy lại các kiểm thử mà trình kiểm thử biết là không thay đổi.
  • Bazel tạo ra kết quả có tính quyết định. Điều này giúp loại bỏ sự chênh lệch giữa các bản dựng tăng dần 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 thay đổi duy nhấ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ụ, thu được 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 giỏi nhất ở điểm nào?

Bazel nổi bật trong việc xây dựng và kiểm thử dự án nhờ các thuộc tính sau:

  • 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
  • Dự án triển khai trên nhiều nền tảng
  • Các dự án có quy trình kiểm thử chuyên sâu

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à nền tảng đó có JDK.

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

  • Bazel cố gắng lưu vào bộ nhớ đệm một cách thông minh. Điều này có nghĩa là không nên chạy các thao tác xây dựng có kết quả 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.
    • Một bước kiểm thử kết nối với thực thể đảm bảo chất lượng của trang web.
    • 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 dài, tuần tự, thì Bazel có thể không giúp được nhiều. Bạn sẽ có được tốc độ nhanh hơn bằng cách chia các bước dài thành các mục tiêu nhỏ, riêng biệt 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 (quy tắc shell, Java và C++) đượ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 sự cố. 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 ổn định. 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 ở dạng tệp nhị phân có ổn định không?

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 đúng với cơ sở mã nguồn mở của chúng ta.

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?

Với Docker, bạn có thể dễ dàng tạo hộp cát bằng 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 /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 Makefile được viết không hoàn chỉnh bên trong vùng chứa Docker vẫn có thể mang lại kết quả không thể dự đ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ác 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ở ("sửa lỗi 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ể tạo 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 ứng dụng 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 vùng chứa Docker.

Bazel có các quy ước để định 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 con. Bạn có thể đóng gói các môi trường như vậy dưới dạng 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 của chúng tôi để tạo hình ảnh Docker có thể tái tạo.

Bazel có tự động tạo bản dựng 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 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ễ gặp phải vấn đề này.
  • 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 ở đây.
  • Tránh các quy trình sử dụng số ngẫu nhiên, đặc biệt là việc duyệt qua từ điển được tạo ngẫu nhiên 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 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/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 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 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ể sử dụng Bazel cho dự án INSERT LANGUAGE HERE không?

Bazel có thể mở rộng. Mọi người đều 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 đề xuất và awesomebazel.com để biết danh sách toàn diện 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 tiện ích, 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ả hoạt động phát triển đều được thực hiện công khai?

Chúng ta 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 phát hành mã nguồn mở Bazel chưa?

Việc mở nguồn Bazel đang trong quá trình phát triển. Cụ thể, chúng tôi vẫn đang nỗ lực để mở nguồn:

  • Nhiều chương trình kiểm thử tích hợp và đơn vị (giúp bạn dễ dàng đóng góp bản vá hơn).
  • Tích hợp đầy đủ IDE.

Ngoài mã, chúng tôi muốn tất cả các hoạt động xem xét 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 ta chưa đến đó, 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 tính 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 đ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ý trong quá trình chuyển đổi sang mô hình mở.

Có phần nào của Bazel sẽ không bao giờ được phát hành 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ệ 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). 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 này?

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ở 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 cung cấp 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 thiếu tính năng hỗ trợ Windows ban đầu 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 đã phát triển 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 "Bazel" như thế nào?

Tương tự như "basil" (rau thơm) trong tiếng Anh Mỹ: "BAY-zel". Từ này có vần với "hazel" (lạc). IPA: /ˈbeɪzˌəl/