Tại sao thích một trình quản lý gói hơn một thư mục thư viện?


68

Khi tôi nghĩ về những ưu và nhược điểm của thư mục tĩnh và trình quản lý gói, tôi cảm thấy thư mục thư viện là cách tiếp cận tốt hơn.

Ưu điểm tôi thấy với một thư mục thư viện:

  1. Không cần một công cụ bên ngoài để quản lý các gói.
  2. Không cần kết nối internet để xây dựng.
  3. Xây dựng nhanh hơn (không kiểm tra gói).
  4. Môi trường đơn giản hơn (ít kiến ​​thức cần thiết).

Ưu điểm tôi thấy với một người quản lý gói:

  1. Giúp với các cây phụ thuộc phức tạp (và có thể được quản lý tải xuống một phụ thuộc cùng với tất cả các phụ thuộc của nó).
  2. Giúp kiểm tra nếu có phiên bản mới.

Có vẻ như ngành công nghiệp đã quyết định đi theo con đường quản lý gói cho hầu hết mọi thứ được xây dựng ngày nay. Vì vậy, tôi đang thiếu gì?


33
Tôi nghĩ rằng bạn đang thực sự hỏi về lợi ích của việc đóng gói so với yêu cầu thư viện. Bạn sẽ nhận được câu trả lời phù hợp hơn nếu bạn sử dụng các thuật ngữ đó.
Kilian Foth

3
Điều gì ngăn cản bạn tạo ra một container docker cho tác nhân xây dựng, chứa mọi thứ cần thiết và thậm chí có thể không cho phép truy cập internet (điều đó không cần thiết cho việc xây dựng)? Tôi nghĩ rằng bạn không thích học một công cụ mới hơn là thực sự xem xét các đối số. Bạn đã bao giờ làm việc trên một dự án lớn sử dụng các phụ thuộc được quản lý bằng tay chưa? Nó không tuyệt vời như bạn làm.
Kayaman

3
@Kayaman: học một công cụ mới tiêu tốn thời gian của nhóm (tiền) và tôi muốn xác minh rằng chúng tôi đang đầu tư vào đúng thứ. Kinh nghiệm của tôi với các dự án lớn là sự phụ thuộc khá ổn định [chúng hầu như không bao giờ thay đổi] và đó có thể là lý do tại sao một người quản lý gói có vẻ đắt đối với tôi. Dù sao, tôi chỉ liệt kê pro và con sau khi làm việc một thời gian với Nuget và dành thời gian cho nó.
Ignacio Soler Garcia

2
@sebkur Bạn có thể giữ các bản sao địa phương của tất cả các gói của bạn. Chúng tôi giữ các phiên bản hiện tại của tất cả các phụ thuộc của chúng tôi dưới sự kiểm soát nguồn cục bộ. Lần duy nhất người quản lý gói cần kết nối là khi chúng tôi nâng cấp.
17 của 26

1
@ 17of26: bạn không học cách định cấu hình tác nhân xây dựng để cài đặt nuget và chạy nó theo yêu cầu trong 10 phút. Bạn cũng không làm gì nếu bạn có một dự án đa giải pháp trong đó các dự án tương tự được sử dụng trong các giải pháp khác nhau.
Ignacio Soler Garcia

Câu trả lời:


122

Một điểm quan trọng bị thiếu trong các câu trả lời khác:

Sử dụng trình quản lý gói có nghĩa là có một cấu hình cho biết bạn đang sử dụng phiên bản thư viện nào và đảm bảo rằng thông tin cấu hình thực sự chính xác.

Biết thư viện nào bạn sử dụng và phiên bản nào là rất quan trọng nếu bạn:

  • cần cập nhật thư viện do lỗi nghiêm trọng / lỗ hổng bảo mật;
  • hoặc chỉ cần kiểm tra xem một lỗ hổng bảo mật được công bố có ảnh hưởng đến bạn hay không.

Ngoài ra, khi bạn thực sự cập nhật, trình quản lý gói (thường) đảm bảo mọi phụ thuộc bắc cầu được cập nhật theo yêu cầu.

Trong khi với một libthư mục, bạn chỉ có một loạt các tệp (có thể là nhị phân và có thể sửa đổi), và bạn sẽ phải đoán chúng đến từ đâu và chúng là phiên bản nào (hoặc tin tưởng một số README, có thể đúng hoặc không chính xác ).


Để giải quyết các điểm khác của bạn:

Không cần công cụ bên ngoài để quản lý các gói.

