Composerの開発/本番スイッチを使用するときに正しくデプロイする方法は?


180

Composerには、開発中にのみいくつかの依存関係をロードするオプションがあるため、ツールは本番環境(ライブサーバー上)にインストールされません。これは、(理論的には)テスト、fake-data-tools、デバッガなど、開発でのみ意味のあるスクリプトに非常に便利です。

進む方法はrequire-dev、devで必要なツールを使用してブロックを追加することです。

"require-dev": {
    "codeception/codeception": "1.6.0.3"
}

そして(理論的には)これらの依存関係を介してロードします

composer install --dev

問題と質問:

作曲はの振る舞いを変更したinstallupdate劇的に2013年に、require-dev-dependenciesは現在デフォルトでインストールされている(!)、とcomposer.jsonを作成すること自由に感じrequire-devブロックと実行composer installに再現します。

デプロイする最も受け入れられている方法として、コンポーザーをプッシュすることです。ロック(現在のcomposer設定を保持)composer installしてから本番サーバーでを実行すると、開発コンポーネントもインストールされます。

-dev依存関係インストールせずにこれをデプロイする正しい方法は何ですか?

注:ここでは、奇妙なComposerデプロイメントを明確にするために、標準的なQ / Aを作成しようとしています。この質問は自由に編集してください。


