CおよびC ++用のパッケージ管理システムがないのはなぜですか?[閉まっている]


78

パッケージ管理システムが存在するプログラミング言語がいくつかあります。

そのようなシステムには他の言語がありますか?CとC ++はどうですか?(それが主な質問です!)なぜそのようなシステムがないのですか?yumapt-getまたはその他の一般的なパッケージ管理システム用のパッケージの作成は改善されていませんか?


3
Objective-CにはCocoapodがあります(ruby gemおよびbundlerに非常に似ています)。C ++には似たようなものがありません。おそらく、C ++の均質性が低いためです。Appleは、パッケージをビルドするための標準的なものを提供しています。C ++では、使用する文字列クラスについてほとんど同意できません。
エリックエンハイム

他の言語のパッケージマネージャーは完璧ではないことを指摘したいと思います。たとえば、Ruby Gemsでは、特定のOS(おそらくWindows)で動作しないgemに遭遇することが多く、ドキュメントではそのOSで動作しないことが示されていません。
トラビスペセット

回答:


28

実際、(顕著なブースト名声の)一部の人々は、Rypplと呼ばれるそのようなシステムを作成して確立するために一生懸命働いています。このようなSystem for C ++を確立するのは困難です。なぜなら、それを指示できる単一のプレーヤーがないからです。-更新:残念ながら、放棄されています。

2番目の質問では、通常のパッケージマネージャー(クロスプラットフォームではない)は、開発者の特定のニーズを処理しません。


2
うわー、彼らは20年間の「パッケージマネージャーは必要ありません!」
TheLQ

8
まあ、彼らはブーストの名声であり、私は彼らに疑いの利益を与え、覗き見します。ブーストは、結局のところ、非常に素晴らしいです:)
オンノ

2
@TheLQ-誰も以前に実行可能な解決策を提示していないということ以外に戦うものはないと思います。「パッケージマネージャーを悪臭を放つ必要はありません」、「役に立つと思われるものを誰も見せてくれない」ということはありません。前者は回避するのが難しい場合がありますが、後者は単純です。実際に開発者が仕事をするのに役立つものを提示するだけです。
マイケルコーネ

1
この回答は更新する必要があります:1)Rypplは、Webサイトが死んでいるとしても、死んだプロジェクトです。2)cpmのような他のプロジェクト(商用または非商用)が最近発生したため、C ++のパッケージマネージャーを取得するために多くの作業が行われています。3)モジュールが言語で作成され、ツールの1つがそれを最大限に活用するまで、勝者はいないと思います。
クライム

2
@Klaim re:{モジュールが言語になるまで}私が理解している限り、モジュールは物事を簡単にするものではなく、それは#includeコマンドの単なる構文糖です。バージョン管理/ダウンロード/インストール/互換性/クロスプラットフォームC ++の問題の主な問題は解決しません。
ruslo

17

Cの問題、さらにC ++の問題は、それらがより異種言語であることだと思います。これらの言語は標準化されていますが、異なるオプションまたはサポートされる機能の異なるセットを持つ異なるコンパイラが存在します。たとえば、スタックオーバーフローでのC ++に関する質問をGCC / Linuxで完全に動作する例で投稿したことを覚えています。誰かが私のコードは非標準であるという回答をすぐに投稿しました。

質問で言及されているようなパッケージシステムを持つことは、すべての一般的なオペレーティングシステム上のすべての主要なコンパイラーによって均一にサポートされる共通の言語とライブラリを持っていることを意味します。たとえば、C ++パッケージをダウンロードして、別のオペレーティングシステムのコンパイラYで開発されたため、コンパイラXのバージョンでコンパイルされないことを発見する必要はありません。

makeおよびconfigureスクリプト(Linux、cygwin、およびその他のUnixフレーバーで一般的に見られる)に基づくシステムが機能すると想像できました。しかし、なぜVisual Studioユーザーはそれを採用する必要があるのでしょうか?Microsoftコンパイラー(およびライブラリー)に基づいたパッケージシステムを起動した場合も同様です。

C ++が急速に進化している言語であり、その標準がすべてのコンパイラーによって完全にサポートされるまで常に時間がかかるという事実は、問題を軽減しません。


ポータブルC ++を作成することも、特定のツールチェーンに作成することもできます。あなたの選択であり、どちらにも悪いことはありませんが、後者に利点がないときに前者をしないことはやや最適ではありません。
デュプリケータ

2
移植可能なCおよびC ++があります。インストーラーでライブラリをスタンドアロンで簡単にインストールできない場合は、作り直す必要があります。これを達成することは完全に可能です。NodeJSでも、多くのモジュールはWindowsでビルドできませんが、それでも存在し続けているため、時折ビルドの問題は問題になりません。また、集中化されたパッケージマネージャーがユーザーからのフィードバックを合理化し、問題に対処するインセンティブを高めます。
ドミトリー