Đúng, nhưng a) với tư cách là nhà phát triển phần mềm, dù sao bạn cũng cần cài đặt vô số công cụ, do đó, một thứ nữa thường không quan trọng và b) thường chỉ có một hoặc một vài trình quản lý gói trong bất kỳ trường nào (Maven / Gradle cho Java, npm cho JS / TypeScript, v.v.), vì vậy không giống như bạn cần cài đặt hàng tá chúng.

Không cần kết nối internet để xây dựng.

Tất cả các trình quản lý gói mà tôi biết đều hoạt động ngoại tuyến, một khi họ đã tải xuống các phụ thuộc cần thiết (có thể xảy ra ngay sau khi tải xuống dự án).

Xây dựng nhanh hơn (không kiểm tra gói).

Có thể đúng, nhưng có vẻ như việc kiểm tra gói ngoại tuyến sẽ không mất nhiều thời gian (chỉ là so sánh một số số phiên bản). Việc kiểm tra trực tuyến có thể mất một chút thời gian, nhưng có thể tắt nó nếu muốn (nếu nó được bật theo mặc định - ví dụ Maven không bao giờ kiểm tra các bản cập nhật cho các phiên bản phát hành).

Môi trường đơn giản hơn (yêu cầu ít kiến ​​thức hơn).

Đúng, nhưng như đã giải thích ở trên, một libthư mục cũng đòi hỏi kiến ​​thức. Ngoài ra, như đã giải thích ở trên, có lẽ bạn sẽ chỉ làm việc với một số ít người quản lý gói khác nhau mà bạn đã biết.


170
Không cần công cụ bên ngoài để quản lý gói Gói - yup. Bây giờ là công việc của bộ não của bạn. Chúc may mắn, trí não!
Paul D. Chờ đợi

57
Bất cứ ai nghiêm túc nghĩ rằng có một thư mục lib là một "môi trường dễ dàng hơn" chỉ cần tiếp tục và thử tìm ra cây phụ thuộc để nói Microsoft.AspNetCore.All nuget . Tiếp tục, đừng đợi tôi tôi sẽ kiểm tra lại sau một ngày.
Voo

13
Ngoài ra, trình duyệt internet bạn sử dụng để tìm kiếm thủ công các thư viện sẽ được tính là một công cụ bên ngoài để quản lý các gói. Cùng với mọi thứ khác bạn sử dụng (trình quản lý tệp OS, v.v.) để chuẩn bị và định vị các thư viện. Vì vậy, sự lựa chọn thực sự là một công cụ bên ngoài (trình quản lý gói) so với nhiều công cụ.
NemesisX00

3
Chỉ cần FYI, gần đây tôi đã cố gắng làm việc với lớp trên PC ngoại tuyến. Không may mắn, Android Studio sẽ không chạy ứng dụng của tôi và tôi nhận được một thông báo lỗi tối nghĩa và đó là sau khi tôi đã chạy trực tuyến ban đầu cho các phụ thuộc. Chỉ trong những tình huống này khi bạn thực sự nhận thấy sự phụ thuộc vào người quản lý gói tạo ra phần mềm đã trở thành ...
FRob

7
@ PaulD.Waite Trong khi chúng tôi làm việc đó, chúng tôi đã loại bỏ những "ngôn ngữ" phiền phức mà mọi người đang diễn ra. Cuối cùng, tất cả đều sôi sục với mã máy, vì vậy tại công ty của tôi, chúng tôi đã loại bỏ người trung gian. Bây giờ đó là hiệu quả!
corsiKa

39

Ưu điểm của thư mục lib biến mất nhanh chóng sau khi bạn chuyển từ phát triển quy mô nhỏ sang công việc lớn hơn.

Ví dụ, "lợi ích" của việc không yêu cầu một công cụ bên ngoài bị ảnh hưởng bởi công việc cần thiết để quản lý thủ công các phụ thuộc của bạn, vì vậy công cụ sẽ là bạn (theo nhiều nghĩa của thế giới).

Bạn không cần kết nối internet cho người quản lý gói. Bạn có thể sử dụng kho lưu trữ cục bộ.

Xây dựng nhanh hơn có thể đúng, nhưng hầu như không phải là thứ nên xác định có nên sử dụng trình quản lý gói hay không. Rốt cuộc, chúng ta không nói về tầm quan trọng của sự khác biệt và điều này cũng phụ thuộc vào cấu hình của bạn. Bạn có thể dễ dàng tạo một bản dựng chậm bằng trình quản lý gói, nhưng về cơ bản là phá hoại.