@All:懸賞金がどこにあるDOは知らない:(私は別のアプローチを開始します。
SLIQ

1
あなたが積極的にそれを与えないで、答えが受け入れられないか、十分な賛成票を得た場合、誰も賞金を受け取れません。
2014

2
私は個人的にはこのアプローチがまったく好きではありません。composer.lock、Gitのレポに絶対に追加すべきではありません。正しいアプローチは、ステージングでcomposerの更新を使用してから、ファイルを本番環境に同期することです(もちろん、すべてが機能する場合)。ステージングは​​、実稼働環境の正確なコピーでなければなりません。composer.lockの一部である必要があり.gitignoreます。
名詞

6
composer.lockは間違いなくCSVに含める必要があります!!! 他にどのようにして全員が同じバージョンを使用することを確認しますか?そのため、CSVからcomposer.lockを除外しないでください!!!
Tobias Gaertner 2017

3
@TobiasGaertner VCS(バージョン管理ソフトウェア)のことだと思いますが、それ以外の場合は、プロジェクトの公式の推奨事項に従っています。
Xiong Chiamiov

回答:


327

なぜ

今日、Composerが--devデフォルトで(インストールおよび更新時に)フラグを使用する正当な理由があります。Composerは主に、これが望ましい動作であるシナリオで実行されます。

基本的なComposerワークフローは次のとおりです。

  • 新しいプロジェクトが開始されます:composer.phar install --devjsonおよびロックファイルがVCSにコミットされます。
  • 他の開発者がプロ​​ジェクトの作業を開始します:VCSおよびのチェックアウトcomposer.phar install --dev
  • 開発者は依存関係composer.phar require <package>を追加し--devますrequire-dev。セクションにパッケージが必要な場合は追加し、コミットします。
  • 他の人は一緒に行きます:(チェックアウトと)composer.phar install --dev
  • 開発者は、依存関係の新しいバージョンcomposer.phar update --dev <package>(およびコミット)を必要としています。
  • 他の人は一緒に行きます:(チェックアウトと)composer.phar install --dev
  • プロジェクトがデプロイされました: composer.phar install --no-dev

ご覧のとおり、特にプロジェクトに取り組んでいる開発者の数が--dev増えると、フラグは(はるかに)--no-devフラグよりも多く使用されます。

本番デプロイ

「dev」依存関係をインストールせずにこれを展開する正しい方法は何ですか?

まあ、composer.jsonand composer.lockファイルはVCSにコミットする必要があります。composer.lock使用すべきパッケージのバージョンに関する重要な情報が含まれているため、省略しないでください。

本番デプロイを実行するときに、--no-devフラグをComposerに渡すことができます。

composer.phar install --no-dev

このcomposer.lockファイルには、dev-packagesに関する情報が含まれている場合があります。これは問題ではありません。--no-devフラグは、必ずこれらのDEV-のパッケージがインストールされていないようになります。

「プロダクションデプロイ」とは、プロダクションでの使用を目的としたデプロイを意味します。私はcomposer.phar install、運用サーバーで行うべきか、レビューが可能なステージングサーバーで行うべきかについては議論していません。それはこの回答の範囲ではありません。composer.phar install「dev」の依存関係をインストールしない方法を指摘しているだけです。

オフトピック

--optimize-autoloaderフラグはまた、生産上望ましいかもしれない(それはあなたのアプリケーションに自動読み込みスピードアップするクラスマップを生成します):

composer.phar install --no-dev --optimize-autoloader

または、自動デプロイメントが行われたとき:

composer.phar install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --no-suggest --optimize-autoloader

あなたのコードベースがそれをサポートしている場合は、スワップ・アウト可能性--optimize-autoloaderのために--classmap-authoritative。詳細はこちら


5
私は1つの例外を除いて、言われていることのほとんどに同意します。「composer install --no-dev」はステージング環境でのみ実行する必要があり、その環境は不変であると見なされます。プレビュー/ステージングを行わずに、運用サーバーに依存関係を直接ダウンロードしたくありません。これは、もう少し注意が必要です。
2015年

3
@スケーラブル:私はあなたに同意します(そしてSvenは彼の答えでこれをうまくカバーしています)が、それは私の答えの範囲ではなく、私が「プロダクションデプロイ」で意図したものではありません。それを明確にするために段落を追加しました。
Jasper N. Brouwer 2015年

5
実際には、デフォルトの方が危険性の少ないオプションであると思います。--devをデフォルトにして、本番環境で誤ってcomposerをインストールすると、致命的となる可能性があります。
Hector Ordonez 2015

3
の良い点--optimize-autoloader。また--classmap-authoritative、こちらのドキュメントgetcomposer.org/doc/03-cli.mdから、「クラスマップからのみクラスをオートロードしてください。暗黙的に--optimize-autoloaderが有効になっている」ので、クラスがわかっている場合に使用できます。そこにあります。クラスを動的に生成しない限り、これはおそらくprod環境で発生するはずです。
Xavi Montero

6
すばらしい答えです。optimize-autoloader直接追加することをお勧めしますcomposer.json{"config": { "optimize-autoloader": true } }
Yvan

79

実際、本番サーバーに依存関係をインストールすることを強くお勧めします。

私の推奨は、デプロイメントマシンでコードをチェックアウトし、必要に応じて依存関係をインストールし(これには、コードが本番環境に移行する場合、開発依存関係をインストールしないことも含まれます)、すべてのファイルをターゲットマシンに移動します。

どうして?

  • 共有ホスティングでは、コマンドラインにアクセスできない場合があります
  • あなたがそうしたとしても、PHPはコマンド、メモリ、ネットワークアクセスの点で制限されているかもしれません
  • リポジトリCLIツール(Git、Svn)はインストールされない可能性が高く、ロックファイルが特定のコミットをチェックアウトする依存関係をZIPとしてダウンロードする代わりに記録した場合に失敗します(--prefer-sourceを使用したか、Composerが持っていました)そのバージョンを取得する他の方法はありません)
  • プロダクションマシンが小さなテストサーバーのような場合(Amazon EC2マイクロインスタンスを考えてください)、実行するのに十分なメモリがインストールされていない可能性があります composer install
  • composerは物事を壊さないようにしていますが、Composersのインストールフェーズ中にランダムな依存関係をロードできなかったため、部分的に壊れたプロダクションWebサイトで終了することについてどう思いますか

簡単に言うと、制御できる環境でComposerを使用します。Composerを操作するために必要なものがすべて揃っているので、開発マシンは適格です。

-dev依存関係をインストールせずにこれをデプロイする正しい方法は何ですか?

使用するコマンドは

composer install --no-dev

これは、本番サーバー自体、デプロイメントマシン、または実際のソフトウェアで開発要件が誤って使用されていないかどうかを確認するための最後のチェックを行うはずの開発マシンなど、あらゆる環境で機能します。

このコマンドは、composer.lockファイルで宣言されているdev要件をインストールまたはアクティブにアンインストールしません。

開発ソフトウェアコンポーネントを本番サーバーにデプロイしてもかまわない場合は、実行composer installしても同じ処理が行われますが、移動するバイト数が増えるだけでなく、大きなオートローダー宣言も作成されます。


