1 điểm bởi GN⁺ 3 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Trong 6 tháng qua, crates.io đã giới thiệu trình xem mã nguồn để kiểm tra trực tiếp các gói đã được phát hành, áp dụng hệ thống tài khoản độc lập với GitHub, đồng thời tăng cường hướng dẫn về bảo mật và các lựa chọn thay thế bằng thư viện chuẩn
  • Tab Code mới hỗ trợ tìm kiếm tệp, tô sáng cú pháp và chọn dòng có thể chia sẻ; đồng thời chỉ tải những tệp cần thiết mà không tạo tải cho máy chủ API nhờ ZIP·manifest JSON trên CDN và HTTP range request
  • Theo RFC #3946, dự án đã bắt đầu triển khai tên người dùng riêng của crates.io và dự định hỗ trợ thêm các nhà cung cấp xác thực ngoài GitHub trong tương lai sau khi hoàn tất đổi tên người dùng và rà soát bảo mật
  • Frontend đã được chuyển hoàn toàn từ Ember.js sang Svelte; đồng thời tìm kiếm, tra cứu reverse dependency, cache CDN và xử lý Git index cũng được cải thiện theo hướng tăng hiệu năng và độ ổn định
  • Các trang gói nay hiển thị cảnh báo ngừng bảo trì từ RustSec và API thay thế trong thư viện chuẩn như std::sync::LazyLock, giúp kiểm tra dependency và loại bỏ những dependency không cần thiết

Trình xem mã nguồn để kiểm tra các gói đã phát hành

  • Trong tab Code mới trên trang gói, bạn có thể duyệt các tệp của từng phiên bản đã phát hành ngay trong crates.io
    • Tab này hiển thị các tệp mà cargo thực sự tải về khi thêm dependency, chứ không phải kho mã nguồn được liên kết
    • Bạn cũng có thể xem những tệp không tồn tại trong repository, chẳng hạn Cargo.toml đã được chuẩn hóa do cargo tạo ra, nên việc kiểm tra dependency trở nên dễ dàng hơn
  • Trình xem hỗ trợ tìm kiếm cây tệp, tô sáng cú pháp và chọn dòng theo kiểu GitHub
    • Khi bấm hoặc kéo trên số dòng, hệ thống sẽ tạo URL có thể chia sẻ theo dạng #L10-L20
  • Máy chủ tạo tệp ZIP và manifest JSON mô tả cấu trúc tệp cho mọi phiên bản đã phát hành
    • Vì tệp .cratecargo sử dụng là tarball gzip không hỗ trợ truy cập ngẫu nhiên, nên hệ thống sẽ đóng gói lại thành ZIP có thể duyệt được trong tác vụ nền
    • ZIP và manifest được cung cấp qua CDN tĩnh
    • Frontend nhận manifest trước, sau đó chỉ tải từng tệp khi cần bằng HTTP range request
    • Việc duyệt mã nguồn hầu như không tạo thêm tải cho máy chủ API của crates.io, và các phiên bản cũ cũng đã được xử lý hàng loạt để hỗ trợ cả những bản phát hành trước đây
  • Thư viện render của trình xem mã vốn là trình render khác biệt, và nhóm cũng đang phát triển trình xem so sánh giữa các phiên bản dựa trên cùng hạ tầng đó
    • Khi hoàn tất, bạn sẽ có thể xem chính xác các thay đổi giữa hai phiên bản đã phát hành ngay trên crates.io

Tài khoản crates.io tách khỏi GitHub

  • Cuối tháng 5, nhóm crates.io đã phê duyệt RFC #3946
  • Trước đây, đăng nhập GitHub và danh tính trên crates.io gắn chặt với nhau, nên tên người dùng cũng được quyết định bởi tài khoản GitHub; RFC này đưa vào tên người dùng riêng của crates.io độc lập với tài khoản liên kết
  • Tên người dùng riêng này là điều kiện tiên quyết để hỗ trợ đăng nhập qua các nhà cung cấp xác thực ngoài GitHub trong tương lai
  • Việc triển khai đã bắt đầu, nhưng tính năng lớn chưa hoàn thiện mà người dùng sẽ thấy là đổi tên người dùng
    • Sau khi hoàn tất phần này, nhóm sẽ tiếp tục với các RFC bổ sung và triển khai đăng nhập bằng những nhà cung cấp xác thực khác
    • Vì tác động trực tiếp đến xác thực và bảo mật tài khoản, việc phát hành sẽ được thực hiện chậm rãi theo từng bước nhỏ và được rà soát cẩn trọng