4

あなたの質問に答えるために私たちが尋ねる必要がある質問は、「他の言語/エコシステムは、独自の集中化されたパッケージリポジトリを持っていることから何を得るのだろうか?」および「これはC / C ++に適用されますか?」

最初の質問に対する答えは、新しい言語の最初のプロモーションに関係していると感じています。早期採用者は、初心者がエコシステムに参入し、有用でテスト済みのコードを取得し、独自に貢献することを可能な限り簡単にしたいと考えています。明らかな理由から、「使用状況グラフ」には常に単一のルート(言語の作成者)があります。通常、(少なくとも最初は)1つの参照実装があるため、共有したいコードはそれに準拠する必要があります。

これにより、ダウンロードしてコンパイルするだけのパッケージを簡単に作成できます。確かに、CまたはC ++が2013年に導入された場合、コミュニティは同様の進化パスをたどることができましたが、そうではなく、パッケージマネージャーを適用する単一の一般的なツールチェーンはありませんでした。これにより、このようなプログラムの実装は面倒になりすぎて面倒になりません。(ユーザーにlibfoo-gccとlibfoo-vsのどちらを選択させるべきですか?解決するのはパッケージャーに任せますか?それともビルドプロセス?もしそうなら、パッケージはストレートアップtarballとはどう違うのですか?)

したがって、最初の質問に対する私の答えをまとめると、パッケージマネージャーを作成するパターンは、主に採用を促進するのに役立つと思います。

そのことを念頭に置いて、このニーズを満たす単一のシステムがない理由を理解するのはかなり簡単だと思います-ニーズはCおよびC ++プログラマには存在しないからです。CおよびC ++コミュニティ(または実際にプログラマコミュニティ)にとって問題となるのは、元々暗示されていた必要性です:配布し、最新の状態に保ち、コードを貢献することです。これは、さまざまな成功度の異なる人々によって何度も解決されており、実際、1つのシステムが大きな市場シェアを獲得しています:git(およびそれ以前の他のシステム)。

基本的に問題が異なる場合、ソリューションも異なって見えますが、入力gem installと入力の違いgit cloneは無意味です。


2
「他の言語/エコシステムは、独自の集中パッケージリポジトリを持っていることから何を得るのですか?」。パッケージのダウンロードを開始し、ソフトウェアで適切に動作することを信頼するには、非常に経験豊富な開発者である必要があります。パッケージマネージャーを使用すると、状況依存のビルド手順などを処理する代わりに、パッケージの使用を開始できます。私自身は、MinGWでブーストを取得する方法を理解できません。そのため、単に使用するのではなく、その機能の多くを何度も何度も書き続けることになります。持っていないのはばかげている。
ドミトリー

1
さまざまなインストール/ビルドスクリプトおよびフラグと戦う必要がないことは、大きな勝利です。
-themihai

3

この質問には少し混乱があります。上記のソフトウェアは、特定のプログラミング言語の拡張機能を管理します。これらは、選択したプログラミング言語でプログラムで使用できるライブラリとソースコードを提供します。

一般的なシステムレベルのパッケージマネージャーは通常、アプリケーションに関係なく使用できるバイナリパッケージを提供します。彼らはシステムとユーザーをより重視しています。もちろん、Aptitude、rpm、Entropyなどのシステムレベルのパッケージ管理システムは、バイナリまたはソースコードである任意のパッケージを提供できます。だからこそ、インストールする拡張機能のほとんどをそれらの中に見つけることができます。たとえば、Gem

あなたがYumApt-getまたはRigo と言ったのは、その下にあるパッケージ管理システムのユーザーインターフェイスにすぎません。

プログラミング言語のリストについてもう1つ:

  • ComposerおよびPear for PHP

ええ、間違いなく。最後の3つの質問を書くときに私が考えていたことは何ですか?
m0nhawk

問題は、これらのパッケージがローカルではなくグローバルに取得され、プロジェクトの依存関係を単一のフォルダーにまとめることが非常に難しいことです。これは、プロジェクトがシステムで動作する可能性があることを意味しますが、別のシステムにプロジェクトを配置したらすぐに、依存するものを記憶し、すべてを取得して、プロジェクトが期待する正確な場所に配置する必要があります。このプロセスは地獄です。この例としては、GTKがあり、グローバルに簡単にインストールでき、ローカルにインストールするのは困難です。
ドミトリー

0

これはクロスプラットフォームのソリューションではないことを認識していますが、ミックスに追加する必要があります。

CoAppは最近、NuGetを使用したC ++パッケージ管理のサポートを発表しました:http : //blog.nuget.org/20130426/native-support.html

現在、これはVisual Studioコンパイラでのみ動作しますが、他のプラットフォームで動作させるために多くの要求がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.