Warum gibt es keine Paketverwaltungssysteme für C und C ++? [geschlossen]


78

Es gibt einige Programmiersprachen, für die ein Paketverwaltungssystem existiert:

Gibt es andere Sprachen mit solchen Systemen? Was ist mit C und C ++? (das ist die Hauptfrage!) Warum gibt es für sie keine solchen Systeme? Und schafft keine Pakete für yum, apt-getoder andere allgemeine Paket - Management - Systeme besser?


3
Objective-C hat Cocoapods (sehr ähnlich zu Ruby Gems und Bundler). So seltsam, dass C ++ so etwas nicht hat. Vielleicht, weil C ++ weniger homogen ist. Apple bietet mehr Standardmaterial zum Erstellen von Paketen. In C ++ kann man sich kaum darauf einigen, welche String-Klasse verwendet werden soll.
Erik Engheim

Ich möchte nur darauf hinweisen, dass die Paketmanager aus anderen Sprachen nicht perfekt sind. Beispielsweise trifft man in Ruby Gems häufig auf einen Edelstein, der für ein bestimmtes Betriebssystem nicht funktioniert (mehr als wahrscheinlich Windows), und in der Dokumentation wird nicht angegeben, dass er für dieses Betriebssystem nicht funktioniert.
Travis Pessetto

Antworten:


28

Tatsächlich arbeiten einige Leute (mit spürbarem Aufschwung) hart daran, ein solches System namens Ryppl zu schaffen und zu etablieren . Es ist schwierig, ein solches System für C ++ einzurichten, da es keinen einzelnen Player hat, der dies vorgeben kann. --UPDATE: Leider ist es aufgegeben.

Bei Ihrer zweiten Frage geht ein normaler Paketmanager (abgesehen davon, dass er nicht plattformübergreifend ist) nicht auf die spezifischen Bedürfnisse von Entwicklern ein.


2
Wow, ich frage mich, wie sie 20 Jahre lang gegen "Wir brauchen keinen Paketmanager!" Kämpfen werden.
TheLQ

8
Nun, da sie von Boost-Ruhm sind, werde ich ihnen den Vorteil des Zweifels geben und einen Blick darauf werfen. Boost ist immerhin ziemlich erstaunlich :)
Onno

2
@TheLQ - Ich glaube, es gibt nichts anderes zu bekämpfen, als dass niemand zuvor eine praktikable Lösung vorgestellt hat. Es gibt kein "Wir brauchen nicht zu stinken" und keinen "Niemand hat mir etwas gezeigt, was nützlich erscheint". Ersteres kann schwierig zu umgehen sein, letzteres ist einfach: Stellen Sie einfach etwas vor, das Entwicklern tatsächlich hilft, ihre Arbeit zu erledigen.
Michael Kohne

1
Diese Antwort sollte aktualisiert werden: 1) Ryppl ist ein totes Projekt, auch wenn seine Website tot ist. 2) Andere (kommerzielle oder nicht kommerzielle) Projekte wie cpm sind in letzter Zeit aufgetaucht. Es wird also noch viel gearbeitet, um einen Paketmanager für C ++ zu finden. 3) Ich glaube, dass es keinen Gewinner geben wird, bis die Module in der Sprache sind und eines der Tools es schafft, das voll auszuschöpfen.
Klaim

2
@Klaim re: {bis Module in der Sprache sind} Soweit ich das verstehe, werden die Dinge nicht einfacher, es ist nur ein Syntaxzucker für den #includeBefehl. Das Hauptproblem von Versions- / Download- / Installations- / Kompatibilitäts- / plattformübergreifenden C ++ - Problemen wird dadurch nicht gelöst.
Ruslo

17

Ich denke, dass ein Problem mit C und noch mehr mit C ++ darin besteht, dass es sich um heterogene Sprachen handelt: Auch wenn diese Sprachen standardisiert sind, gibt es unterschiedliche Compiler mit unterschiedlichen Optionen oder unterschiedlichen Mengen unterstützter Funktionen. Ich erinnere mich beispielsweise, eine Frage zu C ++ beim Stapelüberlauf mit einem Beispiel gestellt zu haben, das unter GCC / Linux einwandfrei funktioniert hat, und jemand hat sofort eine Antwort gesendet, dass mein Code nicht dem Standard entspricht.

