Composerには、開発中にのみいくつかの依存関係をロードするオプションがあるため、ツールは運用環境(ライブサーバー)にインストールされません。これは、(理論的には)テスト、fake-data-tools、デバッガーなどの開発でのみ意味のあるスクリプトに非常に便利です。
方法は、devで必要なツールを使用してrequire-dev
ブロックを追加することです。
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
そして、(理論的に)これらの依存関係を次の方法でロードします
composer install --dev
Composerは2013年にinstall
とupdate
の動作を劇的に変更し、require-dev
-依存関係がデフォルトでインストールされるようになりました(!)。require-dev
ブロックし、composer install
を実行して再現します。
最も受け入れられているデプロイ方法は、composer。lock(現在のcomposerセットアップを保持)をプッシュしてから、プロダクションでcomposer install
を実行することです。サーバーの場合、これも開発用のものをインストールします。
これを展開する正しい方法は何ですか-dev依存関係をインストールせずに?
注:ここでは、奇妙なComposer展開を明確にするために、標準的なQ/Aを作成しようとしています。この質問は自由に編集してください。
なぜ
最近ではComposerがデフォルトで--dev
フラグを使用する(インストール時および更新)理由は、私見にはあります。作曲家はこれが望ましい振舞いであるシナリオの大部分で動かされます:
基本的なComposerのワークフローは次のとおりです。
composer.phar install --dev
、json、およびロックファイルがVCSにコミットされます。composer.phar install --dev
のチェックアウト。composer.phar require <package>
セクションにパッケージを追加したい場合は、開発者が依存関係を追加します:--dev
、require-dev
を追加します(そしてコミットします)。composer.phar install --dev
。composer.phar update --dev <package>
(およびcommit)。composer.phar install --dev
。composer.phar install --no-dev
ご覧のとおり、--dev
フラグは--no-dev
フラグより(はるかに)多く使用されています。特に、プロジェクトに取り組んでいる開発者の数が増えている場合は特にそうです。
本番デプロイ
"dev"依存関係をインストールせずにこれをデプロイする正しい方法は何ですか?
composer.json
およびcomposer.lock
ファイルはVCSにコミットする必要があります。使用すべきパッケージバージョンに関する重要な情報が含まれているため、composer.lock
を省略しないでください。
プロダクションデプロイを実行するときは、--no-dev
フラグをComposerに渡すことができます。
composer.phar install --no-dev
composer.lock
ファイルには、dev-packagesに関する情報が含まれている場合があります。これは関係ありません。 --no-dev
フラグはそれらのdev-packagesがインストールされていないことを確認します。
「プロダクションデプロイ」と言うとき、プロダクションで使用されることを目的としたデプロイを意味します。私はcomposer.phar install
をプロダクションサーバー上で行うべきか、それとも物事をレビューできるステージングサーバー上で行うべきかについて議論していません。それはこの答えの範囲ではありません。私は単に "dev"依存関係をインストールせずにcomposer.phar install
を実行する方法を指摘しているだけです。
オフトピック
--optimize-autoloader
フラグはプロダクション上でも望ましいかもしれません(それはあなたのアプリケーションでオートロードをスピードアップするクラスマップを生成します):
composer.phar install --no-dev --optimize-autoloader
自動展開が完了したとき
composer.phar install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader
私のお勧めは、デプロイメントマシンでコードをチェックアウトし、必要に応じて依存関係をインストールし(コードが本番環境に移行する場合はdev依存関係をインストールしないことを含みます)、そしてすべてのファイルをターゲットマシンに移動することです。
どうして?
composer install
を実行するのに十分なメモリさえインストールされていないでしょう。簡単に言うと、あなたがコントロールできる環境でComposerを使用してください。 Composerを操作するために必要なものはすべて揃っているので、開発用マシンは対象になりません。
-dev依存関係をインストールせずにこれをデプロイする正しい方法は何ですか?
使用するコマンドは
composer install --no-dev
これは、本番サーバー自体、デプロイメント・マシン、開発用マシン、開発用マシンなど、実際のソフトウェアに対して開発要件が誤って使用されているかどうかを判断するためのものであれば、どの環境でも機能します。
このコマンドでは、composer.lockファイルに宣言されているdev要件はインストールされず、あるいは積極的にアンインストールされません。
本番サーバーに開発ソフトウェアコンポーネントをデプロイすることを気にしないのであれば、composer install
を実行しても同じことが言えますが、移動するバイト数を増やすだけでなく、より大きなオートローダ宣言も作成できます。
これでrequire-dev
はデフォルトで有効になりました、ローカル開発のためにあなたはcomposer install
オプションなしでcomposer update
と--dev
をすることができます。
実稼働環境にデプロイしたい場合は、composer.lock
にrequire-dev
から来たパッケージが含まれていないことを確認する必要があります。
あなたはこれを行うことができます
composer update --no-dev
--no-dev
を使用してローカルでテストしたら、composer.lock
に基づいてすべてを実稼働環境にデプロイし、インストールすることができます。ここでも--no-dev
オプションが必要です。そうでなければ、作曲家は "ロックファイルにrequire-dev情報が含まれていません"と言うでしょう。
composer install --no-dev
注: devとproductionの間に違いが生じる可能性があるものには注意してください。 devツールを含めることは大きなオーバーヘッドではないので、私は一般に可能な限りrequire-devを避けようとします。
プロセスを自動化した方が良いと思います。
Gitリポジトリにcomposer.lockファイルを追加します。リリース時にはcomposer.phar install --no-devを使用してください。あなたが気にせずに任意のcomposerコマンドを使用することができるマシン、これは生産に行きません、生産はロックファイルでその依存関係をベースにします。
サーバーでこの特定のバージョンまたはラベルをチェックアウトし、テストに合格した場合はアプリを置き換える前にすべてのテストを実行し、展開を続行します。
テストがdevの依存関係に依存している場合、composerにテストスコープの依存関係がないため、devの依存関係を使用してテストを実行することはできません(composer.phar install)、ベンダーライブラリを削除し、composer.phar install --no-devを再度実行すると、キャッシュされた依存関係が使用されるため、高速になります。 。しかし、他のビルドツールのスコープの概念を知っていれば、それはハックです。
これを自動化して、残りを忘れて、ビールを飲みに行きなさい:-)
シモンズ:以下の@Svenコメントのように、composer.lockファイルをチェックアウトしないことはお勧めできません。これは、composer installをcomposer updateとして機能させるためです。
この自動化は http://deployer.org/ で行えます。これは簡単なツールです。
本番サーバーではvendor
の名前をvendor-<datetime>
に変更しました。デプロイ時には2つのベンダーディレクトリがあります。
HTTP cookieによって私のシステムは新しいベンダautoload.php
を選択します。そしてテストした後、将来のすべての要求に対して古いアトミックディレクトリを無効にするために完全にアトミック/インスタントの切り替えを行い、数日後に前のディレクトリを削除します。
これは私がApache/phpで使っているファイルシステムキャッシュによって引き起こされるどんな問題も避け、そしてどんなアクティブなPHPコードも以前のベンダディレクトリを使い続けることを可能にします。
他の回答では推奨されていますが、私は個人的にcomposer install
をサーバー上で実行しています。これは私のステージング領域からのrsync(ラップトップ上のVM)より速いからです。
私は--no-dev --no-scripts --optimize-autoloader
を使います。あなたの環境でこれが適切かどうかをチェックするためにそれぞれのドキュメントを読むべきです。