Cảnh báo bảo mật và hướng dẫn thay thế bằng thư viện chuẩn

  • Tab Security hiện có vẫn hiển thị các khuyến cáo bảo mật từ cơ sở dữ liệu RustSec, và nay với các gói mà RustSec đánh dấu là đã ngừng bảo trì, đầu trang còn xuất hiện thêm banner cảnh báo
    • Từ banner này, bạn có thể đi đến khuyến cáo tương ứng chứa thông tin chi tiết và các lựa chọn thay thế nếu có
  • Với các gói có chức năng đã được tích hợp vào thư viện chuẩn, trang sẽ hiển thị banner “You might not need this dependency
    • Ví dụ, từ Rust 1.80, lazy_static có thể được thay thế bằng std::sync::LazyLock
    • Trong danh sách dependency, các gói đã có thay thế cũng sẽ có biểu tượng bóng đèn nhỏ dẫn tới cùng hướng dẫn này
  • Dữ liệu liên quan được quản lý trong kho mới rust-lang/std-replacement-data
    • Chỉ chấp nhận các mục thay thế bằng thư viện chuẩn
    • Mọi mục đều phải trích dẫn API std, core, alloc đã ổn định và phiên bản Rust tương ứng
    • Trước khi thêm mục mới, nhóm sẽ thông báo cho maintainer của gói và dành thời gian để nhận phản hồi
    • Có thể đề xuất mục mới cho kho này, và dữ liệu tích lũy được cũng có thể dùng trong các công cụ khác

Hoàn tất chuyển frontend sang Svelte

  • Thử nghiệm chuyển frontend crates.io từ Ember.js sang Svelte đã kết thúc thành công
    • Frontend mới đã đạt mức tương đương về chức năng với hệ thống cũ
    • Sau đợt thử nghiệm công khai vào tháng 4, hệ thống đã được chuyển thành frontend mặc định vào đầu tháng 5
    • Ứng dụng Ember.js đã bị xóa khỏi repository
  • Đây là một bản chuyển đổi một-một giữ nguyên thiết kế và chức năng hiện có, nhằm để người dùng hầu như không cảm nhận sự thay đổi
  • Nhờ sử dụng framework hiện đại, nhóm và cộng tác viên có thể hạ thấp rào cản tham gia của người đóng góp mới và tăng tốc độ phát triển lặp lại; trình xem mã nguồn là một ví dụ cho điều đó
  • Nhóm cũng gửi lời cảm ơn tới cả đội ngũ Ember.js mà crates.io đã dùng trong nhiều năm và đội ngũ Svelte đã hỗ trợ quá trình chuyển đổi

Trang lỗi Ferris

  • Ferris trên các trang lỗi của crates.io giờ sẽ dõi theo con trỏ chuột bằng mắt
  • Trang lỗi 404 cũng có thêm một tương tác nhỏ

Hiệu năng tìm kiếm và tra cứu reverse dependency

  • Trước đây, tìm kiếm theo mức độ liên quan phải tính xếp hạng cho mọi gói khớp với truy vấn, nên với các từ khóa ngắn hoặc phổ biến có thể mất 1–2 giây
    • Giờ đây, phạm vi tính xếp hạng được giới hạn ở 1.000 gói khớp có số lượt tải gần đây cao nhất
  • Endpoint reverse dependency không còn tính lại toàn bộ tập gói phụ thuộc trong mỗi yêu cầu
    • Kết quả được lấy từ bảng tính toán trước được đồng bộ bằng trigger cơ sở dữ liệu
    • Cách này thay thế các phép join tốn kém bằng index scan có giới hạn, làm giảm mạnh khả năng bị timeout

Tài liệu kiến trúc và render Markdown

  • ARCHITECTURE.md đã được làm lại toàn diện, tập trung vào các hệ thống cấp cao của crates.io và cách chúng liên kết với nhau
    • Quy trình xử lý diễn ra khi chạy cargo publish
    • Lý do một lượt tải gói thông thường không đi qua máy chủ API
    • Cách tính số lượt tải từ log truy cập CDN cũng được đưa vào
  • README giờ render danh sách định nghĩa, một phần mở rộng Markdown được dùng rộng rãi
    • Trình render Markdown comrak vốn đã hỗ trợ danh sách định nghĩa, nhưng trước đó phần mở rộng này chưa được bật

Cải thiện hiệu quả cache CDN

  • Các tệp được tải lên CDN tĩnh nay được thêm metadata cache tag
    • Thay vì gửi yêu cầu vô hiệu hóa riêng cho từng URL tệp, giờ có thể vô hiệu hóa toàn bộ các tệp cache của một gói hoặc một bản phát hành chỉ trong một lần
  • Header phản hồi toàn cục Vary: Cookie, vốn cản trở việc cache CDN cho phản hồi API công khai và tài sản frontend, đã được gỡ bỏ
    • Thay vào đó, các phản hồi theo từng người dùng sẽ áp dụng Cache-Control: no-store
    • Kết quả là tỷ lệ cache hit ở edge CDN được cải thiện

