Composer ma możliwość załadowania kilku zależności tylko podczas opracowywania, więc narzędzia nie zostaną zainstalowane w środowisku produkcyjnym (na serwerze rzeczywistym). Jest to (w teorii) bardzo przydatne w przypadku skryptów, które mają sens tylko w programowaniu, takich jak testy, narzędzia do fałszywych danych, debugger itp.
Najlepszym sposobem jest dodanie dodatkowego require-dev
bloku z narzędziami potrzebnymi w programie deweloperskim:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
a następnie (teoretycznie) załaduj te zależności za pośrednictwem
composer install --dev
Problem i pytanie:
Composer zmienił zachowanie install
i update
radykalnie w 2013 roku, require-dev
-zależności są teraz instalowane domyślnie (!), Możesz swobodnie utworzyć plik composer.json z require-dev
blokiem i wykonać go composer install
do odtworzenia.
Ponieważ najbardziej akceptowanym sposobem wdrażania jest wypchnięcie kompozytora. lock (który przechowuje twoją obecną konfigurację kompozytora), a następnie wykonaj composer install
na serwerze produkcyjnym, to również zainstaluje programowanie.
Jaki jest prawidłowy sposób wdrożenia tego bez instalowania zależności -dev?
Uwaga: próbuję tutaj utworzyć kanoniczne pytania / odpowiedzi, aby wyjaśnić dziwne wdrożenie kompozytora. Zapraszam do edycji tego pytania.
źródło
composer.lock
Nigdy nie powinny być dodawane do repo Git, nigdy. Właściwym podejściem jest użycie aktualizacji kompozytora podczas przemieszczania, a następnie zsynchronizowanie pliku z produkcją (jeśli oczywiście wszystko działa). Inscenizacja musi być dokładną kopią środowiska produkcyjnego.composer.lock
powinien być częścią.gitignore
.Odpowiedzi:
Czemu
IMHO ma dobry powód, dla którego obecnie Composer będzie używał tej
--dev
flagi domyślnie (podczas instalacji i aktualizacji). Composer jest najczęściej uruchamiany w scenariuszach, w których jest to pożądane zachowanie:Podstawowy przepływ pracy Composer wygląda następująco:
composer.phar install --dev
pliki json i lock są przekazywane do VCS.composer.phar install --dev
.composer.phar require <package>
dodaj,--dev
jeśli chcesz, aby pakiet znalazł się wrequire-dev
sekcji (i zatwierdź).composer.phar install --dev
.composer.phar update --dev <package>
(i commit).composer.phar install --dev
.composer.phar install --no-dev
Jak widać,
--dev
flaga jest używana (znacznie) częściej niż--no-dev
flaga, zwłaszcza gdy rośnie liczba programistów pracujących nad projektem.Wdrożenie produkcyjne
Cóż, plik
composer.json
icomposer.lock
powinien zostać zatwierdzony do VCS. Nie pomijaj,composer.lock
ponieważ zawiera ważne informacje o wersjach pakietów, które powinny być używane.Podczas wdrażania produkcyjnego możesz przekazać
--no-dev
flagę do Composera:composer.lock
Plik może zawierać informacje o dev-pakietów. To nie ma znaczenia.--no-dev
Flag zadba te dev-pakiety nie są zainstalowane.Kiedy mówię „wdrożenie produkcyjne”, mam na myśli wdrożenie, którego celem jest wykorzystanie w produkcji. Nie spieram się, czy
composer.phar install
należy to zrobić na serwerze produkcyjnym, czy na serwerze pomostowym, na którym można sprawdzić. To nie jest zakres tej odpowiedzi. Po prostu wskazuję, jak to zrobićcomposer.phar install
bez instalowania zależności „dev”.Poza tematem
--optimize-autoloader
Flaga może być również pożądane na produkcji (generuje klasy mapę, która przyspieszy samoładownicze w aplikacji):Lub po zakończeniu automatycznego wdrażania:
Jeśli Twój kod obsługuje to, możesz zamienić
--optimize-autoloader
na--classmap-authoritative
. Więcej informacji tutajźródło
--optimize-autoloader
. Weź również pod uwagę--classmap-authoritative
- z dokumentacji tutaj getcomposer.org/doc/03-cli.md można zobaczyć: „Automatyczne ładowanie klas tylko z mapy klas. Niejawnie włącza --optimize-autoloader”, więc możesz użyć, jeśli znasz klasy ” there ", co prawdopodobnie powinno się zdarzyć w środowisku produkcyjnym, chyba że klasy są generowane dynamicznie.optimize-autoloader
bezpośrednio wcomposer.json
:{"config": { "optimize-autoloader": true } }
Właściwie to zdecydowanie poleciłbym PRZECIWKO instalowaniu zależności na serwerze produkcyjnym.
Zalecam pobranie kodu na maszynie wdrożeniowej, zainstalowanie zależności w razie potrzeby (obejmuje to NIE instalowanie zależności dev, jeśli kod trafi do produkcji), a następnie przeniesienie wszystkich plików na maszynę docelową.
Czemu?
composer install
Krótko mówiąc: korzystaj z Composera w środowisku, które możesz kontrolować. Twoja maszyna programistyczna kwalifikuje się, ponieważ masz już wszystko, co jest potrzebne do obsługi programu Composer.
Polecenie do użycia to
To zadziała w każdym środowisku, czy to na samym serwerze produkcyjnym, na maszynie wdrożeniowej, czy też na maszynie deweloperskiej, która ma wykonać ostatnią kontrolę, aby stwierdzić, czy jakiekolwiek wymagania programistyczne nie są nieprawidłowo używane w rzeczywistym oprogramowaniu.
Polecenie nie zainstaluje ani aktywnie odinstaluje wymagań programistycznych zadeklarowanych w pliku composer.lock.
Jeśli nie masz nic przeciwko wdrażaniu komponentów oprogramowania deweloperskiego na serwerze produkcyjnym, uruchomienie
composer install
wykonałoby to samo zadanie, ale po prostu zwiększyłoby ilość przenoszonych bajtów, a także utworzyło większą deklarację autoloadera.źródło
app-1.34.phar
itp.). Istnieje oddzielny mechanizm, który jest powiadamiany i decyduje, kiedy pobrać ten plik, gdzie go przesłać, a następnie co z nim zrobić. Niektóre zespoły decydują się na rozpakowanie phara po umieszczeniu go na serwerze, a niektóre obsługują go tak, jak jest. Dało to duże zaufanie do stabilności i odtwarzalności naszych wdrożeń.Teraz
require-dev
jest domyślnie włączony, w przypadku lokalnego programowania można to zrobićcomposer install
icomposer update
bez tej--dev
opcji.Jeśli chcesz wdrożyć w środowisku produkcyjnym, musisz upewnić się,
composer.lock
że nie ma żadnych pakietów, które pochodzą zrequire-dev
.Możesz to zrobić za pomocą
Po przetestowaniu lokalnie
--no-dev
możesz wdrożyć wszystko do produkcji i zainstalować w oparciu ocomposer.lock
. Potrzebujesz tej--no-dev
opcji ponownie, w przeciwnym razie kompozytor powie "Plik blokujący nie zawiera informacji require-dev" .Uwaga: uważaj na wszystko, co może powodować różnice między programowaniem a produkcją! Generalnie staram się unikać require-dev, gdy tylko jest to możliwe, ponieważ dołączenie narzędzi programistycznych nie jest dużym narzutem.
źródło
composer.lock
zależności deweloperskich. Po prostu uruchomiszcomposer install --no-dev
, a zainstalujesz tylko zwykłe zależności - w rzeczywistości Composer usunie również wszelkie zależności dev w tym kroku.composer.lock
plik zawierał zależności deweloperskie (i potencjalnie wpływał na wersje pakietów innych niż deweloperskie), chciałbym go zaktualizować, aby odzwierciedlić, jak będzie w produkcji. To również zmusza cię do pracycomposer install --no-dev
w produkcji, podobnie jakcomposer install
błąd. Technicznie myślę, że masz rację; nie jest to wymagane, ale jest to dodatkowy poziom bezpieczeństwa, który mi się podoba.dev/tool
iprod/lib:~1.0
. Najnowszy prod / lib to 1.3, ale dev / tool również wymagaprod/lib:1.1.*
. Wynik: zainstalujesz wersję 1.1.9 (najnowszą z gałęzi 1.1.x) i będziesz jej używać podczas tworzenia. Powiedziałbym, że NIE jest bezpieczna aktualizacja--no-dev
, dlatego dołącz najnowszą wersję prod / lib 1.3 i zakładaj, że wszystko działa bez testowania. A może wtedy testowanie jest niemożliwe z powodu braku dev / tool. Zakładałbym, że ponieważ dev / tool nie jest potrzebne w produkcji, nie należy go wdrażać, ale oprogramowanie musi wtedy używać prod / lib 1.1.9.--no-dev
, musisz go przetestować lokalnie, jak wspomniałem w odpowiedzi. Nadal jednak polecałbym--no-dev
w ogóle nie używać .composer update
następnie zrób coś programistycznego, następnie zróbcomposer update --no-dev
, a następnie przeprowadź testy wydania, a następnie przejdź do produkcji i zróbcomposer install --no-dev
. Dwa problemy: 1. Nie mogę przetestować wydania bez zależności deweloperskich i 2. Nie mogę zainstalować na przykład Gita w środowisku produkcyjnym.Na serwerach produkcyjnych zmieniam nazwę
vendor
navendor-<datetime>
i podczas wdrażania będę mieć dwa katalogi dostawców.Plik cookie HTTP powoduje, że mój system wybiera nowego dostawcę
autoload.php
, a po przetestowaniu wykonuję całkowicie atomowe / natychmiastowe przełączanie między nimi, aby wyłączyć katalog starego dostawcy dla wszystkich przyszłych żądań, a następnie usuwam poprzedni katalog kilka dni później.Pozwala to uniknąć wszelkich problemów spowodowanych przez pamięci podręczne systemu plików, których używam w apache / php, a także pozwala każdemu aktywnemu kodowi PHP na kontynuowanie korzystania z katalogu poprzedniego dostawcy.
Pomimo innych odpowiedzi zalecających przeciwko temu, osobiście działam
composer install
na serwerze, ponieważ jest to szybsze niż rsync z mojego obszaru przejściowego (maszyna wirtualna na moim laptopie).Używam
--no-dev --no-scripts --optimize-autoloader
. Powinieneś przeczytać dokumentację dla każdego z nich, aby sprawdzić, czy jest to odpowiednie dla twojego środowiska.źródło
Myślę, że lepiej zautomatyzować ten proces:
Dodaj plik composer.lock do repozytorium git, upewnij się, że używasz pliku composer.phar install --no-dev po wydaniu używasz , ale na swoim komputerze deweloperskim możesz bez obaw użyć dowolnego polecenia composer, to nie przejdzie do produkcji, produkcja oprze swoje zależności w pliku blokady.
Na serwerze pobierasz tę konkretną wersję lub etykietę i uruchamiasz wszystkie testy przed zastąpieniem aplikacji, jeśli testy zakończą się pomyślnie, kontynuujesz wdrażanie.
Jeśli test zależy od zależności dev, ponieważ kompozytor nie ma zależności zakresu testowego, niezbyt eleganckim rozwiązaniem może być uruchomienie testu z zależnościami dev ( instalacja composer.phar ), usunięcie biblioteki dostawcy, uruchomienie instalacji composer.phar - -no-dev ponownie, użyje buforowanych zależności, więc jest szybsze. Ale to hack, jeśli znasz pojęcie zakresów w innych narzędziach do kompilacji
Zautomatyzuj to i zapomnij o reszcie, idź napić się piwa :-)
PS .: Jak w komentarzu @Sven poniżej, nie jest dobrym pomysłem nie sprawdzanie pliku composer.lock, ponieważ spowoduje to, że instalacja narzędzia Composer będzie działać jako aktualizacja kompozytora.
Możesz zrobić tę automatyzację za pomocą http://deployer.org/ jest to proste narzędzie.
źródło
composer.lock
będziecomposer install
działać jakcomposer update
. Dlatego wdrażane wersje nie są tymi, które opracowałeś. Może to spowodować problemy (a tym bardziej w świetle jedynego niedawno rozwiązanego problemu z zabezpieczeniami polegającego na „zastąpieniu” w programie Composer). NIGDY nie powinieneś uruchamiać sięcomposer update
bez nadzoru bez sprawdzenia, czy nic nie zepsuło.