Môi trường đơn giản hơn (cần ít kiến ​​thức hơn)? Một lần nữa, trong phát triển quy mô nhỏ chắc chắn là một khả năng. Bạn có thể giữ dự án hoàn toàn trong đầu, xuống từng thư viện đang được sử dụng. Thêm một tệp tạo tệp đơn giản / tập lệnh xây dựng khác và bạn đã có cho mình một gói hoàn chỉnh.

Nhưng nó không làm cho môi trường đơn giản hơn, nó chỉ hoạt động trong môi trường đơn giản. Trong phát triển quy mô lớn hơn, bạn sẽ rất vui khi bạn sử dụng công cụ tiêu chuẩn thay vì các giải pháp tùy chỉnh. Rốt cuộc, bạn chỉ phải học nó một lần (và khi trình quản lý gói du jour được thay thế bởi điều thú vị mới, bạn cũng phải học điều đó).


21
@IgnacioSolerGarcia: Nó chỉ dễ dàng hơn nếu không có gì sai. Điều gì xảy ra nếu phiên bản mới của thư viện A cũng cần cập nhật B và C? Điều gì nếu bạn vẫn chạy, nhưng giới thiệu các lỗi tinh tế? Đó là tất cả các phần của "quản lý phụ thuộc".
sleske

18
@IgnacioSolerGarcia nói rằng "tải xuống một tệp" không hoàn toàn vẽ đúng hình ảnh. Hãy nói "tải xuống 20 tệp và đảm bảo các phiên bản của chúng tương thích". Không có công việc tránh ở đó. Cập nhật các gói cũng không phải là một tình huống lý thuyết, trừ khi bạn quyết định đóng băng các phiên bản phụ thuộc và sẵn sàng chấp nhận các vấn đề có thể xảy ra (lỗi, lỗi bảo mật) do đó.
Kayaman

12
@IgnacioSolerGarcia "tải xuống một tệp" - ý của bạn là (1) tìm đúng trang web dự án (một số được lưu trữ trên github, một số trên sourceforge, một số trên trang web của riêng họ), (2) tìm trang tải xuống, (3) tìm phiên bản chính xác , (4) tải xuống, (5) giải nén và thả ở đâu đó. Điều đó có vẻ nhiều công việc hơn blah install libfoo. Và sau đó, nhân số đó với 5 phụ thuộc.
el.pescado

5
@IgnacioSolerGarcia Ok những tập tin nào tôi "đơn giản" phải tải xuống để làm cho nuget này hoạt động chính xác? Và đó về cơ bản là thiết lập tầm thường nhất cho một dự án ASP.NET Core. Trong thực tế, bạn sẽ có nhiều phụ thuộc hơn.
Voo

6
@Ignacio Đó là meta nuget cơ bản để khởi chạy ứng dụng ASP.Net Core đơn giản nhất. Đúng vào thời kỳ cũ của toàn bộ khung công tác, mọi thứ đều "dễ dàng" hơn, bởi vì bạn vừa có các thư viện nguyên khối lớn, tất cả đều được phiên bản cùng một lúc và phát hành bản cập nhật khiến bạn mất nhiều năm. Mô hình đó về cơ bản không được dùng nữa vì những lý do rất tốt không chỉ trong thế giới .NET. Bạn sẽ phải làm quen với toàn bộ mô hình của rất nhiều thư viện nhỏ làm một việc cụ thể và thành thật sử dụng trình quản lý gói là phần dễ nhất của quá trình chuyển đổi.
Voo

35

