Composer.json içindeki require ve require-dev bölümleri arasındaki fark nedir?


105

Besteci kullanmaya başlıyorum, onun hakkında çok az şey biliyorum ve web uygulaması geliştirme konusunda biraz tecrübem var.

Sadece Nettuts + Tutorial üzerinden geçiyorum , bu yüzden besteci hakkında temel sorum var.

{
  "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. "require-dev"Kısmen ne görünüyorsa , yalnızca indirilecek ve yüklenecek composer install --devmi?
  2. Bestecinin bazı belgelerini okudum ama yine de katılmamızın nedenini anlamadım "require-dev"? Her zaman en son kararlı sürümü almak yerine paketin belirli bir sürümünü almak istediğimiz için mi?

Yanıtlar:


125

Farklı Ortamlar

Tipik olarak, yazılım farklı ortamlarda çalışır:

  • development
  • testing
  • staging
  • production

Farklı Ortamlarda Farklı Bağımlılıklar

requireBölümünde bildirilen composer.jsonbağımlılıklar, tipik olarak bir uygulamayı veya paketi çalıştırmak için gerekli olan bağımlılıklardır.

  • staging
  • production

ortamlarda, require-devbölümde belirtilen bağımlılıklar tipik olarak içinde gerekli olan bağımlılıklardır.

  • developing
  • testing

ortamlar.

Örneğin, bir uygulamayı gerçekten çalıştırmak için kullanılan paketlere ek olarak, yazılımı geliştirmek için aşağıdakiler gibi paketler gerekebilir:

  • friendsofphp/php-cs-fixer (kodlama stili sorunlarını tespit etmek ve düzeltmek için)
  • squizlabs/php_codesniffer (kodlama stili sorunlarını tespit etmek ve düzeltmek için)
  • phpunit/phpunit (geliştirmeyi testleri kullanarak yönlendirmek için)
  • vb.

Dağıtım

Şimdi, içinde developmentve testingortamlarda, genellikle

$ composer install

Her iki yüklemek productionve developmentbağımlılıkları.

Ancak, stagingve productionortamlarda, yalnızca uygulamayı çalıştırmak için gerekli olan bağımlılıkları yüklemek istersiniz ve dağıtım işleminin bir parçası olarak, genellikle

$ composer install --no-dev

yalnızca productionbağımlılıkları yüklemek için .

Anlambilim

Başka bir deyişle, bölümler

  • require
  • require-dev

için göstermektedir composerçalıştırdığınızda hangi paketler yüklü olmalıdır

$ composer install

veya

$ composer install --no-dev

Hepsi bu.

Not Uygulamanızın veya paketinizin bağlı olduğu paketlerin geliştirme bağımlılıkları asla kurulmayacaktır.

Referans için bkz:


Tüm vendorklasörü FTP yoluyla yükleyerek "dağıtmamın" hiç önemli olmadığını doğru bir şekilde anlıyor muyum ?
pilat

2
@pilat Yapabilirsiniz, ancak —no-dev. Ayrıca, FTP muhtemelen oldukça yavaş olacaktır.
localheinz

Yalnızca uygulamanızı oluşturmak için ihtiyaç duyduğunuz bağımlılıklara ne dersiniz? Bu nedenle, bir derleme ve dağıtma işlem hattında, bunları inşa etmek için kurmak ve ardından dağıtmadan önce yeniden kaldırmak istiyorum. Örneğin, küçültme veya LESS / SASS'yi css'e dönüştürmek için. Bunu nasıl yaptın?
Richard Kiefer

1
@RichardKiefer Bazı kişiler phar.io kullanıyor , diğerleri PHAR'ları kontrol ediyor, ancak diğerleri Docker görüntülerini kullanıyor ve ayrıca bazı insanlar ayrı bir görüntü kullanıyor composer.json- örneğin github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz

Yani sadece composer.json dosyasını kaydedip deponuza mı kilitlersiniz? Her şeyi teslim etmek ve dağıtım için git kullanarak ana dalı üretimden çekmek daha mantıklı değil mi?
mbomb007

62
  1. Göre besteci manuel var :

    ihtiyaç-dev (yalnızca kök)

    Bu paketi geliştirmek veya testleri çalıştırmak için gerekli paketleri listeler. Kök paketin geliştirme gereksinimleri varsayılan olarak yüklenir. Her ikisi de installveya dev bağımlılıklarının yüklenmesini engelleyen seçeneği updatedestekler --no-dev.

    Böylece çalıştırmak composer install, geliştirme bağımlılıklarını da indirecektir.

  2. Nedeni aslında oldukça basit. Belirli bir kitaplığa katkıda bulunurken, test takımlarını veya diğer geliştirme araçlarını (örn. Symfony) çalıştırmak isteyebilirsiniz. Ancak bu kitaplığı bir projeye yüklerseniz, bu geliştirme bağımlılıkları gerekli olmayabilir: her proje bir test çalıştırıcısı gerektirmez.


19

Besteci sitesinden (yeterince açık)

# gerekli

Bu paketin gerektirdiği paketleri listeler. Bu gereksinimler karşılanmadığı sürece paket kurulmayacaktır.

need-dev (yalnızca kök) #

Bu paketi geliştirmek veya testleri çalıştırmak için gerekli paketleri listeler. Kök paketin geliştirme gereksinimleri varsayılan olarak yüklenir. Hem yükleme hem de güncelleme, dev bağımlılıklarının yüklenmesini önleyen --no-dev seçeneğini destekler.

Composer'da require-dev'i kullanarak, projeyi geliştirmek / test etmek için ihtiyaç duyduğunuz, ancak üretimde ihtiyaç duymadığınız bağımlılıkları bildirebilirsiniz. Projeyi üretim sunucunuza yüklediğinizde (git kullanarak) require-devkısmı göz ardı edilecektir.

Ayrıca yazar tarafından gönderilen bu yanıtı ve bu gönderiyi de kontrol edin .


3
Lütfen bana neden "yol / jeneratörler": "dev-master" "gerekli" bölümünde olduğunu açıklayın, artık üretimde buna ihtiyacım olmayacak.
Zanaatkar

1
Bu tam bir tahmin, ancak düşünebildiğim tek şey, yol / üreticiler bir hizmet sağlayıcı olarak eklendiği için, üretim ortamında eksikse, Laravel çalışmayacağıdır.
Daniel Hollands

2
Parça Kök paketin geliştirici gereksinimleri varsayılan olarak yüklenir, gereksinim-dev'den gelen dağıtımların üretim sunucusunda bile kurulduğunu açıkça belirtir.
Gemmu

3
Buradaki fikir, üretimde --no-dev bayrağını kullanmanızdır.
John Pancoast

2

gereksinim bölümü Bu bölüm, üretim ortamında kurulmak / zorunlu kılmak için daha iyi adaylar olan paketleri / bağımlılıkları içerir.

need-dev bölümü: Bu bölüm, geliştiricinin kodunu test etmek için (veya yerel makinesinde denemek için kullanabileceği ve bu paketlerin üretim ortamında kurulmasını istemediği) paketleri / bağımlılıkları içerir.


1

Genel kural, gereksinim-dev bölümündeki paketleri yalnızca geliştirme (dev) ortamlarında, örneğin yerel ortamda istemenizdir .

Requ -dev bölümündeki paketler, uygulamada hata ayıklamanıza, testleri çalıştırmanıza vb.

At evreleme ve üretim ortamında muhtemelen sadece paketler istiyorum gerektiren bölümü.

Ancak yine de herhangi bir ortamda composer install --no-dev ve composer update --no-dev çalıştırabilirsiniz, komut sadece gerekli bölümden paketleri kuracaktır , gereksinim-dev'den değil , ancak muhtemelen bunu yalnızca hazırlama ve üretimde çalıştırmak istersiniz. yerel olmayan ortamlar.

Teorik olarak tüm paketleri gerekli bölümüne koyabilirsiniz ve hiçbir şey olmayacaktır, ancak aşağıdaki nedenlerden dolayı üretim ortamında paket geliştirmek istemezsiniz:

  1. hız
  2. bazı hata ayıklama bilgilerini açığa çıkarma potansiyeli
  3. vb

Requ-dev için bazı iyi adaylar şunlardır:

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

Yukarıdaki paketlerin ne yaptığını görebilir ve üretimde onlara neden ihtiyaç duymadığınızı görürsünüz.

Daha fazlasını burada görün: https://getcomposer.org/doc/04-schema.md


0

Not gerektiren-dev (kök okunur) !

Bu, require-dev bölümünün yalnızca paketiniz tüm projenin kökü olduğunda geçerli olduğu anlamına gelir . Yani composer updatepaket klasörünüzden çalıştırırsanız .

Kendi composer.json adlı bir ana proje için bir eklenti geliştirirseniz, gereksinim-dev bölümünüz tamamen göz ardı edilecektir! Geliştirme bağımlılıklarınıza ihtiyacınız varsa, require-dev'inizi ana projede composer.json'a taşımanız gerekir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.