Tại sao không có hệ thống quản lý gói cho C và C ++? [đóng cửa]


78

Có một số ngôn ngữ lập trình tồn tại một hệ thống quản lý gói:

Có ngôn ngữ nào khác với các hệ thống như vậy không? Còn C và C ++ thì sao? (đó là câu hỏi chính!) Tại sao không có hệ thống như vậy cho họ? Và không tạo ra các gói cho yum, apt-gethoặc các hệ thống quản lý gói chung khác tốt hơn?


3
Objective-C có Cocoapods (rất giống với đá quý ruby ​​và bundler). Thật kỳ quặc khi C ++ không có cái gì đó tương tự. Có lẽ vì C ++ ít đồng nhất. Apple cung cấp nhiều thứ tiêu chuẩn hơn để xây dựng các gói trên đầu trang. Trong C ++, người ta khó có thể đồng ý về việc sử dụng lớp chuỗi nào.
Erik Engheim

Tôi chỉ muốn chỉ ra rằng các trình quản lý gói từ các ngôn ngữ khác không hoàn hảo. Ví dụ, trong Ruby Gems, người ta thường có thể gặp một viên ngọc không hoạt động cho một HĐH cụ thể (nhiều khả năng là Windows) và tài liệu không cho bạn biết nó không hoạt động với HĐH đó.
Travis Pessetto

Câu trả lời:


28

Trên thực tế, một số người (nổi tiếng đáng chú ý) đang làm việc chăm chỉ để tạo và thiết lập một hệ thống như vậy gọi là Ryppl . Thật khó để thiết lập một Hệ thống như vậy cho C ++, vì nó không có một người chơi nào có thể ra lệnh. --UPDATE: Thật không may, nó bị bỏ rơi.

Đối với câu hỏi thứ hai của bạn, một trình quản lý gói thông thường (ngoài việc không phải là nền tảng chéo) không xử lý các nhu cầu cụ thể của nhà phát triển.


2
Ồ, tôi tự hỏi làm thế nào họ sẽ chiến đấu 20 năm "Chúng tôi không cần một người quản lý gói!"
TheLQ

8
Chà, họ nổi tiếng về Boost, tôi sẽ cho họ lợi ích của sự nghi ngờ và xem qua. Boost, sau tất cả, là khá tuyệt vời :)
Onno

2
@TheLQ - Tôi không nghĩ có gì để chiến đấu ngoài việc trước đó không ai đưa ra một giải pháp khả thi. Không có "chúng tôi không cần phải không quản lý gói", "Không ai chỉ cho tôi bất cứ điều gì có vẻ hữu ích". Cái trước có thể khó đi, nhưng cái sau thì đơn giản: chỉ cần trình bày một cái gì đó thực sự giúp các nhà phát triển thực hiện công việc của họ.
Michael Kohne

1
Câu trả lời này cần được cập nhật: 1) Ryppl là một dự án đã chết, thậm chí trang web của nó đã chết. 2) Các dự án khác (thương mại hay không) như cpm đã sinh ra gần đây, vì vậy có rất nhiều công việc đang được thực hiện để có được một trình quản lý gói cho C ++. 3) Tôi tin rằng sẽ không có người chiến thắng cho đến khi các mô-đun bằng ngôn ngữ và một trong những công cụ quản lý để khai thác điều đó một cách đầy đủ nhất.
Klaim

2
@Klaim re: {cho đến khi các mô-đun có ngôn ngữ} theo như tôi hiểu các mô-đun không làm cho mọi thứ trở nên dễ dàng hơn, đó chỉ là một cú pháp đường cho #includelệnh. Nó sẽ không giải quyết được vấn đề chính của các vấn đề về C ++ phiên bản / tải xuống / cài đặt / tương thích / đa nền tảng.
ruslo

17

Tôi nghĩ rằng một vấn đề với C và thậm chí nhiều hơn với C ++ là chúng là các ngôn ngữ không đồng nhất hơn: mặc dù các ngôn ngữ này được chuẩn hóa vẫn tồn tại các trình biên dịch khác nhau với các tùy chọn khác nhau hoặc các bộ tính năng được hỗ trợ khác nhau. Ví dụ, tôi nhớ đã đăng một câu hỏi về C ++ trên stack stack với một ví dụ hoạt động hoàn hảo trên GCC / Linux và ai đó đã ngay lập tức đăng câu trả lời nói rằng mã của tôi không chuẩn.