Bạn đang thiếu nhiều lợi thế của người quản lý gói.

  1. Trình quản lý gói cho phép bạn tránh kiểm tra các tệp nhị phân lớn (vài megabyte hoặc lớn hơn) vào kiểm soát nguồn. Làm như vậy là vô cảm đối với nhiều công cụ kiểm soát nguồn, git phổ biến là một trong số đó. Chúng tôi đã có một kho lưu trữ đạt giới hạn kích thước của Bit Xô vài tháng trước vì các nhà phát triển đang kiểm tra Cốc Cốc. Một dự án khác đã đi được nửa đường khi chúng tôi di chuyển từ SVN vì chúng tôi đã kiểm tra tất cả các nhị phân lib của chúng tôi (và đã không sử dụng NuGet). Vì các nhà quản lý gói sẽ tải xuống các gói một cách nhanh chóng cho mỗi nhà phát triển, họ loại bỏ sự cần thiết phải kiểm tra các tệp nhị phân này.
  2. Chúng ngăn trộn các tệp / thư viện không tương thích. Các thư mục có thể chứa các phiên bản hỗn hợp của các tệp của thư viện nếu ai đó không dọn dẹp đúng cách trong quá trình nâng cấp. Tôi đã thấy một trường hợp trong đó một nửa số nhị phân trong thư mục được nâng cấp, dẫn đến các lỗi rất kỳ lạ. (Nó thậm chí không sụp đổ!) Chúng tôi mất nhiều tháng theo nghĩa đen (không phải giờ đàn ông, chỉ là tổng thời gian) để tìm ra vấn đề. Bằng cách để trình quản lý gói kiểm soát toàn bộ thư mục, bạn không thể có các phiên bản hỗn hợp; bạn đảm bảo tính nhất quán. Chúng cũng khiến việc sử dụng các phụ thuộc không tương thích trở nên khó khăn hơn nhiều , bằng cách tự động cập nhật mọi thứ cùng nhau, cài đặt các phiên bản khác nhau khi cần hoặc thậm chí chỉ đưa ra các cảnh báo hoặc lỗi khi cố gắng sử dụng các phiên bản thư viện không tương thích.
  3. Họ thiết lập một quy ước chung để quản lý thư viện. Khi các nhà phát triển mới đến dự án, nhóm, công ty của bạn, v.v., họ có khả năng biết các quy ước của người quản lý gói. Điều này có nghĩa là họ không phải lãng phí thời gian để tìm ra các chi tiết tốt về cách các thư viện được quản lý trong cơ sở mã của bạn.
  4. Họ cung cấp cho bạn một cách chuẩn hóa phiên bản và phân phối các tệp và tệp phụ thuộc của riêng bạn không thuộc về kho lưu trữ của bạn. Tôi thậm chí đã tận dụng chúng cho một số tệp dữ liệu tĩnh lớn mà ứng dụng của tôi yêu cầu, vì vậy nó hoạt động tốt để phiên bản mọi thứ bên cạnh mã nhị phân.
  5. Một số trình quản lý gói cung cấp các tính năng bổ sung trong quá trình cài đặt. NuGet sẽ thêm các tệp phụ thuộc và tệp nội dung vào tệp csproj của bạn và thậm chí có thể thêm các thành phần cấu hình vào tệp cấu hình.
  6. Các tệp danh sách gói của họ ghi lại các phiên bản của thư viện của bạn ở một nơi tập trung duy nhất. Tôi không phải nhấp chuột phải vào DLL và xem số phiên bản để tìm ra phiên bản nào của thư viện tôi đang sử dụng. Trong Python, tác giả thư viện có thể thậm chí không bao gồm số phiên bản trong các tệp py, vì vậy tôi thậm chí không thể nói phiên bản thư viện từ chúng.
  7. Họ không khuyến khích cài đặt rộng rãi các phụ thuộc. Trình quản lý gói cung cấp một cách thông thường để cài đặt các phụ thuộc mà không cần trình cài đặt toàn cục . Khi các tùy chọn của bạn là thư mục lib và cài đặt toàn cầu, nhiều nhà phát triển thư viện sẽ chọn cung cấp thư viện chính của họ dưới dạng cài đặt toàn cầu thay vì các tệp nhị phân có thể tải xuống mà bạn phải tự thiết lập. . thư mục
  8. Họ có xu hướng tập trung lưu trữ và phân phối. Bạn không còn phải phụ thuộc vào trang web của thư viện ngẫu nhiên đó. Nếu họ không hoạt động, trang web của người quản lý gói thành công vẫn có mọi phiên bản được tải lên. Các nhà phát triển cũng không phải săn lùng nhiều trang web chỉ để tải xuống các thư viện mới; họ có một nơi để tìm kiếm đầu tiên và thậm chí duyệt tìm các tùy chọn khác nhau. Việc sao chép các gói được tổ chức theo cách tiêu chuẩn cũng dễ dàng hơn so với việc lưu trữ thủ công các bản sao của mọi thứ từ các trang web đặc biệt.

