Tệp Bazel Lockfile

Báo cáo vấn đề Xem nguồn Hằng đêm · 7,3 · 7.2 · 7.1 · 7 · 6,5

Tính năng tệp khoá trong Bazel cho phép ghi lại các phiên bản hoặc phần phụ thuộc của thư viện phần mềm hoặc gói mà dự án yêu cầu. Nó đạt được điều này bằng cách lưu trữ kết quả của độ phân giải và tiện ích mở rộng mô-đun đánh giá. Tệp Lockfile thúc đẩy các bản dựng có thể tái tạo, đảm bảo tính nhất quán môi trường phát triển riêng biệt. Ngoài ra, tính năng này còn nâng cao hiệu quả của bản dựng bằng cách cho phép Bazel bỏ qua quy trình phân giải khi không có thay đổi nào trong dự án phần phụ thuộc. Hơn nữa, tệp khoá cải thiện độ ổn định bằng cách ngăn chặn các bản cập nhật không mong muốn hoặc những thay đổi có thể gây lỗi trong thư viện bên ngoài, do đó giảm nguy cơ tạo ra lỗi.

Tạo tệp Lockfile

Tệp khoá được tạo trong thư mục gốc của không gian làm việc với tên MODULE.bazel.lock. Mã này được tạo hoặc cập nhật trong quá trình xây dựng, đặc biệt là sau khi đánh giá độ phân giải và tiện ích của mô-đun. Tệp khoá ghi lại trạng thái hiện tại của dự án, bao gồm tệp MODULE, cờ, ghi đè và các thông tin có liên quan khác. Quan trọng là chỉ bao gồm các phần phụ thuộc có trong lệnh gọi hiện tại của bản dựng.

Khi các thay đổi xảy ra trong dự án ảnh hưởng đến các phần phụ thuộc của dự án, tệp khoá sẽ tự động cập nhật để phản ánh trạng thái mới. Điều này đảm bảo rằng tệp khoá vẫn tập trung vào tập hợp phần phụ thuộc cụ thể cần thiết cho bản dựng, cung cấp bản trình bày chính xác về dự án đã được giải quyết phần phụ thuộc.

Sử dụng tệp Lockfile

Tệp khoá có thể được kiểm soát bằng cờ này --lockfile_mode đến tuỳ chỉnh hành vi của Bazel khi trạng thái dự án khác với tệp khoá. Các chế độ hiện có là:

  • update (Mặc định): Nếu trạng thái dự án khớp với tệp khoá, thì giá trị kết quả giải quyết ngay lập tức được trả về từ tệp khoá. Nếu không, độ phân giải được thực thi, và tệp khoá được cập nhật để phản ánh trạng thái.
  • error: Nếu trạng thái dự án khớp với tệp khoá, thì kết quả giải quyết sẽ là được trả về từ tệp khoá. Nếu không, Bazel sẽ gửi một lỗi cho biết các biến thể giữa dự án và tệp khoá. Chế độ này đặc biệt hữu ích khi bạn muốn đảm bảo rằng các phần phụ thuộc của dự án vẫn còn không thay đổi và mọi khác biệt đều được coi là lỗi.
  • off: Tệp khoá chưa được kiểm tra.

Lợi ích của Lockfile

Tệp khóa mang lại nhiều lợi ích và có thể được sử dụng theo nhiều cách khác nhau:

  • Bản dựng có thể tái tạo. Bằng cách ghi lại các phiên bản hoặc phần phụ thuộc cụ thể của các thư viện phần mềm, tệp khoá đảm bảo rằng các bản dựng có thể tái tạo trên nhiều môi trường và theo thời gian. Nhà phát triển có thể dựa vào kết quả nhất quán và dễ dự đoán khi xây dựng dự án.

  • Bỏ qua độ phân giải hiệu quả. Tệp Lockfile cho phép Bazel bỏ qua trong quá trình giải quyết nếu không có thay đổi nào trong các phần phụ thuộc của dự án vì bản dựng cuối cùng. Điều này giúp cải thiện đáng kể hiệu quả xây dựng, đặc biệt là trong trong những tình huống mà việc giải quyết có thể tốn thời gian.

  • Độ ổn định và giảm rủi ro. Tệp Lockfile giúp duy trì sự ổn định bằng cách ngăn chặn các thay đổi không mong muốn hoặc có thể gây lỗi trong thư viện bên ngoài. Theo khoá các phần phụ thuộc thành các phiên bản cụ thể, dẫn đến nguy cơ gây ra lỗi do số lượng bản cập nhật không tương thích hoặc chưa được kiểm thử đã bị giảm.

Nội dung tệp khoá