Có một hệ thống gói giống như các hệ thống được đề cập trong câu hỏi sẽ ngụ ý có một ngôn ngữ và thư viện chung được hỗ trợ thống nhất bởi tất cả các trình biên dịch chính trên tất cả các hệ điều hành chung. Ví dụ: bạn không muốn tải xuống gói C ++ và phát hiện ra rằng nó sẽ không biên dịch trên phiên bản trình biên dịch X của bạn vì nó được phát triển trên trình biên dịch Y trên một hệ điều hành khác.

Tôi có thể tưởng tượng rằng một hệ thống dựa trên các tập lệnh tạo và cấu hình (như thường thấy trên Linux, cygwin và các hương vị Unix khác) có thể hoạt động. Nhưng tại sao người dùng Visual Studio nên chấp nhận nó? Điều tương tự cũng hợp lệ nếu người ta khởi động một hệ thống gói dựa trên Microsoft Compilers (và thư viện).

Thực tế là C ++ là một ngôn ngữ phát triển nhanh và các tiêu chuẩn của nó luôn mất một thời gian trước khi được hỗ trợ đầy đủ bởi tất cả các trình biên dịch không làm giảm bớt vấn đề.


Chà, bạn có thể viết C ++ di động, hoặc bạn có thể viết vào một chuỗi công cụ cụ thể. Sự lựa chọn của bạn, và không có gì sai với cả hai, mặc dù không làm điều trước khi không có lợi thế cho điều sau là hơi tối ưu.
Ded repeatator

2
Có C và C ++ di động. Nếu một thư viện không thể được cài đặt một cách độc lập bởi trình cài đặt một cách dễ dàng, thì nó nên được làm lại. Hoàn toàn có thể thực hiện được điều này. Ngay cả trong NodeJS, nhiều mô-đun không thể xây dựng trên Windows, nhưng nó vẫn tồn tại, do đó, các sự cố xây dựng không thường xuyên không phải là vấn đề và có một trình quản lý gói tập trung hợp lý hóa phản hồi từ người dùng và giúp khuyến khích xử lý các vấn đề hơn.
Dmitry

4

Tôi nghĩ rằng những câu hỏi chúng ta cần đặt ra để trả lời câu hỏi của bạn là "Ngôn ngữ / hệ sinh thái khác có được gì khi có kho lưu trữ gói tập trung của riêng mình?" và "Điều này có áp dụng cho C / C ++ không?"

Tôi cảm thấy câu trả lời cho câu hỏi đầu tiên có liên quan đến việc quảng bá ban đầu một ngôn ngữ mới: những người chấp nhận sớm muốn tạo điều kiện dễ dàng nhất cho những người mới tham gia vào hệ sinh thái, có được mã thử nghiệm hữu ích và đóng góp lại. Vì những lý do rõ ràng, "biểu đồ sử dụng" luôn có một gốc duy nhất - người tạo ngôn ngữ. Thường có một triển khai tham chiếu (ít nhất là ban đầu) và do đó, bất kỳ mã nào bạn muốn chia sẻ đều phải tuân theo nó.

Điều này giúp dễ dàng tạo các gói chỉ cần tải xuống và biên dịch. Chắc chắn, nếu C hoặc C ++ được giới thiệu vào năm 2013, cộng đồng của họ có thể đã đi theo một con đường tiến hóa tương tự, nhưng họ đã không và không có một công cụ phổ biến nào để áp dụng trình quản lý gói. Điều này làm cho việc thực hiện một chương trình như vậy quá rắc rối để có giá trị rắc rối. (bạn có nên khiến người dùng lựa chọn giữa libfoo-gcc và libfoo-vs không? Bạn có để nó cho người đóng gói giải quyết không? Hoặc quá trình xây dựng? Nếu vậy, một gói khác với tarball thẳng như thế nào?)

Vì vậy, để tổng hợp câu trả lời của tôi cho câu hỏi đầu tiên, tôi nghĩ rằng mô hình tạo các trình quản lý gói phục vụ chủ yếu để thúc đẩy việc áp dụng .