Bạn cũng đang nói quá về giá trị của "lợi ích" của bạn.

  1. Không cần công cụ bên ngoài để quản lý các gói.

    "Bên ngoài" để làm gì? Tôi kiểm tra thực thi NuGet vào kho của tôi. Đó là nhị phân duy nhất tôi cảm thấy ổn khi đăng nhập, vì nó nhỏ và có nghĩa là tôi không cần kiểm tra bất kỳ nhị phân nào khác.

    Pip không đặt ra vấn đề ở mặt trước này vì nó được gói với Python theo mặc định bây giờ và các thay đổi không tương thích ngược và ngược cực kỳ hiếm. Dù sao, bạn sẽ không phát triển mã Python mà không cài đặt Python bên ngoài vào dự án của bạn.

    Vào thời điểm họ đạt được sự chấp nhận rộng rãi, các nhà quản lý gói có xu hướng rất ổn định. Bạn không thể thoát khỏi mà không có một số loại công cụ được cài đặt toàn cầu cho hầu hết các dự án và một trình quản lý gói duy nhất là một yêu cầu trọng lượng khá nhẹ. Nó thường không cồng kềnh hơn nhiều so với cài đặt thời gian chạy ngôn ngữ.

  2. Không cần kết nối internet để xây dựng.

    Tôi không thể kết nối với cơ sở dữ liệu của mình mà không có kết nối mạng. Nếu cơ sở dữ liệu được lưu trữ trên Amazon, tôi vẫn cần kết nối internet đầy đủ. Tôi cần kết nối Internet để đẩy và kéo các thay đổi thông qua kiểm soát nguồn; một máy chủ xây dựng không thể kiểm tra mã để xây dựng mà không có một số loại kết nối mạng. Bạn không thể gửi hoặc nhận e-mail mà không có. Bạn không thể tải xuống các thư viện để đặt chúng vào thư mục lib của bạn mà không cần một! Phát triển vĩnh viễn mà không có kết nối internet là hầu như không nghe thấy. Trong một số trường hợp hiếm khi cần thiết, bạn có thể giải quyết vấn đề này bằng cách tải các gói xuống vị trí mà người quản lý gói có thể tiêu thụ. (Tôi biết NuGet và pip khá vui khi lấy từ một thư mục đơn giản hoặc ổ đĩa mạng; tôi nghi ngờ hầu hết những người khác cũng có thể.)

  3. Xây dựng nhanh hơn (không kiểm tra gói).

    30 giây trong quá trình xây dựng tự động và 5 giây trong quá trình xây dựng nhà phát triển địa phương là một sự đánh đổi tốt cho những lợi ích tôi đã nêu ở trên. Đây là những khung thời gian tầm thường thường không đáng xem xét so với các vấn đề mà lợi ích giải quyết được.

  4. Môi trường đơn giản hơn (yêu cầu ít kiến ​​thức hơn).

    Dù sao, một công cụ để quản lý gói không có gì để quản lý thư viện thực sự không phải là một so sánh công bằng. Không có công cụ, bạn phải học bất kỳ quy trình tùy chỉnh nào mà dự án đang sử dụngđể quản lý các thư viện của nó. Điều này có nghĩa là bạn không bao giờ chắc chắn liệu kiến ​​thức hiện tại của bạn có áp dụng cho bất kỳ dự án mới nào bạn tiếp cận hay không. Bạn sẽ phải đối phó với bất kỳ cách tiếp cận hodgepodge nào mà ai đó nghĩ ra, hoặc tạo nên của riêng bạn. Đó có thể là một thư mục chứa tất cả các thư viện, hoặc nó có thể là một cái gì đó lạ hơn. Có lẽ để tránh kiểm tra các thư viện, ai đó đặt tất cả chúng vào ổ đĩa mạng và chỉ báo phiên bản duy nhất là tên thư mục. Làm thế nào là hoặc cài đặt toàn cầu thực sự tốt hơn? Để so sánh, một người quản lý gói cung cấp cho bạn một quy ước rõ ràng sẽ áp dụng trên hầu hết các dự án bạn gặp phải.

Chủ đề chung là họ cung cấp tính nhất quán, tài liệu và các tính năng không chỉ trong các dự án, mà thậm chí trên toàn bộ chúng. Điều này đơn giản hóa cuộc sống của mọi người.


10
"Phát triển vĩnh viễn mà không có kết nối internet là điều gần như không nghe thấy" Tôi ước tôi không biết rõ hơn. Có rất nhiều sự phát triển được thực hiện trong các mạng hoàn toàn tách biệt vì lý do bảo mật. Vâng, nó là về nhiều niềm vui như nó có vẻ, nhưng nó là hoàn toàn có thể làm được. Bạn chỉ cần thiết lập cơ sở hạ tầng của riêng mình để lưu trữ gói (tức là nguồn cấp dữ liệu nuget của riêng bạn).
Voo

