Jaka jest różnica między sekcjami require i require-dev w pliku composer.json?

104

Zaczynam korzystać z narzędzia Composer, niewiele o nim wiem i mam niewielkie doświadczenie w tworzeniu aplikacji internetowych.

Po prostu przechodzę przez Nettuts + Tutorial , więc mam podstawowe pytanie dotyczące kompozytora.

{
  "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. Cokolwiek pojawi się "require-dev"częściowo, zostanie pobrane i zainstalowane tylko z composer install --dev?
  2. Przeczytałem część dokumentacji kompozytora, ale nadal nie rozumiem, z jakiego powodu mamy "require-dev"część? Czy to dlatego, że chcemy uzyskać konkretną wersję pakietu, a raczej zawsze otrzymując najnowszą stabilną wersję?
Rzemieślnik
źródło
Związane z: stackoverflow.com/q/16679589/82216
sampablokuper

Odpowiedzi:

122

Różne środowiska

Zazwyczaj oprogramowanie będzie działać w różnych środowiskach:

  • development
  • testing
  • staging
  • production

Różne zależności w różnych środowiskach

Zależności, które są zadeklarowane w requiresekcji, composer.jsonsą zwykle zależnościami, które są wymagane do uruchomienia aplikacji lub pakietu w

  • staging
  • production

środowiskach, podczas gdy zależności zadeklarowane w require-devsekcji są zwykle zależnościami, które są wymagane w

  • developing
  • testing

środowiskach.

Na przykład oprócz pakietów używanych do faktycznego uruchamiania aplikacji mogą być potrzebne pakiety do tworzenia oprogramowania, takie jak:

  • friendsofphp/php-cs-fixer (aby wykryć i naprawić problemy ze stylem kodowania)
  • squizlabs/php_codesniffer (aby wykryć i naprawić problemy ze stylem kodowania)
  • phpunit/phpunit (do kierowania rozwojem za pomocą testów)
  • itp.

Rozlokowanie

Teraz, w środowiskach developmenti testing, zwykle byłbyś uruchamiany

$ composer install

aby zainstalować oba productioni developmentzależności.

Jednak w środowiskach stagingi productionchcesz zainstalować tylko zależności, które są wymagane do uruchomienia aplikacji, a jako część procesu wdrażania zazwyczaj uruchamia się

$ composer install --no-dev

zainstalować tylko productionzależności.

Semantyka

Innymi słowy, sekcje

  • require
  • require-dev

wskaż, composerktóre pakiety powinny zostać zainstalowane podczas uruchamiania

$ composer install

lub

$ composer install --no-dev

To wszystko.

Uwaga Zależności programistyczne pakietów, od których zależy Twoja aplikacja lub pakiet, nigdy nie zostaną zainstalowane

Aby uzyskać więcej informacji, zobacz:

localheinz
źródło
Czy dobrze rozumiem, że w ogóle nie ma znaczenia, czy „wdrożę”, przesyłając cały vendorfolder przez FTP?
pilat
2
@pilat Możesz, ale pamiętaj, aby zainstalować z —no-dev. Ponadto FTP będzie prawdopodobnie dość powolny.
localheinz
A co z zależnościami, których potrzebujesz tylko do zbudowania aplikacji? Tak więc w przypadku potoku kompilowania i wdrażania chciałbym je zainstalować w celu zbudowania, a następnie ponownie usunąć przed wdrożeniem. Np. Do minifikacji lub zamiany LESS / SASS na css. Jak byś to zrobił?
Richard Kiefer
1
@RichardKiefer Niektórzy używają phar.io , inni sprawdzają PHAR, jeszcze inni używają obrazów Dockera, a także niektórzy używają osobnego composer.json- patrz na przykład github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz
Czy zatwierdziłbyś tylko plik composer.json i zablokowałbyś repozytorium? Czy nie ma sensu zatwierdzać wszystkiego, a do wdrożenia wystarczy pobrać gałąź główną z produkcji za pomocą git?
mbomb007
62
  1. Według instrukcji kompozytora :

    require-dev (tylko root)

    Wyświetla listę pakietów wymaganych do tworzenia tego pakietu, uruchamiania testów itp. Wymagania programistyczne pakietu głównego są instalowane domyślnie. Obie installlub updateobsługują --no-devopcję, która zapobiega instalowaniu zależności dev.

    Zatem uruchomienie composer installspowoduje również pobranie zależności programistycznych.

  2. Powód jest właściwie dość prosty. Wnosząc wkład do konkretnej biblioteki, możesz chcieć uruchomić zestawy testów lub inne narzędzia programistyczne (np. Symfony). Ale jeśli zainstalujesz tę bibliotekę w projekcie, te zależności programistyczne mogą nie być wymagane: nie każdy projekt wymaga modułu uruchamiającego testy.

Florent
źródło
19

Ze strony kompozytora (to wystarczająco jasne)

wymagać#

Wyświetla listę pakietów wymaganych przez ten pakiet. Pakiet nie zostanie zainstalowany, jeśli te wymagania nie zostaną spełnione.

require-dev (tylko root) #

Wyświetla listę pakietów wymaganych do tworzenia tego pakietu, uruchamiania testów itp. Wymagania programistyczne pakietu głównego są instalowane domyślnie. Zarówno instalacja, jak i aktualizacja obsługują opcję --no-dev, która zapobiega instalowaniu zależności dev.

Korzystając z require-dev w Composerze, możesz zadeklarować zależności, których potrzebujesz do tworzenia / testowania projektu, ale nie potrzebujesz ich w produkcji. Po przesłaniu projektu na serwer produkcyjny (za pomocą git) require-devczęść zostanie zignorowana.

Sprawdź również tę odpowiedź opublikowaną przez autora oraz ten post .

Alpha
źródło
3
Proszę wyjaśnij mi, dlaczego "way / generators": "dev-master" znajduje się w sekcji "require" ?, nie potrzebowałbym go już w produkcji.
Artisan
1
To całkowite przypuszczenie, ale jedyne, o czym mogę pomyśleć, to to, że ponieważ sposób / generatory są dodawane jako dostawca usług, jeśli brakuje ich w środowisku produkcyjnym, Laravel nie będzie działać.
Daniel Hollands,
2
Część Wymagania dev pakietu głównego są instalowane domyślnie jasno stwierdza, że ​​zależności z require-dev są zainstalowane, nawet na serwerze produkcyjnym.
Gemmu,
3
Chodzi o to, że użyjesz flagi --no-dev na produkcji.
John Pancoast,
2

sekcja require Ta sekcja zawiera pakiety / zależności, które są lepszymi kandydatami do zainstalowania / wymaganych w środowisku produkcyjnym.

Sekcja require-dev: Ta sekcja zawiera pakiety / zależności, które mogą zostać użyte przez programistę do przetestowania jej kodu (lub do eksperymentowania na jej lokalnej maszynie, a ona nie chce, aby te pakiety były instalowane w środowisku produkcyjnym).

MKJ
źródło
1

Ogólna zasada jest taka, że ​​chcesz pakiety z sekcji require-dev tylko w środowiskach programistycznych (deweloperskich), na przykład w środowisku lokalnym.

Pakiety w sekcji require-dev to pakiety, które pomagają debugować aplikację, uruchamiać testy itp.

W środowisku pomostowym i produkcyjnym prawdopodobnie potrzebujesz tylko pakietów z sekcji Require .

Ale w każdym razie możesz uruchomić composer install --no-dev i composer update --no-dev na dowolnym środowisku, polecenie zainstaluje tylko pakiety z wymaganej sekcji, a nie z require-dev , ale prawdopodobnie chcesz to uruchomić tylko na etapie przemieszczania i produkcji środowiska nie lokalne.

Teoretycznie możesz umieścić wszystkie pakiety w sekcji require i nic się nie stanie, ale nie chcesz tworzyć pakietów na środowisku produkcyjnym z następujących powodów:

  1. prędkość
  2. potencjał ujawnienia niektórych informacji debugowania
  3. itp

Dobrymi kandydatami do require-dev są:

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

możesz zobaczyć, co robią powyższe pakiety i zobaczysz, dlaczego nie potrzebujesz ich na produkcji.

Zobacz więcej tutaj: https://getcomposer.org/doc/04-schema.md

fico7489
źródło
0

Zwróć uwagę na require-dev (tylko root-only) !

co oznacza, że sekcja require-dev jest prawidłowa tylko wtedy, gdy twój pakiet jest katalogiem głównym całego projektu. To znaczy, jeśli uruchamiasz composer updatez folderu pakietu.

Jeśli stworzysz wtyczkę dla jakiegoś głównego projektu, który ma swój własny plik composer.json, wtedy Twoja sekcja require-dev zostanie całkowicie zignorowana! Jeśli potrzebujesz swoich zależności deweloperskich, musisz przenieść swoje require-dev do composer.json w głównym projekcie.

Orkan
źródło