Tệp khoá chứa tất cả thông tin cần thiết để xác định xem trạng thái dự án đã thay đổi. Báo cáo này cũng bao gồm kết quả của quá trình xây dựng dự án ở trạng thái hiện tại. Tệp khoá bao gồm hai phần chính:

  1. Giá trị đầu vào của độ phân giải mô-đun, chẳng hạn như moduleFileHash, flagslocalOverrideHashes, cũng như kết quả của độ phân giải, vốn là moduleDepGraph.
  2. Đối với mỗi tiện ích mô-đun, tệp khoá bao gồm các dữ liệu đầu vào ảnh hưởng đến tiện ích đó, được biểu thị bằng transitiveDigest và kết quả khi chạy tiện ích đó được gọi là generatedRepoSpecs

Dưới đây là ví dụ minh hoạ cấu trúc của tệp khoá, cùng với nội dung giải thích cho từng phần:

{
  "lockFileVersion": 1,
  "moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
  "flags": {
    "cmdRegistries": [
      "https://bcr.bazel.build/"
    ],
    "cmdModuleOverrides": {},
    "allowedYankedVersions": [],
    "envVarAllowedYankedVersions": "",
    "ignoreDevDependency": false,
    "directDependenciesMode": "WARNING",
    "compatibilityMode": "ERROR"
  },
  "localOverrideHashes": {
    "bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
  },
  "moduleDepGraph": {
    "<root>": {
      "name": "",
      "version": "",
      "executionPlatformsToRegister": [],
      "toolchainsToRegister": [],
      "extensionUsages": [
        {
          "extensionBzlFile": "extension.bzl",
          "extensionName": "lockfile_ext"
        }
      ],
      ...
    }
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
      "generatedRepoSpecs": {
        "hello": {
          "bzlFile": "@@//:extension.bzl",
          ...
        }
      }
    }
  }
}

Hàm băm tệp mô-đun

moduleFileHash đại diện cho hàm băm của nội dung tệp MODULE.bazel. Nếu bất kỳ thay đổi nào xảy ra trong tệp này, giá trị băm sẽ khác.

Cờ

Đối tượng Flags lưu trữ tất cả cờ có thể ảnh hưởng đến kết quả phân giải.

Hàm băm ghi đè cục bộ

Nếu mô-đun gốc có local_path_overrides, phần này sẽ lưu trữ hàm băm của tệp MODULE.bazel trong kho lưu trữ cục bộ. Cho phép theo dõi các thay đổi cho phần phụ thuộc này.

Biểu đồ phần phụ thuộc mô-đun

moduleDepGraph thể hiện kết quả của quá trình phân giải bằng cách sử dụng dữ liệu đầu vào được đề cập ở trên. Hàm này tạo thành biểu đồ phần phụ thuộc của tất cả các mô-đun cần thiết để chạy dự án.

Tiện ích mô-đun

Mục moduleExtensions là một bản đồ chỉ bao gồm các tiện ích được sử dụng trong lệnh gọi hiện tại hoặc đã được gọi trước đó, đồng thời loại trừ mọi tiện ích không còn được sử dụng. Nói cách khác, nếu tiện ích không được sử dụng trên biểu đồ phần phụ thuộc, thì phần này sẽ bị xoá khỏi moduleExtensions bản đồ.

Mỗi mục nhập trong bản đồ này tương ứng với một tiện ích đã sử dụng và được xác định theo chứa tệp và tên. Giá trị tương ứng cho mỗi mục nhập chứa thông tin liên quan liên quan đến tiện ích đó:

  1. transitiveDigest thông báo về quá trình triển khai tiện ích và tệp .bzl bắc cầu.
  2. generatedRepoSpecs là kết quả của việc chạy tiện ích đó với đầu vào hiện tại.

Một yếu tố khác có thể ảnh hưởng đến kết quả của phần mở rộng là việc sử dụng phần mở rộng. Mặc dù không được lưu trữ trong tệp khoá, nhưng các trường hợp sử dụng vẫn được xem xét khi so sánh trạng thái hiện tại của tiện ích này với tiện ích trong tệp khoá.

Các phương pháp hay nhất

Để tối đa hoá lợi ích của tính năng tệp khoá, hãy cân nhắc những điều tốt nhất sau đây thực tiễn:

  • Thường xuyên cập nhật tệp khoá để phản ánh những thay đổi trong các phần phụ thuộc của dự án hoặc . Điều này giúp đảm bảo rằng các bản dựng tiếp theo được dựa trên được cập nhật và chính xác về các phần phụ thuộc.

  • Đưa tệp khoá vào trình quản lý phiên bản để tạo điều kiện cộng tác và đảm bảo rằng tất cả thành viên trong nhóm đều có quyền truy cập vào cùng một tệp khoá, môi trường phát triển nhất quán trong suốt dự án.

Bằng cách làm theo các phương pháp hay nhất này, bạn có thể sử dụng tệp khoá một cách hiệu quả trong Bazel, mang lại hiệu quả, đáng tin cậy và cộng tác hơn quy trình phát triển phần mềm.