1
Mặc dù có cơ sở hạ tầng của riêng bạn thực sự là một trong số ít những điều có ý nghĩa trong mọi trường hợp: Bạn không muốn đáng tin cậy về cơ sở hạ tầng bên ngoài. Nếu cái đó không có sẵn vì lý do này hay lý do khác thì tốt hơn là có một dự phòng đảm bảo rằng các nhà phát triển của bạn có thể tiếp tục phát triển. (Và trước khi bất cứ ai nói với tôi làm thế nào mà nuget.org hoặc NPM hoặc <chèn yêu thích repo gói> sẽ không bao giờ có rắc rối như vậy, có lẽ suy nghĩ lại .)
Voo

3
@IgnacioSolerGarcia Thiết lập một dự án hoặc mỗi bộ phận hoặc theo quy ước của mỗi công ty không tốt hơn là chỉ có một hội nghị mà mọi người đều biết mà không được thông báo. Ngoài ra, quản lý gói thực hiện công việc tốt hơn trong việc thực thi quy ước, vì nó làm cho việc tuân theo quy ước ít hoạt động hơn là phá vỡ nó. Ngoài ra, như tôi đã đề cập, tôi cam kết trực tiếp với NuGet và gọi nó trong tập lệnh xây dựng, vì vậy tôi không cần phải cài đặt nó. Tôi tiếp tục xây dựng cài đặt máy chủ đến mức tối thiểu.
jpmc26

2
@ jpmc26 Imho danh sách đánh số đầu tiên của bạn sẽ được hưởng lợi từ một số điểm nhấn .
Søren D. Ptæus

1
@ SørenD.Ptæus Xong.
jpmc26

16

Gần đây đã chuyển đổi sản phẩm của chúng tôi từ việc sử dụng các thư viện được tải xuống thủ công sang quản lý gói tự động với Nuget, tôi có thể nói rằng sử dụng trình quản lý gói có lợi ích lớn.

Sản phẩm của chúng tôi được triển khai trên 27 dự án C #, tương đối nhỏ theo tiêu chuẩn ngày nay. Một số phụ thuộc bên thứ ba của chúng tôi có hàng chục hội đồng.

Trước Nuget, nếu tôi muốn cập nhật tất cả các phụ thuộc của chúng tôi lên phiên bản mới nhất, tôi sẽ phải:

  1. Theo dõi nơi tôi có thể nhận được tất cả các thư viện cập nhật
  2. Tải về chúng và giải nén / cài đặt
  3. Thêm các phiên bản mới để kiểm soát nguồn
  4. Xem thủ công tất cả các tài liệu tham khảo trong các dự án của chúng tôi và cập nhật chúng để chỉ ra các hội đồng mới

Với 27 dự án và hàng chục hội đồng phụ thuộc, quá trình này rất dễ bị lỗi và có thể mất nhiều giờ.

Bây giờ chúng tôi đã cập nhật để sử dụng Nuget, tất cả chỉ hoàn thành với tôi bằng một lệnh.


Đồng ý, đó là điểm 2 của pro. Dù sao thay đổi phụ thuộc là điều chúng ta hiếm khi làm (có thể là do thiếu các bài kiểm tra hồi quy tự động thích hợp).
Ignacio Soler Garcia

9
Cập nhật các phụ thuộc là điều ít gây đau đớn hơn nếu bạn thực hiện thường xuyên.
17 trên 26

1
Là những thử nghiệm tự động? Chính xác thì họ mất bao lâu để chạy? Ngay cả khi phải mất 24 giờ để chạy bộ thử nghiệm đầy đủ, điều đó vẫn cho phép bạn cập nhật các phụ thuộc mỗi vài ngày với một chút nhược điểm (mặc dù bạn có thể sẽ không làm điều đó thường xuyên trong thực tế). Ngay cả khi chúng là thủ công và không thể tránh khỏi, sử dụng cài đặt thủ công, bạn có thể mất nhiều ngày chạy qua các bài kiểm tra để tìm ra chúng thất bại vì bạn đã bỏ lỡ một số phụ thuộc của một phụ thuộc, sau đó bạn phải bắt đầu lại sau khi cài đặt, điều đó sẽ không xảy ra sử dụng quản lý gói ...
Sean Burton

3
Bạn không yêu cầu kiểm tra hồi quy trên các bản phát hành phần mềm mới? Chỉ cập nhật các phụ thuộc khi bạn đang thực hiện kiểm tra bản phát hành.
17 trên 26