Khả năng truy cập và xử lý Git index

  • crates.io đã cải thiện khả năng truy cập cho người dùng công cụ đọc màn hình
    • Ẩn các biểu tượng trang trí khỏi cây khả năng truy cập
    • Sửa lại phân cấp tiêu đề
    • Áp dụng đúng markup danh sách cho các danh sách
    • Đưa vào kiểm thử snapshot ARIA để ngăn lỗi hồi quy lọt qua mà không bị phát hiện
    • Trong vài tháng tới, nhóm sẽ tiếp tục cải thiện khả năng truy cập
  • Bản sao cục bộ của Git index trong background worker đã được chuyển sang repository bare và shallow
    • Việc này loại bỏ khoảng 250.000 tệp checkout và toàn bộ lịch sử commit khỏi đĩa
    • Đồng thời cải thiện hiệu năng xử lý trong bối cảnh tần suất phát hành gói ngày càng tăng
  • Việc squash index định kỳ nay dùng GitHub API thay vì tạo các Git pack lớn ở máy cục bộ
    • Cách tạo pack cục bộ trước đây từng gây thiếu bộ nhớ trên worker production

Kênh phản hồi

1 bình luận

 
Các ý kiến trên Lobste.rs
  • Thật vui khi thấy công việc nhằm tách tài khoản crates.io khỏi GitHub đang được tiến hành

    • Trước đây tôi từng thích tính năng đăng nhập vào nhiều dịch vụ bằng tài khoản GitHub, nhưng giờ thấy nó kém hấp dẫn hơn. Tailscale hỗ trợ nhà cung cấp danh tính OIDC, nên tôi đã cấu hình để đăng nhập bằng Codeberg và WebFinger trên tên miền của mình
      Để đăng nhập bằng email thuộc tên miền riêng example@example.com, hãy đặt một tệp JSON tại https://example.com/.well-known/webfingersubjectacct:example@example.comhref của nhà phát hành OpenID Connect là https://codeberg.org
      Trong phần cài đặt Codeberg, tạo một ứng dụng OAuth2 có URI chuyển hướng là https://login.tailscale.com/a/oauth_response, rồi nhập Client IDClient Secret được cấp vào Tailscale là được. Có vẻ crates.io sau này cũng sẽ cung cấp cách tương tự
  • Tôi không biết gần đây mức độ cải thiện của crates.io lại lớn đến vậy. Thường thì tôi tìm trên lib.rs trước, nhưng có lẽ thói quen đó sẽ sớm thay đổi; thay đổi tôi thích nhất là Ferris

    • Tò mò không biết bao nhiêu phần trong các cải tiến này là nhờ việc đưa agent vào sử dụng
  • Sự thay đổi ở mắt của Ferris không hợp lý lắm về mặt vật lý. Phần màu trắng trong con mắt đen là điểm sáng phản xạ gương, nên nếu con trỏ chuột là nguồn sáng thì cũng khó gọi đó là cách diễn tả mắt đang dõi theo con trỏ

  • Khi kiểm tra phụ thuộc, trước tiên tôi tạo liên kết tượng trưng từ ~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ đến ~/cargosrc để dễ truy cập các tệp mà Cargo đã tải xuống
    Với mỗi phụ thuộc cần kiểm tra, tôi sao chép kho Git, checkout phiên bản mục tiêu, xóa cục bộ các tệp đang được theo dõi, rồi gửi SIGSTOP tới tiến trình rust-analyzer. Tôi thêm phụ thuộc vào Cargo.toml của dự án và chạy cargo fetch, sau đó sao chép nội dung thư mục $dependency-$version đã tải xuống vào kho đã clone, commit, rồi xem xét khác biệt bằng trình xem lịch sử Git
    Khi xem xét xong, tôi dùng script lưu tổ hợp phụ thuộc・phiên bản・hash trong Cargo.lock vào một cơ sở dữ liệu đáng tin cậy để không phải kiểm tra lại cùng phiên bản. Quy trình trông có vẻ phức tạp, nhưng phần lớn đã được tự động hóa nên hiệu quả hơn UI web; sẽ rất tốt nếu Cargo hỗ trợ quy trình rà soát như vậy trên dòng lệnh. Tôi cũng tò mò liệu có plugin nào hỗ trợ chính việc rà soát, hơn là các công cụ như cargo-crev hay không

  • Cách triển khai trong đó frontend chỉ lấy manifest rồi tải từng tệp khi cần bằng yêu cầu phạm vi HTTP nằm ở đây, và sử dụng DecompressionStream tích hợp sẵn trong trình duyệt