Apa perbedaan antara bagian require dan require-dev di composer.json?

102

Saya mulai menggunakan komposer, saya tahu sedikit tentangnya dan memiliki sedikit pengalaman dengan pengembangan aplikasi web.

Saya baru saja mengikuti Tutorial Nettuts + , jadi saya punya pertanyaan dasar tentang komposer.

{
  "require": {
    "laravel/framework": "4.0.*",
    "way/generators": "dev-master",
    "twitter/bootstrap": "dev-master",
    "conarwelsh/mustache-l4": "dev-master"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "mockery/mockery": "0.7.*"
  },
  "autoload": {
    "classmap": [
      "app/commands",
      "app/controllers",
      "app/models",
      "app/database/migrations",
      "app/database/seeds",
      "app/tests/TestCase.php"
    ]
  },
  "scripts": {
    "post-update-cmd": "php artisan optimize"
  },
  "minimum-stability": "dev"
}
  1. Apa pun yang muncul "require-dev"sebagian, hanya akan diunduh dan diinstal dengan composer install --dev?
  2. Saya membaca beberapa dokumentasi komposer tapi masih belum paham apa alasan kami ikut "require-dev"serta? Apakah karena kami ingin mendapatkan versi paket tertentu daripada selalu mendapatkan versi stabil terbaru?
Tukang
sumber
Terkait: stackoverflow.com/q/16679589/82216
sampablokuper

Jawaban:

121

Lingkungan yang Berbeda

Biasanya, perangkat lunak akan berjalan di lingkungan yang berbeda:

  • development
  • testing
  • staging
  • production

Ketergantungan Berbeda di Lingkungan Berbeda

Dependensi yang dideklarasikan di requirebagian composer.jsonbiasanya adalah dependensi yang diperlukan untuk menjalankan aplikasi atau paket di

  • staging
  • production

lingkungan, sedangkan dependensi yang dideklarasikan di require-devbagian biasanya adalah dependensi yang diperlukan dalam

  • developing
  • testing

lingkungan.

Misalnya, selain paket yang digunakan untuk benar-benar menjalankan aplikasi, paket mungkin diperlukan untuk mengembangkan perangkat lunak, seperti:

  • friendsofphp/php-cs-fixer (untuk mendeteksi dan memperbaiki masalah gaya pengkodean)
  • squizlabs/php_codesniffer (untuk mendeteksi dan memperbaiki masalah gaya pengkodean)
  • phpunit/phpunit (untuk mendorong pengembangan menggunakan tes)
  • dll.

Penyebaran

Sekarang, di dalam developmentdan testinglingkungan, Anda biasanya akan menjalankan

$ composer install

untuk menginstal keduanya productiondan developmentdependensi.

Namun, dalam stagingdan productionlingkungan, Anda hanya ingin menginstal dependensi yang diperlukan untuk menjalankan aplikasi, dan sebagai bagian dari proses penerapan, Anda biasanya akan menjalankan

$ composer install --no-dev

untuk menginstal productiondependensi saja .

Semantik

Dengan kata lain, bagian

  • require
  • require-dev

tunjukkan composerpaket mana yang harus diinstal saat Anda menjalankan

$ composer install

atau

$ composer install --no-dev

Itu semuanya.

Catatan Ketergantungan pengembangan paket yang bergantung pada aplikasi atau paket Anda tidak akan pernah diinstal

Untuk referensi, lihat:

localheinz
sumber
Apakah saya mengerti dengan benar, bahwa tidak masalah sama sekali jika saya "menerapkan" dengan mengunggah seluruh vendorfolder melalui FTP?
pilat
2
@pilat Anda bisa, tapi pastikan untuk menginstal dengan —no-dev. Selain itu, FTP mungkin akan sangat lambat.
localheinz
Bagaimana dengan dependensi yang Anda perlukan untuk membangun aplikasi Anda saja? Jadi, dalam pipeline build dan deploy, saya ingin menginstalnya untuk membangun lalu menghapusnya lagi sebelum menerapkan. Misal untuk minification, atau mengubah LESS / SASS menjadi css. Bagaimana Anda melakukannya?
Richard Kiefer
1
@RichardKiefer Beberapa orang menggunakan phar.io , yang lain memeriksa di PHAR, namun yang lain menggunakan gambar Docker, dan juga beberapa orang menggunakan yang terpisah composer.json- lihat misalnya github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz
Jadi, apakah Anda hanya menggunakan composer.json dan mengunci repo Anda? Bukankah lebih masuk akal untuk melakukan semuanya, dan untuk penerapan, cukup tarik cabang master dari produksi menggunakan git?
mbomb007
62
  1. Menurut manual komposer :

    membutuhkan-dev (hanya root)

    Daftar paket yang diperlukan untuk mengembangkan paket ini, atau menjalankan tes, dll. Persyaratan dev dari paket root diinstal secara default. Keduanya installatau updatemendukung --no-devopsi yang mencegah dependensi dev diinstal.

    Jadi menjalankan composer installjuga akan mendownload dependensi pengembangan.

  2. Alasannya sebenarnya cukup sederhana. Saat berkontribusi ke pustaka tertentu, Anda mungkin ingin menjalankan rangkaian pengujian atau alat pengembangan lainnya (mis. Symfony). Namun jika Anda menginstal library ini ke sebuah project, dependensi pengembangan tersebut mungkin tidak diperlukan: tidak setiap project memerlukan runner pengujian.