4
"Chúng tôi không có chúng hoàn toàn tự động và công cụ này quá lớn để làm điều đó (có thể mất vài tháng để thử nghiệm hoặc tự động hóa nó)" - đó là vấn đề lớn của bạn. Những thử nghiệm này nên được thực hiện kể từ khi bắt đầu. Vấn đề của bạn không phải là việc sử dụng các trình quản lý gói không mang lại lợi ích gì, vấn đề của bạn là bối cảnh bạn đang làm việc quá bị phá vỡ theo những cách khác để cho phép bạn thưởng thức chúng.
Ant P

14

Không cần công cụ bên ngoài để quản lý gói

Đó là một điểm không phải là nó? Nếu tôi sử dụng trình quản lý gói, tôi không cần phải có thư mục lib. Tôi cũng không phải tự quản lý các gói.

Không cần kết nối internet để xây dựng

Bên cạnh việc không có kết nối internet ngày hôm nay trong khi phát triển là hơi hiếm (có thể ngoại trừ quá cảnh), một người quản lý gói tốt không nên yêu cầu bạn phải có phiên bản mới nhất để xây dựng ứng dụng của mình. Nó có thể phàn nàn, nhưng không có lý do gì để không xây dựng với phiên bản mà nó đã cài đặt

Xây dựng nhanh hơn (không kiểm tra gói)

Đó là một tốc độ khá nhanh, nhưng bạn có thể tranh luận về điều đó.

Môi trường đơn giản hơn (ít kiến ​​thức hơn)

Hầu hết các nhà quản lý gói ngày nay rất đơn giản đến nỗi hầu như không đáng để cố gắng khắc phục bằng cách thực hiện những điều này. Thậm chí có khách hàng trực quan nếu bạn muốn. Họ thực sự che giấu rất nhiều các croft đang diễn ra.

Quản lý gói cũng cho phép bạn chia sẻ các gói này giữa các dự án khác nhau. Nếu 5 dự án của tôi sử dụng cùng một phiên bản Boost, thì không cần phải sao chép dự án này cho từng dự án. Điều này đặc biệt đúng đối với các cây phụ thuộc phức tạp mà bạn nói đến.

Với thư mục lib, bạn chỉ quản lý các gói cho dự án đó, trong khi trình quản lý gói cho phép bạn thực hiện việc này cho toàn bộ môi trường phát triển của mình bằng một công cụ duy nhất.


Không dễ để có một tác nhân xây dựng được cấu hình để cài đặt trình quản lý gói trong quá trình xây dựng, để khôi phục các phụ thuộc, v.v. Không có gì cần thiết với một thư mục lib.
Ignacio Soler Garcia

4
Tôi nghĩ điều đó phụ thuộc vào ngôn ngữ bạn đang sử dụng. Với các ngôn ngữ như Ruby hay Rust, việc quản lý gói được tích hợp tốt đến mức việc sử dụng nó là hoàn toàn không quan trọng.
Sean Burton

Vâng, tôi cho rằng về mục đích để có những bình luận rộng hơn nhưng tôi đang nói cụ thể về đám mây NuGet, C # và VSTS.
Ignacio Soler Garcia

4
@Ignacio Bất kể hệ thống xây dựng nào bạn đang sử dụng không làm cho nó hoàn toàn tầm thường để khôi phục NuGets sẽ bị loại bỏ ngay lập tức. May mắn thay, VSTS làm cho việc này trở nên dễ dàng như vậy ( tài liệu ): Có một nhiệm vụ khôi phục NuGet mà bạn trỏ đến tệp giải pháp của mình và cho nó biết những nguồn NuGet nào sẽ sử dụng - đối với một dự án đơn giản chỉ cần sử dụng nuget.orgsẽ rất tốt (mẫu mặc định nên đã được thiết lập theo cách này).
Voo

3
@Ben RVM không phải là người quản lý gói. Trình quản lý gói cho Ruby là RubyGems. RVM quản lý các phiên bản của chính Ruby và vì điều đó rbenv tốt hơn ...
Sean Burton

5

Đó là sự khác biệt giữa việc chỉ sử dụng các thư viện ( thư mục lib) và sử dụng chúng, duy trì thông tin meta (trình quản lý gói) . Thông tin meta như vậy liên quan đến số phiên bản, phụ thuộc (bắc cầu) giữa các thư viện và như vậy.

Các cuộc thảo luận về địa ngục DLL, khả năng tương thích thư viện, hệ thống mô-đun java, OSGi và ít nhất cũng đủ sức thuyết phục về một số giá trị của việc có một số hình thức quản lý phụ thuộc.

  • Phiên bản thư viện và các vấn đề phụ thuộc có thể là một sự lãng phí thời gian.