Ein Paketsystem wie das in der Frage erwähnte zu haben, würde bedeuten, eine gemeinsame Sprache und Bibliotheken zu haben, die von allen wichtigen Compilern auf allen gängigen Betriebssystemen einheitlich unterstützt werden. Sie möchten beispielsweise kein C ++ - Paket herunterladen und feststellen, dass es auf Ihrer Version von Compiler X nicht kompiliert werden kann, da es auf Compiler Y auf einem anderen Betriebssystem entwickelt wurde.

Ich könnte mir vorstellen, dass ein System, das auf make- und configure-Skripten basiert (wie es unter Linux, Cygwin und anderen Unix-Varianten üblich ist), funktionieren könnte. Aber warum sollten Visual Studio-Benutzer es übernehmen? Gleiches gilt, wenn ein auf Microsoft Compilern (und Bibliotheken) basierendes Paketsystem gestartet wird.

Die Tatsache, dass C ++ eine sich schnell entwickelnde Sprache ist und ihre Standards immer einige Zeit in Anspruch nehmen, bevor sie von allen Compilern vollständig unterstützt werden, lindert das Problem nicht.


Nun, Sie können portables C ++ schreiben oder Sie können in eine bestimmte Toolchain schreiben. Ihre Wahl und nichts Falsches, obwohl Sie die erste Wahl nicht treffen, wenn die zweite Wahl keinen Vorteil bringt, ist etwas suboptimal.
Deduplizierer

2
Es gibt portables C und C ++. Wenn eine Bibliothek von einem Installer nicht einfach eigenständig installiert werden kann, sollte sie neu erstellt werden. Es ist durchaus möglich, dies zu erreichen. Selbst in NodeJS können viele Module nicht auf Windows aufbauen, es gibt sie jedoch, sodass gelegentliche Build-Probleme kein Problem darstellen. Ein zentraler Paketmanager rationalisiert das Feedback der Benutzer und erhöht den Anreiz, sich mit Problemen zu befassen.
Dmitry

4

Ich denke, die Fragen, die wir stellen müssen, um Ihre Fragen zu beantworten, lauten: "Was haben andere Sprachen / Ökosysteme davon, ein eigenes zentrales Paket-Repository zu haben?" und "Gilt das für C / C ++?"

Ich glaube, die Antwort auf die erste Frage hat etwas mit der anfänglichen Förderung einer neuen Sprache zu tun: Die Early Adopters möchten es Neuankömmlingen so einfach wie möglich machen, in das Ökosystem einzusteigen, nützlichen, getesteten Code zu erwerben und ihren eigenen Code zurückzugeben. Aus offensichtlichen Gründen hat der "Verwendungsgraph" immer eine einzige Wurzel - den Schöpfer (die Schöpfer) der Sprache. Normalerweise gibt es eine Referenzimplementierung (zumindest anfangs), und daher muss jeder Code, den Sie freigeben möchten, dieser entsprechen.

Dies macht es einfach, Pakete zu erstellen, die nur heruntergeladen und kompiliert werden. Wäre C oder C ++ im Jahr 2013 eingeführt worden, hätten ihre Communities einen ähnlichen Entwicklungspfad beschreiten können, aber das war nicht der Fall, und es gibt keine einzige Toolchain, auf die ein Paketmanager angewendet werden könnte. Dies macht die Implementierung eines solchen Programms zu mühsam, um den Aufwand wert zu sein. (Sollten Sie Benutzer dazu bringen, zwischen libfoo-gcc und libfoo-vs zu wählen? Überlassen Sie die Lösung dem Packager? Oder dem Erstellungsprozess? Wenn ja, wie unterscheidet sich ein Paket von einem reinen Tarball?)

Um meine Antwort auf die erste Frage zusammenzufassen: Ich denke, das Muster der Erstellung von Paketmanagern dient hauptsächlich dazu, die Akzeptanz voranzutreiben .

