Phiên bản nhỏ, thay đổi đột phá – Stitcher.io

  • Post category:lập trình


Khi đồng nghiệp Sebastian của tôi viết về việc việc thay đổi các phiên bản chính không phải là một sự thay đổi đột phá, tôi hoàn toàn đồng ý.

Tôi không thể nữa. Ít nhất, không phải với cách hoạt động của nhà soạn nhạc ngày nay.

Hãy xem ngày hôm qua, chúng tôi tình cờ gặp phải một sự thay đổi đột phá. Tuy nhiên, chúng tôi đã không thực hiện bất kỳ nâng cấp phiên bản lớn nào. May mắn thay, một đồng nghiệp khác của tôi, Ruben, đã phát hiện ra vấn đề trước khi đưa nó vào sản xuất.

Đây là những gì đã xảy ra.

Một trong những dự án của chúng tôi hiện sắp kỷ niệm hai năm thành lập, vì vậy đủ để nói rằng nó đã có khá nhiều thay đổi về phiên bản. Sau hai năm phát triển, đây là một số gói chúng tôi đã sử dụng:

{
    "laravel/framework": "^6.5",
    "league/commonmark": "^0.17.5",
    "spatie/laravel-view-components": "^1.2",

    
}

Đầu tiên, laravel/framework:^6.5. Chúng tôi thường đợi một hoặc hai tháng trước khi cập nhật lên phiên bản Laravel chính tiếp theo. Tính đến hôm nay, chúng tôi đang chạy phiên bản 7 — cần thiết để khắc phục sự cố.

Tiếp theo có league/commonmark:^0.17.5; một phần phụ thuộc rất cụ thể, được thêm vào tháng 5 năm 2018. Vào thời điểm đó, phần phụ thuộc cụ thể này là cần thiết: theo nhật ký thay đổi, nó Fixed incorrect version constant value (again). Nếu chúng tôi không sử dụng phiên bản này, nó sẽ xung đột với các gói khác.

Hai năm trôi qua, và league/commonmark kể từ đó đã gắn thẻ bản phát hành ổn định đầu tiên. Đây là điều đáng lẽ họ phải làm sớm hơn – nhưng đó là chủ đề cho một ngày khác.

Cuối cùng cũng có spatie/laravel-view-components:^1.2. Một gói đã được lưu trữ gần đây, ủng hộ các thành phần phiến của Laravel trong phiên bản 7. Một lần nữa, trước đây việc sử dụng gói này rất có ý nghĩa. Chúng tôi có thể loại bỏ nó vào một thời điểm nào đó trong tương lai, nhưng điều này tất nhiên đòi hỏi thời gian và chi phí cho khách hàng của chúng tôi. Đó không phải là điều chúng ta có thể “chỉ cần làm”.

Với giai đoạn đã được thiết lập, đã đến lúc xem xét vấn đề. Hôm qua chúng tôi đã chạy một composer updatevà mọi thứ đã tan vỡ.

Cụ thể hơn, chúng tôi spatie/laravel-view-components gói đơn giản là ngừng hoạt động. Thay vì hiển thị thành phần khung nhìn, thay vào đó, nó chỉ hiển thị thẻ kết xuất. Hóa ra đó là một sự cố đã biết kể từ phiên bản 1.3.0và cố định trong 1.3.1. Bản sửa lỗi này đã tồn tại khi chúng tôi chạy thử nghiệm thảm họa composer update, nhưng chúng tôi chưa bao giờ nhận được nó. Của chúng tôi spatie/laravel-view-components dường như đã bị khóa 1.3.0và không muốn cập nhật lên 1.3.1.

Bất cứ khi nào bạn thấy mình gặp khó khăn như vậy, đừng hoảng sợ và giữ bình tĩnh: nhà soạn nhạc có thể giúp bạn. Đơn giản chỉ cần sử dụng composer why-not spatie/laravel-view-components:1.3.1 và nó sẽ cho bạn biết chính xác điều gì sai.