Ngoài ra còn có lợi ích của kho lưu trữ được chia sẻ (cục bộ), vì vậy một số dự án không cần duy trì các bản sao của libs đã nhập. Nếu một người có một dự án với 20 mô hình con, một số mô-đun có 40 phụ thuộc lẻ.

  • Thêm cấu trúc
  • Cắt tỉa thêm các thư viện
  • Không có quyết định đặc biệt của con người về thư viện

3

Có một số trường hợp có thể cần một thư mục lib, ví dụ như khi xử lý các thư viện lỗi thời (một phiên bản của nó không còn được duy trì / khả dụng), một phiên bản thư viện được sửa đổi cục bộ, ...

Nhưng đối với mọi thứ khác, nó giống như nhà phát triển đảm nhận vai trò của người quản lý gói:

  • Nhà phát triển sẽ phải tải xuống các thư viện (yêu cầu internet)
  • Nhà phát triển sẽ phải kiểm tra các bản phát hành mới hơn bằng tay
  • ...

Và IMHO, đó là kiến ​​thức cần ít hơn, bởi vì bạn phải tìm hiểu về việc sử dụng công cụ bên ngoài, nhưng ít hơn về các thư viện (tức là phụ thuộc).


4
Ngay cả đối với các thư viện đã lỗi thời hoặc đã sửa đổi, tất cả các trình quản lý gói mà tôi đã thấy cho đến nay đều cung cấp tùy chọn tải lên các phụ thuộc cục bộ vào kho lưu trữ cục bộ của bạn. Nhưng ok, đó là nơi bạn mất đi một số trải nghiệm "nó chỉ hoạt động tự động".
Hulk

@Hulk nếu đó là một thư viện mã nguồn mở thì bạn có thể (và nên, có lẽ) chỉ cần xuất bản phiên bản của mình và do đó làm cho nó hiển thị với trình quản lý gói. Hoặc bằng cách đẩy các sửa đổi cho các nhà bảo trì, hoặc bằng cách đưa ra ngã ba thư viện của riêng bạn.
rẽ trái

Nếu bạn đã sửa đổi một thư viện mà người bảo trì không phản hồi để vá thư, thì vấn đề là tìm cách cấu hình trình quản lý gói sao cho các gói khác phụ thuộc vào thư viện cũng có thể được thỏa mãn với thư viện đã sửa đổi của bạn.
Damian Yerrick

1

Có một vấn đề khác không được đề cập bởi các câu hỏi khác: chia sẻ deps.

Giả sử, bạn có hai gói xây dựng cùng một thư viện. Trong trường hợp tốt nhất, sẽ không có bất kỳ đồng tiền nào, nhưng cùng một không gian ổ cứng / SSD được sử dụng hai lần. Trong trường hợp xấu nhất, sẽ có xung đột varios, như các phiên bản.

Nếu bạn sử dụng trình quản lý gói, nó sẽ chỉ cài đặt thư viện một lần (mỗi phiên bản) và đã cung cấp đường dẫn đến nó.

PS: tất nhiên, bạn cần liên kết động (hoặc chức năng tương tự trong ngôn ngữ của bạn) để có được pro này.


-5

Một lý do chính tại sao các thư viện dùng chung được coi là một mục tiến bộ trong các hệ thống Unix và Windows thời kỳ 90 là cách chúng có thể giảm mức sử dụng RAM khi nhiều chương trình sử dụng cùng một bộ thư viện được tải. Không gian mã chỉ cần được phân bổ ONCE cho mỗi thư viện chính xác và phiên bản của thư viện đó , việc sử dụng bộ nhớ theo thể hiện duy nhất còn lại là cho các biến tĩnh.

Nhiều hệ điều hành triển khai các thư viện dùng chung theo cách phụ thuộc vào các cơ chế như api unix mmap () ngụ ý rằng một thư viện sẽ không chỉ cần phải là cùng một phiên bản mà thực sự là cùng một FILE. Điều này chỉ đơn giản là không thể tận dụng tối đa lợi thế cho một chương trình vận chuyển bộ thư viện của riêng mình.

Cho rằng bộ nhớ rẻ hơn rất nhiều và các phiên bản thư viện cần đa dạng hơn so với thập niên 90, cuộc tranh luận này không mang nhiều trọng lượng như ngày nay.


4
Câu hỏi này không nói về thư viện dùng chung mà phụ thuộc vào thư mục thư viện.
Ignacio Soler Garcia

1
Điều này không trả lời câu hỏi của OP
esoterik ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.