Mengapa tidak ada sistem manajemen paket untuk C dan C ++? [Tutup]

78

Ada beberapa bahasa pemrograman yang memiliki sistem manajemen paket:

Apakah ada bahasa lain dengan sistem seperti itu? Bagaimana dengan C dan C ++? (itu pertanyaan utamanya!) Mengapa tidak ada sistem seperti itu untuk mereka? Dan bukankah membuat paket untuk yum, apt-getatau sistem manajemen paket umum lainnya lebih baik?

m0nhawk
sumber
3
Objective-C memiliki Cocoapods (sangat mirip dengan permata ruby ​​dan bundler). Sangat aneh bahwa C ++ tidak memiliki yang serupa. Mungkin karena C ++ kurang homogen. Apple menyediakan lebih banyak barang standar untuk membangun paket di atas. Dalam C ++ seseorang hampir tidak bisa menyetujui kelas string apa yang digunakan.
Erik Engheim
Saya hanya ingin menunjukkan bahwa manajer paket dari bahasa lain tidak sempurna. Sebagai contoh, di Ruby Gems seseorang mungkin sering menemukan permata yang tidak bekerja untuk OS tertentu (lebih dari Windows kemungkinan) dan dokumentasi tidak memberi tahu Anda itu tidak bekerja untuk OS itu.
Travis Pessetto
stackoverflow.com/questions/7266097/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

28

Sebenarnya beberapa orang (dari ketenaran boost yang nyata) bekerja keras untuk membuat dan membangun sistem yang disebut Ryppl . Sulit untuk membuat Sistem untuk C ++, karena tidak memiliki pemain tunggal yang dapat mendikte itu. --UPDATE: Sayangnya itu ditinggalkan.

Pada pertanyaan kedua Anda, manajer paket normal (selain tidak menjadi lintas platform) tidak menangani kebutuhan spesifik pengembang.

Fabio Fracassi
sumber
2
Wow, saya bertanya-tanya bagaimana mereka akan bertarung selama 20 tahun, "Kami tidak perlu manajer paket!"
TheLQ
8
Yah, mereka yang terkenal Boost, aku akan memberi mereka keuntungan dari keraguan dan mengintip. Bagaimanapun juga, peningkatan sangat luar biasa :)
Onno
2
@TheLQ - Saya tidak berpikir ada yang perlu diperjuangkan selain itu tidak ada yang sebelumnya memberikan solusi yang bisa diterapkan. Tidak ada 'kita tidak perlu bau manajer paket' ada 'Tidak ada yang menunjukkan padaku apa pun yang tampaknya berguna'. Yang pertama bisa sulit untuk berkeliling, tetapi yang terakhir sederhana: hanya menyajikan sesuatu yang benar-benar membantu para dev melakukan pekerjaan mereka.
Michael Kohne
1
Jawaban ini harus diperbarui: 1) Ryppl adalah proyek mati, bahkan situs webnya sudah mati. 2) Proyek-proyek lain (komersial atau tidak) seperti cpm baru-baru ini muncul sehingga ada banyak pekerjaan yang dilakukan untuk mendapatkan manajer paket untuk C ++. 3) Saya percaya bahwa tidak akan ada pemenang sampai modul dalam bahasa dan salah satu alat berhasil mengeksploitasi itu sepenuhnya.
Klaim
2
@Klaim ulang: {sampai modul dalam bahasa} sejauh yang saya mengerti modul tidak membuat segalanya lebih mudah, itu hanya gula sintaks untuk #includeperintah. Ini tidak akan menyelesaikan masalah utama dari versi C / masalah versi / download / install / kompatibilitas / lintas-platform C ++.
ruslo
17

Saya berpikir bahwa masalah dengan C dan lebih banyak lagi dengan C ++ adalah bahwa mereka adalah bahasa yang lebih heterogen: meskipun bahasa-bahasa ini terstandarisasi di sana ada kompiler yang berbeda dengan opsi yang berbeda atau serangkaian fitur yang didukung. Misalnya, saya ingat memposting pertanyaan tentang C ++ pada stack overflow dengan contoh yang berfungsi dengan baik di GCC / Linux dan seseorang segera memposting jawaban yang mengatakan bahwa kode saya tidak standar.

