composer.jsonのrequireセクションとrequire-devセクションの違いは何ですか?


99

私はcomposerを使い始めています。私はそれについてほとんど知識がなく、Webアプリケーション開発の経験がほとんどありません。

私はNettuts +チュートリアルたどるだけなので、作曲家に関する基本的な質問があります。

{
  "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"部分的に表示されるものは何でも、ダウンロードとインストールはcomposer install --dev
  2. composerのドキュメントの一部を読みましたが、"require-dev"なぜ私たちが参加した理由が理解できませんか?常に最新の安定したバージョンを取得するのではなく、パッケージの特定のバージョンを取得したいためですか?

回答:


115

異なる環境

通常、ソフトウェアはさまざまな環境で実行されます。

  • development
  • testing
  • staging
  • production

異なる環境での異なる依存関係

requireセクションで宣言されてcomposer.jsonいる依存関係は、通常、アプリケーションまたはパッケージを実行するために必要な依存関係です。

  • staging
  • production

require-devセクションで宣言されている依存関係は、通常、

  • developing
  • testing

環境。

たとえば、実際にアプリケーションを実行するために使用されるパッケージに加えて、次のようなソフトウェアの開発にパッケージが必要になる場合があります。

  • friendsofphp/php-cs-fixer (コーディングスタイルの問題を検出して修正するため)
  • squizlabs/php_codesniffer (コーディングスタイルの問題を検出して修正するため)
  • phpunit/phpunit (テストを使用して開発を推進するため)

配備

現在、developmentおよびtesting環境では、通常、

$ composer install

productiondevelopment依存関係の両方をインストールします。

ただし、stagingおよびproduction環境では、アプリケーションの実行に必要な依存関係のみをインストールする必要があり、展開プロセスの一部として、通常は次のコマンドを実行します。

$ composer install --no-dev

production依存関係のみをインストールします。

意味論

つまり、セクション

  • require
  • require-dev

composer実行時にインストールするパッケージを指示する

$ composer install

または

$ composer install --no-dev

以上です。

アプリケーションまたはパッケージが依存するパッケージの開発依存関係はインストールされません

参考のために、以下を参照してください。


vendorFTP経由でフォルダ全体をアップロードして「デプロイ」してもまったく問題ないことは正しく理解できますか?
ピラット

2
@pilatできますが、必ずでインストールしてください—no-dev。また、FTPはおそらくかなり遅くなります。
localheinz 2018年

アプリケーションを構築するために必要な依存関係はどうですか?したがって、ビルドとデプロイのパイプラインで、ビルド用にインストールしてから、デプロイする前に再度削除したいと思います。たとえば、縮小化、またはLESS / SASSをCSSに変換します。どうしますか
Richard Kiefer

1
@RichardKiefer phar.ioを使用する人もいればPHARをチェックインする人もいれば、Dockerイメージを使用する人もいます。また、別の人が別の画像を使用する人もいcomposer.jsonます。例:github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools
localheinz

それで、composer.jsonをコミットしてリポジトリにロックするだけですか?すべてをコミットして、デプロイのためにgitを使用してマスターブランチを本番環境からプルするだけでは意味がありませんか?
mbomb007

61
  1. 作曲家のマニュアルによると:

    require-dev(ルートのみ)

    このパッケージの開発やテストの実行などに必要なパッケージをリストします。ルートパッケージの開発要件はデフォルトでインストールされます。両方、installまたはdevの依存関係がインストールされないようにupdateする--no-devオプションをサポートします。

    したがって、実行composer installすると開発の依存関係もダウンロードされます。

  2. その理由は実際には非常に単純です。特定のライブラリに貢献するとき、テストスイートまたは他の開発ツール(例えばsymfony)を実行したいかもしれません。ただし、このライブラリをプロジェクトにインストールする場合、それらの開発依存関係は必要ない場合があります。すべてのプロジェクトにテストランナーが必要なわけではありません。


19

作曲家のサイトから(十分に明確です)

必要とする#

このパッケージに必要なパッケージをリストします。これらの要件を満たすことができない場合、パッケージはインストールされません。

require-dev(ルートのみ)#

このパッケージの開発やテストの実行などに必要なパッケージをリストします。ルートパッケージの開発要件はデフォルトでインストールされます。インストールと更新の両方で、devの依存関係がインストールされないようにする--no-devオプションをサポートしています。

Composerでrequire-devを使用すると、プロジェクトの開発/テストに必要な依存関係を宣言できますが、本番環境では必要ありません。プロジェクトを(gitを使用して)本番サーバーにアップロードすると、require-dev一部は無視されます。

また、著者が投稿したこの回答とこの投稿も確認してください。


3
「way / generators」:「dev-master」が「require」セクションにある理由を教えてください。本番環境ではもう必要ありません。
職人による

1
これは完全な推測ですが、私が考えることができる唯一のことは、ウェイ/ジェネレーターがサービスプロバイダーとして追加されるため、本番環境内で欠落している場合、Laravelは機能しないということです。
Daniel Hollands

2
ルートパッケージのdev要件がデフォルトでインストールされる部分には、本番サーバー上でもrequire-devからの依存関係がインストールされることが明記されています。
Gemmu '19

3
アイデアは、本番環境で--no-devフラグを使用することです。
John Pancoast、2015

2

requireセクション このセクションには、本番環境にインストール/必須化するのに適したパッケージ/依存関係が含まれています。

require-devセクション:このセクションには、開発者がコードをテストする(またはローカルマシンで実験するために、これらのパッケージを本番環境にインストールしたくない)ために使用できるパッケージ/依存関係が含まれています。


1

一般的なルールはrequire-devからのパッケージが欲しいということですローカル環境などの開発(dev)環境でのみセクション。

require-devセクションのパッケージはアプリのデバッグ、テストの実行などに役立つパッケージです。

で、ステージングおよび本番環境あなたはおそらくからのパッケージのみたく必要セクションを。

しかし、とにかく、任意の環境でcomposer install --no-devおよびcomposer update --no-devを実行できます。コマンドは、require-devからでなく、必須セクションからのパッケージのみをインストールしますが、おそらくこれをステージングおよび本番環境でのみ実行したいでしょう。ローカルにない環境。

理論的には、すべてのパッケージをrequireセクションに置くことができますが、何も起こりませんが、次の理由により、本番環境でパッケージを開発する必要はありません。

  1. 速度
  2. デバッグ情報を公開する可能性

require-devの良い候補は次のとおりです。

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

あなたは上記のパッケージが何をしているかを見ることができ、なぜあなたが本番環境でそれらを必要としないのかを見るでしょう。

詳細はこちら:https : //getcomposer.org/doc/04-schema.md

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.