14
興味深いワークフローですが、大きな欠点があります:リポジトリにはベンダーフォルダー/コンテンツ自体(Composerページの公式ステートメント)を含めないでください。そのため、リポジトリはgitベースのデプロイメント(これは一般的な標準のafaikです)で直接プロダクションにプッシュされません。私が間違っていれば訂正してください)。したがって、基本的に上記のソリューションは「古い」FTPデプロイメントでのみ機能します!?これについてさらに議論してみましょう...
Sliq '20

17
私が提案するワークフローには、GITを介して本番サーバーにコードをプッシュすることは含まれていません。実際、これを行うと、運用サーバーにComposerの依存関係を強制的にインストールする必要があり、多くの問題が発生する可能性があるため、お勧めしません。デプロイメントを円滑に実行したい場合は、現在のバージョンを破棄して置き換える前に、アプリケーションの実行に必要なすべてのコードをアセンブルする必要があります。FTPが嫌いですか?SSHを介してRSyncを実行し、シンボリックリンクをフリップしてバージョンを切り替えます。ただし、必要に応じて、本番環境でプッシュ、チェックアウト、composerをインストールすることもできます。
Sven

2
@Panique:私はあなたのコメントのその部分を見たばかりで、私は答える必要があります:「gitベースのデプロイメントで本番環境にプッシュされました(これは一般的な標準のafaikです。間違っている場合は修正してください)」-いいえ、これ一般的な標準ではありません。それを行うための1つの方法にすぎません。
2014

1
私が所属しているチームは、これをワークフローに組み込んで大成功を収めています。ビルドマシン(もちろんJenkins)があります。1)SCからチェックアウト2)composerインストール/更新を実行3)ユニットテストを実行4)開発依存関係を削除5)pharファイルを生成(app-1.34.pharなど)通知され、そのファイルをいつ取得するか、どこに転送するか、次に何をするかを決定する別のメカニズムがあります。一部のチームは、サーバー上に配置されたpharをアンパックすることを選択し、一部のチームはそのままそれを実行します。デプロイの安定性と再現性に大きな自信を与えています。
Josh Johnson、

3
私はこの答えに100%同意します。Composerはデプロイメントサーバーにもgitにもインストールしないでください。継続的な展開/統合サーバーは、ソースと依存関係のフェッチを管理することに正確に対応しています:git pull> composer install> deploy
Eric MORAND

4

今、require-devあなたが行うことができますローカルの開発のために、デフォルトで有効になっているcomposer installcomposer updateせずに--devオプション。

本番環境にデプロイする場合は、composer.lockからのパッケージがないことを確認する必要がありますrequire-dev

あなたはこれを行うことができます

composer update --no-dev

を使用してローカルでテストし--no-devたら、すべてを本番環境にデプロイし、に基づいてインストールできますcomposer.lock--no-devここでもう一度オプションが必要です。そうしないと、composerは「ロックファイルにはrequire-dev情報が含まれていません」と表示されます。

composer install --no-dev

注:開発と本番に違いが生じる可能性があるものには注意してください。開発ツールを含めることは大きなオーバーヘッドではないため、私は通常、可能な限りrequire-devを回避しようとします。


1
これは実際には詳細が正しくありません。composer.lock開発の依存関係を確認する必要はありません。を実行するcomposer install --no-devだけで、通常の依存関係のみがインストールされます。実際、Composerはこの手順でdev依存関係も削除します。
Sven

私のローカルcomposer.lockにdev依存関係があった場合(そして非devパッケージのバージョンに影響を与える可能性がある場合)、それを更新して、本番環境での状態を反映させたいと思います。またcomposer install --no-devcomposer installエラーが発生するため、本番環境で実行する必要があります。技術的には私はあなたが正しいと思います。これは必須ではありませんが、私が好む追加の安全レベルです。
dave1010 2014

OK、デモシナリオ:アプリにはdev/toolおよびが必要prod/lib:~1.0です。最新のprod / libは1.3ですが、dev / toolにもが必要prod/lib:1.1.*です。結果:バージョン1.1.9(最新の1.1.xブランチ)をインストールし、開発中に使用します。更新するだけでは安全ではない--no-devので、最新のprod / lib 1.3を含め、すべてがテストなしで機能すると仮定します。そして、おそらく開発/ツールが不足しているため、テストは不可能です。開発ではdev / toolは必要ないため、ロールアウトすべきではないが、ソフトウェアはprod / lib 1.1.9を使用する必要があると思います。
スヴェン