Memiliki sistem paket seperti yang disebutkan dalam pertanyaan akan menyiratkan memiliki bahasa umum dan perpustakaan yang didukung secara seragam oleh semua kompiler utama pada semua sistem operasi umum. Misalnya, Anda tidak ingin mengunduh paket C ++ dan menemukan bahwa itu tidak dapat dikompilasi pada versi kompiler X Anda karena itu dikembangkan pada kompiler Y pada sistem operasi lain.

Saya bisa membayangkan bahwa sistem yang didasarkan pada skrip make dan konfigurasi (seperti yang biasa ditemukan di Linux, cygwin dan citarasa Unix lainnya) dapat berfungsi. Tetapi mengapa pengguna Visual Studio harus mengadopsinya? Hal yang sama berlaku jika seseorang memulai sistem paket berdasarkan Microsoft Compiler (dan pustaka).

Fakta bahwa C ++ adalah bahasa yang berkembang cepat dan standarnya selalu membutuhkan waktu sebelum didukung sepenuhnya oleh semua kompiler tidak mengurangi masalah.

Giorgio
sumber
Nah, Anda dapat menulis C ++ portabel, atau Anda dapat menulis ke rantai alat tertentu. Pilihan Anda, dan tidak ada yang salah dengan keduanya, meskipun tidak melakukan yang pertama ketika tidak ada keuntungan yang kedua agak suboptimal.
Deduplicator
2
Ada portable C dan C ++. Jika perpustakaan tidak dapat diinstal dengan cara mandiri oleh installer dengan mudah, itu harus dibuat ulang. Sangat mungkin untuk mencapai ini. Bahkan di NodeJS banyak modul gagal dibangun di Windows, tetapi masih berhasil ada, sehingga masalah pembangunan yang kadang-kadang tidak menjadi masalah, dan memiliki manajer paket terpusat akan mengefektifkan umpan balik dari pengguna dan membuatnya lebih insentif untuk menangani masalah.
Dmitry
4

Saya pikir pertanyaan yang perlu kami tanyakan untuk menjawab pertanyaan Anda adalah "Apa yang diperoleh bahasa / ekosistem lain dari memiliki repositori paket terpusat mereka sendiri?" dan "Apakah ini berlaku untuk C / C ++?"

Saya merasa jawaban untuk pertanyaan pertama ada hubungannya dengan promosi awal bahasa baru: pengadopsi awal ingin membuatnya semudah mungkin bagi pendatang baru untuk memasuki ekosistem, mendapatkan kode yang bermanfaat, teruji dan berkontribusi kembali ke bahasa mereka sendiri. Untuk alasan yang jelas, "grafik penggunaan" selalu memiliki satu root - pencipta bahasa. Biasanya ada satu implementasi referensi (setidaknya pada awalnya) dan oleh karena itu kode apa pun yang mungkin ingin Anda bagikan harus sesuai dengannya.

Ini membuatnya mudah untuk membuat paket yang baru saja diunduh dan dikompilasi. Tentu saja, jika C atau C ++ diperkenalkan pada 2013, komunitas mereka bisa saja mengikuti jalur evolusi yang sama, tetapi mereka tidak dan tidak ada satu pun toolchain yang berlaku untuk menerapkan manajer paket. Hal ini membuat implementasi program seperti itu terlalu merepotkan untuk menjadi layak untuk direpotkan. (haruskah Anda membuat pengguna memilih antara libfoo-gcc dan libfoo-vs? Apakah Anda menyerahkannya kepada pemaket untuk diselesaikan? Atau proses pembuatan? Jika demikian, bagaimana suatu paket berbeda dari tarball langsung?)

Jadi untuk meringkas jawaban saya untuk pertanyaan pertama, saya pikir pola membuat manajer paket sebagian besar berfungsi untuk mendorong adopsi .