Florent
sumber
19

Dari situs komposer (cukup jelas)

memerlukan#

Daftar paket yang dibutuhkan oleh paket ini. Paket tidak akan diinstal kecuali persyaratan tersebut dapat dipenuhi.

membutuhkan-dev (hanya root) #

Daftar paket yang diperlukan untuk mengembangkan paket ini, atau menjalankan tes, dll. Persyaratan dev dari paket root diinstal secara default. Baik penginstalan atau pembaruan mendukung opsi --no-dev yang mencegah penginstalan dev.

Dengan menggunakan require-dev di Composer, Anda dapat mendeklarasikan dependensi yang Anda perlukan untuk pengembangan / pengujian proyek tetapi tidak perlu dalam produksi. Ketika Anda mengunggah proyek ke server produksi Anda (menggunakan git) require-devbagian akan diabaikan.

Periksa juga jawaban ini yang diposting oleh penulis dan posting ini juga.

Alfa
sumber
3
Tolong jelaskan mengapa "way / generator": "dev-master" ada di bagian "require" ?, Saya tidak akan membutuhkannya lagi dalam produksi.
Artisan
1
Ini adalah tebakan total, tetapi satu-satunya hal yang dapat saya pikirkan adalah karena cara / generator ditambahkan sebagai penyedia layanan, jika tidak ada dalam lingkungan produksi, Laravel tidak akan berfungsi.
Daniel Hollands
2
Bagian Persyaratan dev dari paket root diinstal secara default dengan jelas menyatakan bahwa depensi dari require-dev diinstal, bahkan di server produksi.
Gemmu
3
Idenya adalah Anda akan menggunakan tanda --no-dev pada produksi.
John Pancoast
2

membutuhkan bagian ini berisi paket / dependensi yang merupakan kandidat yang lebih baik untuk diinstal / diperlukan di lingkungan produksi.

Bagian require-dev: Bagian ini berisi paket / dependensi yang dapat digunakan oleh pengembang untuk menguji kodenya (atau untuk bereksperimen pada mesin lokalnya dan dia tidak ingin paket ini diinstal pada lingkungan produksi).

MKJ
sumber
1

Aturan umumnya adalah Anda menginginkan paket dari bagian require-dev hanya di lingkungan pengembangan (dev), misalnya lingkungan lokal.

Paket di bagian require-dev adalah paket yang membantu Anda men-debug aplikasi, menjalankan pengujian, dll.

Pada lingkungan staging dan produksi Anda mungkin hanya menginginkan paket dari yang dibutuhkan bagian .

Tetapi bagaimanapun Anda dapat menjalankan composer install --no-dev dan composer update --no-dev pada lingkungan apa pun, perintah hanya akan menginstal paket dari bagian yang diperlukan bukan dari require-dev , tetapi mungkin Anda ingin menjalankan ini hanya pada pementasan dan produksi lingkungan tidak lokal.

Secara teoritis Anda dapat meletakkan semua paket di bagian require dan tidak akan terjadi apa-apa, tetapi Anda tidak ingin mengembangkan paket di lingkungan produksi karena alasan berikut:

  1. kecepatan
  2. berpotensi mengungkap beberapa info debug
  3. dll

Beberapa kandidat yang baik untuk require-dev adalah:

"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"

Anda dapat melihat apa yang dilakukan paket di atas dan Anda akan melihat mengapa Anda tidak membutuhkannya dalam produksi.

Lihat lebih lanjut di sini: https://getcomposer.org/doc/04-schema.md

fico7489
sumber
0

Perhatikan Requirement-dev (root-only) !

yang berarti bahwa bagian require-dev hanya valid jika paket Anda adalah root dari keseluruhan proyek. Yaitu jika Anda menjalankan composer updatedari folder paket Anda.

Jika Anda mengembangkan plugin untuk beberapa proyek utama, yang memiliki composer.json sendiri, maka bagian require-dev Anda akan sepenuhnya diabaikan! Jika Anda membutuhkan dependensi pengembangan, Anda harus memindahkan require-dev ke composer.json di proyek utama.

Orkan
sumber