In Anbetracht dessen ist es meiner Meinung nach ziemlich einfach zu verstehen, warum kein einzelnes System aufgestiegen ist, um diesen Bedarf zu decken - da C- und C ++ - Programmierer nicht benötigt werden. Was für die C- und C ++ - Community (oder wirklich für jede Programmierer-Community) ein Problem darstellt, ist die ursprünglich implizierte Notwendigkeit, Code zu verteilen, auf dem neuesten Stand zu halten und einen Beitrag zum Code zu leisten. Dies wurde viele Male von verschiedenen Personen mit unterschiedlichem Erfolg gelöst, und tatsächlich gewinnt ein System einen signifikanten Marktanteil: git (und einige andere Systeme zuvor).

Grundsätzlich, wenn sich die Probleme unterscheiden, sehen die Lösungen auch anders aus, aber IMHO ist der Unterschied zwischen Tippen gem installund git clonestrittig.


2
"Was profitieren andere Sprachen / Ökosysteme von einem eigenen zentralen Paketdepot?" Sie müssen ein sehr erfahrener Entwickler sein, um Pakete herunterzuladen und darauf zu vertrauen, dass sie ordnungsgemäß mit Ihrer Software funktionieren. Mit einem Paketmanager können Benutzer einfach anfangen, Pakete zu verwenden, anstatt sich mit kontextsensitiven Erstellungsanweisungen usw. zu befassen. Ich selbst kann nicht herausfinden, wie ich Boost für die Arbeit mit MinGW bekomme. Daher schreibe ich viel von seiner Funktionalität immer wieder selbst, anstatt sie nur zu verwenden. Es ist dumm nicht zu haben.
Dmitry

1
Es wäre ein großer Gewinn, nicht mit verschiedenen Install / Build-Skripten und -Flaggen kämpfen zu müssen.
Themihai

3

Diese Frage ist etwas verwirrend. Die oben genannte Software verwaltet Erweiterungen für bestimmte Programmiersprachen. Sie stellen Bibliotheken und Quellcode zur Verfügung, die anschließend in Ihrem Programm mit der Programmiersprache Ihrer Wahl verwendet werden können.

Während allgemeine Paketverwalter auf Systemebene normalerweise Binärpakete bereitstellen, die unabhängig von der Anwendung verwendet werden können. Sie sind mehr auf das System und den Benutzer ausgerichtet. Natürlich können Paketverwaltungssysteme auf Systemebene wie Aptitude, rpm, Entropy jedes Paket bereitstellen , sei es Binär- oder Quellcode. Deshalb finden Sie in ihnen die meisten Erweiterungen, die Sie mit ... Gem zum Beispiel installieren würden .

Was Sie als Yum und Apt-get oder Rigo bezeichnet haben, sind nur Benutzeroberflächen für die darunter liegenden Paketverwaltungssysteme.

Noch eine für die Liste der Programmiersprachen:

  • Komponist und Birne für PHP

Ja, auf jeden Fall. Woran habe ich gedacht, als ich die letzten drei Fragen geschrieben habe?
m0nhawk

Das Problem ist, dass diese Pakete global und nicht lokal abgerufen werden und es sehr schwierig ist, Abhängigkeiten Ihres Projekts in einem einzigen Ordner zu bündeln. Dies bedeutet, dass ein Projekt möglicherweise auf Ihrem System funktioniert. Sobald Sie es jedoch auf ein anderes System übertragen, müssen Sie sich daran erinnern, wovon es abhängt, alle Projekte abrufen und an den von Ihrem Projekt erwarteten genauen Stellen platzieren. Dieser Prozess ist die Hölle. Ein Beispiel hierfür ist GTK, das einfach global zu installieren und schwer lokal zu installieren ist.
Dmitry

0

Mir ist klar, dass dies keine plattformübergreifende Lösung ist, aber sie sollte dem Mix hinzugefügt werden.

CoApp hat kürzlich die Unterstützung für die C ++ - Paketverwaltung mit NuGet angekündigt: http://blog.nuget.org/20130426/native-support.html

Dies funktioniert derzeit nur mit dem Visual Studio-Compiler, aber es gab viele Anfragen, um dies auf anderen Plattformen zum Laufen zu bringen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.