Dengan pemikiran itu, saya pikir cukup mudah untuk melihat mengapa tidak ada sistem tunggal yang naik untuk memenuhi kebutuhan ini - karena kebutuhan tidak ada untuk programmer C dan C ++. Apa yang sebenarnya merupakan masalah bagi komunitas C dan C ++ (atau komunitas programmer mana pun, sebenarnya) adalah kebutuhan yang semula tersirat: untuk mendistribusikan, tetap mengikuti perkembangan dan menyumbang kembali kode. Ini telah dipecahkan berkali-kali oleh orang yang berbeda dengan berbagai tingkat keberhasilan, dan memang satu sistem mendapatkan pangsa pasar yang signifikan: git (dan beberapa sistem lain sebelum itu).

Pada dasarnya ketika masalahnya berbeda, solusinya terlihat berbeda juga, tetapi IMHO perbedaan antara mengetik gem installdan git clonediperdebatkan.

idoby
sumber
2
"Apa yang diperoleh bahasa / ekosistem lain dari memiliki repositori paket terpusat mereka sendiri?" Anda harus menjadi pengembang yang sangat berpengalaman untuk mulai mengunduh paket dan mempercayai mereka untuk bekerja dengan baik dengan perangkat lunak Anda. Memiliki manajer paket memungkinkan orang untuk mulai menggunakan paket alih-alih berurusan dengan instruksi membangun yang peka konteks / seterusnya. Saya sendiri tidak tahu cara mendapatkan dorongan untuk bekerja di MinGW, jadi saya akhirnya menulis sendiri sebagian besar fungsinya, alih-alih hanya menggunakannya. Konyol tidak punya.
Dmitry
1
Tidak harus bertarung dengan berbagai skrip pemasangan dan pembuatan bendera akan menjadi kemenangan besar.
themihai
3

Ada sedikit kebingungan dalam pertanyaan ini. Perangkat lunak yang disebutkan di atas mengelola ekstensi untuk bahasa pemrograman tertentu. Mereka menyediakan perpustakaan dan kode sumber yang kemudian dapat digunakan dalam program Anda dengan bahasa pemrograman pilihan Anda.

Sementara paket tingkat sistem umum manajer biasanya menyediakan paket biner yang dapat digunakan terlepas dari aplikasi. Mereka lebih berorientasi pada sistem dan pengguna. Tentu saja, sistem manajemen paket tingkat sistem seperti Aptitude, rpm, Entropy dapat menyediakan paket apa pun , baik itu kode biner atau sumber. Itu sebabnya Anda akan menemukan di dalamnya sebagian besar ekstensi yang akan Anda instal dengan ... Permata misalnya.

Daripada, apa yang Anda sebutkan sebagai Yum dan Apt-get atau Rigo hanyalah antarmuka pengguna untuk sistem manajemen paket di bawahnya.

Satu lagi untuk daftar bahasa pemrograman:

  • Komposer dan Pear untuk PHP
Patkos Csaba
sumber
Ya tentu saja. Apa yang saya pikirkan ketika menulis tiga pertanyaan terakhir?
m0nhawk
Masalahnya adalah bahwa paket-paket ini mendapatkan global daripada lokal, dan menggabungkan ketergantungan proyek Anda ke dalam satu folder sangat sulit. Ini berarti bahwa suatu proyek dapat bekerja pada sistem Anda, tetapi segera setelah Anda meletakkannya di sistem lain, Anda perlu mengingat apa itu tergantung dan mendapatkan semua dari mereka dan menempatkan mereka di tempat yang tepat proyek Anda mengharapkannya. Proses ini adalah neraka. Contohnya adalah GTK, mudah dipasang secara global, sulit dipasang secara lokal.
Dmitry
0

Saya menyadari ini bukan solusi lintas-platform, tetapi harus ditambahkan ke dalam campuran.

CoApp baru-baru ini mengumumkan dukungan untuk manajemen paket C ++ menggunakan NuGet: http://blog.nuget.org/20130426/native-support.html

Ini saat ini hanya berfungsi dengan kompiler Visual Studio, tetapi ada banyak permintaan untuk membuatnya bekerja pada platform lain.

Joe
sumber