使用している場合--no-devは、回答で述べたように、ローカルでテストする必要があります。--no-devただし、まったく使用しないことをお勧めします。
dave1010 2014

したがって、基本的にはこれをお勧めしますcomposer update。次に、開発をcomposer update --no-dev行ってから、リリーステストを行ってから、本番環境にプッシュして実行しますcomposer install --no-dev。2つの問題:1.開発に依存せずにリリースをテストできない、および2. Gitなどを本番環境にインストールできない。
2014

3

運用サーバーではに名前を変更vendorvendor-<datetime>、展開中に2つのベンダーディレクトリが存在します。

HTTP cookieが原因でシステムが新しいベンダーを選択する autoload.phpテスト後、それらの間で完全なアトミック/インスタントスイッチを実行して、将来のすべての要求に対して古いベンダーディレクトリを無効にし、数日後に以前のディレクトリを削除します。

これにより、私がapache / phpで使用しているファイルシステムキャッシュによって引き起こされる問題が回避され、アクティブなPHPコードが以前のベンダーディレクトリを引き続き使用できるようになります。


他の回答はそれをお勧めしませんが、私は個人的に composer installれていませんが、ステージング領域(ラップトップ上のVM)からのrsyncよりも高速なので、にサーバーでします。

使用します--no-dev --no-scripts --optimize-autoloader。それぞれのドキュメントを読んで、これが環境に適しているかどうかを確認してください。


2

プロセスを自動化した方が良いと思います:

gitリポジトリにcomposer.lockファイルを追加し、リリース時にcomposer.phar install --no-devを使用していることを確認してください。ただし、devマシンでは、心配せずにcomposerコマンドを使用できます。これは本番環境に移行しません。本番環境では、依存関係はロックファイルに基づいています。

サーバーでこの特定のバージョンまたはラベルをチェックアウトし、アプリを置き換える前にすべてのテストを実行します。テストに合格した場合は、展開を続行します。

テストがdevの依存関係に依存している場合、composerにはテストスコープの依存関係がないため、devの依存関係(composer.phar install)でテストを実行し、ベンダーライブラリを削除してcomposer.phar installを実行する- -no-dev再び、これはキャッシュされた依存関係を使用するため、より高速です。しかし、他のビルドツールのスコープの概念を知っていれば、それはハックです。

これを自動化して残りを忘れて、ビールを飲みに行きましょう:-)

PS .: @Svenのコメントのように、composer.lockファイルをチェックアウトしないことはお勧めしません。これにより、composerのインストールがcomposerの更新として機能するようになります。

この自動化はhttp://deployer.org/を使用して行うことができます。これはシンプルなツールです。


2
コミットおよびチェックアウトしないcomposer.lockと、のようにcomposer install動作しcomposer updateます。したがって、デプロイするバージョンは、開発したバージョンではありません。これにより問題が発生する可能性があります(Composerで "replace"を使用して最近解決された唯一のセキュリティ問題を考慮すると、さらに問題が発生します)。composer update何も壊さないことを確認せずに無人で実行しないでください。
2014

1
@Svenこれは、デプロイ前にユニットテストを自動的に実行するための同じコメントの提案です。しかし、そうです、とにかくcomposer.lockファイルを保持する方が良いです。
Giovanni Silva 14

ここで説明しなければならない唯一のこと:PHPUnitのようなdevの依存関係なしでサーバー上でテストを実行するにはどうすればよいですか?
2014

依存関係、テスト、およびデプロイメントが、Java GradleやSBT、Maven(mavenはそれほど良くない)などの1つのツールにまとめられていれば、非常に便利です。composer phpunitとデプロイメントを連携させる1つのPHPツール。あるいは、GradleまたはScala SBTプラグインでこれを作成することもできます。これらは不可知なビルドツールであるため、プラグインは、javascriptの最小化やsassのコンパイル、cssの最小化などのアセットでも機能します。誰か知ってる?
Giovanni Silva 14

1
もちろん、これは実際の環境をテストするためにサーバーで行われますが、サイトの仮想ホストでは直接行われません。別の一時フォルダーでこれに移動し、成功したら結果を仮想ホストに移動できます
Giovanni Silva
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.