Hoá ra là với spatie/laravel-view-components:1.3.1của nó laravel/framework phiên bản phụ thuộc đã bị thay đổi từ ^6.0 ĐẾN ^6.18.

Bản thân điều đó không phải là vấn đề, chúng tôi yêu cầu laravel/framework:^6.5 trong dự án của chúng tôi, vì vậy chúng tôi có thể tải ^6.18 bình thường.

Thật không may điều đó đã không xảy ra. Bạn thấy đấy, laravel/framework đã thêm một phụ thuộc vào league/commonmark:^1.1 trong phiên bản 6.10. Trong thực tế, sự bổ sung này có tác dụng tương tự như việc cập nhật phiên bản chính của một phần phụ thuộc: từ không có gì đến ^1.1.

Một lần nữa, sự thay đổi đó bản thân nó không phải là một sự thay đổi mang tính đột phá, tuy nhiên nó làm ngăn chặn laravel/framework trong dự án của chúng tôi từ khi cập nhật cao hơn 6.9vì yêu cầu của chúng tôi về league/commonmark:^0.17.5. Điều đó lại ngăn cản spatie/laravel-view-components cập nhật từ 1.3.0 ĐẾN 1.3.1trong đó có một bản sửa lỗi rất cần thiết.


Vậy ai là người có lỗi? Trước tiên hãy chỉ tay vào tôi: lẽ ra chúng ta nên cập nhật league/commonmark sớm hơn. Bạn cũng có thể nói rằng việc kết hợp sửa lỗi và nâng cấp phiên bản phụ thuộc, như spatie/laravel-view-components đã làm với 1.3.1, nên tránh. Tuy nhiên, nếu cần có phiên bản nâng cấp để bản sửa lỗi hoạt động thì bạn có thể làm được rất ít.

Bạn có thể nói rằng laravel/framework lẽ ra không nên cập nhật một trong các phần phụ thuộc (ngầm) của nó, tuy nhiên đó là việc hoàn toàn bình thường, đặc biệt nếu bản cập nhật khắc phục sự cố bảo mật.

Nhân tiện, giải pháp bao gồm việc cập nhật laravel/framework ĐẾN ^7.0 — dù sao thì sớm hay muộn chúng tôi cũng phải làm điều này — và loại bỏ league/commonmark sự phụ thuộc. Vì vậy, tôi không nghĩ rằng bất kỳ nhà cung cấp nguồn mở nào cũng nên tránh sự thay đổi này. Mã nguồn mở sẽ thúc đẩy chúng ta cập nhật thường xuyên, bản thân tôi cũng thường xuyên khuyến khích điều đó.

Tuy nhiên, vấn đề thực sự là nhà soạn nhạc chưa bao giờ thông báo cho chúng tôi rằng laravel/framework không thể cập nhật thêm 6.9 vì những xung đột cơ bản. Nếu không quản lý cẩn thận từng phần phụ thuộc, bạn có nguy cơ bị mắc kẹt trên một phần phụ thuộc đã lỗi thời, điều này có thể ngăn cản việc cài đặt các bản sửa lỗi rất cần thiết.

Theo như tôi biết, không có lựa chọn nào có thể được chuyển đến composer update có thể thông báo cho bạn về những tình huống như vậy và tôi nghĩ đó sẽ là một bổ sung tốt trong tương lai.

Đồng nghiệp Freek của tôi đã chỉ ra rằng có một thư viện bên ngoài thực hiện chính xác điều này: https://github.com/Soullivaneuh/composer-versions-check. Thật tuyệt khi có chức năng này được tích hợp sẵn trong trình soạn thảo.

Nhận thấy một tpyo? Bạn có thể gửi PR để sửa nó. Nếu bạn muốn cập nhật về những gì đang diễn ra trên blog này, bạn có thể Theo dõi danh sách gửi thư của tôi: gửi email đến [email protected] và tôi sẽ thêm bạn vào danh sách.



Trả lời