Với ý nghĩ đó, tôi nghĩ khá dễ hiểu tại sao không có hệ thống đơn lẻ nào tăng lên để đáp ứng nhu cầu này - bởi vì nhu cầu không tồn tại đối với các lập trình viên C và C ++. Điều gì tạo nên một vấn đề đối với cộng đồng C và C ++ (hoặc bất kỳ cộng đồng lập trình viên nào, thực sự) là nhu cầu ban đầu ngụ ý: phân phối, cập nhật và đóng góp mã trở lại. Điều này đã được giải quyết nhiều lần bởi những người khác nhau với mức độ thành công khác nhau và thực sự một hệ thống đang chiếm thị phần đáng kể: git (và một số hệ thống khác trước đó).

Về cơ bản khi các vấn đề khác nhau, các giải pháp trông cũng khác nhau, nhưng IMHO sự khác biệt giữa gõ gem installgit clonelà tranh luận.


2
"Các ngôn ngữ / hệ sinh thái khác có được gì khi có kho lưu trữ gói tập trung của riêng mình?". Bạn cần phải là một nhà phát triển rất có kinh nghiệm để bắt đầu tải xuống các gói và tin tưởng chúng hoạt động đúng với phần mềm của bạn. Có một trình quản lý gói cho phép mọi người chỉ bắt đầu sử dụng các gói thay vì xử lý các hướng dẫn xây dựng nhạy cảm theo ngữ cảnh / v.v. Bản thân tôi không thể tìm ra cách tăng cường hoạt động trên MinGW, vì vậy cuối cùng tôi đã tự mình viết nhiều chức năng của nó, thay vì chỉ sử dụng nó. Thật ngớ ngẩn khi không có.
Dmitry

1
Không phải chiến đấu với các kịch bản cài đặt / xây dựng và cờ khác nhau sẽ là một chiến thắng tuyệt vời.
themihai

3

Có một chút nhầm lẫn trong câu hỏi này. Các phần mềm được đề cập ở trên quản lý các phần mở rộng cho các ngôn ngữ lập trình cụ thể. Họ cung cấp các thư viện và mã nguồn mà sau đó có thể được sử dụng trong chương trình của bạn với ngôn ngữ lập trình bạn chọn.

Trong khi các trình quản lý gói cấp hệ thống chung thường cung cấp các gói nhị phân có thể được sử dụng bất kể ứng dụng. Họ được định hướng nhiều hơn tại hệ thống và người dùng. Tất nhiên, các hệ thống quản lý gói cấp hệ thống như Aptitude, vòng / phút, Entropy có thể cung cấp bất kỳ gói nào , là mã nhị phân hoặc mã nguồn. Đó là lý do tại sao bạn sẽ tìm thấy trong chúng hầu hết các tiện ích mở rộng bạn sẽ cài đặt với ... Gem chẳng hạn.

Hơn, những gì bạn đã đề cập như YumApt-get hoặc Rigo chỉ là giao diện người dùng cho các hệ thống quản lý gói bên dưới chúng.

Thêm một danh sách cho các ngôn ngữ lập trình o:

  • Nhà soạn nhạc và Pear cho PHP

Dứt khoát. Tôi đã nghĩ gì khi viết ba câu hỏi cuối?
m0nhawk

Vấn đề là các gói này có được trên toàn cầu thay vì cục bộ và việc gộp các phụ thuộc của dự án vào một thư mục là rất khó. Điều này có nghĩa là một dự án có thể hoạt động trên hệ thống của bạn nhưng ngay khi bạn đặt nó vào một hệ thống khác, bạn cần nhớ những gì nó phụ thuộc và lấy tất cả chúng và đặt chúng vào vị trí chính xác mà dự án của bạn mong đợi. Quá trình này là địa ngục. Một ví dụ về điều này là GTK, dễ cài đặt trên toàn cầu, khó cài đặt cục bộ.
Dmitry

0

Tôi nhận ra đây không phải là một giải pháp đa nền tảng, nhưng nó nên được thêm vào hỗn hợp.

CoApp gần đây đã công bố hỗ trợ quản lý gói C ++ bằng NuGet: http://blog.nuget.org/20130426/native-support.html

Điều này hiện chỉ hoạt động với trình biên dịch Visual Studio, nhưng đã có nhiều yêu cầu để làm việc này trên các nền tảng khác.

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.