web-dev-qa-db-ja.com

作曲家:どうやって古い依存関係を更新せずに他の依存関係をインストールすることができますか?

私はいくつかの依存関係を持ったプロジェクトを持っていて、それをもう一つインストールしたいのですが、他のものをそれらがそうであるように保ちたいのです。だから私はcomposer.jsonを編集しました、しかし私がcomposer installを実行するならば、私は以下の出力を得ます:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

まず第一に、私はmcryptがインストールされているので、なぜそれがそこに文句を言うのかわかりません。

それでは、どうやってこの新しい依存関係をインストールすることができますか?

私のcomposer.json :

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/Twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}
172
duality_

新しいパッケージをインストールするには、2つの方法があります。

  1. require コマンドを使用して、単に実行します。

    composer require new/package
    

    Composerは使用するのに最適なバージョン制約を推測し、パッケージをインストールし、それをcomposer.lockに追加します。

    次のコマンドを実行して明示的なバージョン制約を指定することもできます。

    composer require new/package ~2.5
    

- または -

  1. update コマンドを使用して、新しいパッケージをcomposer.jsonに手動で追加してから、次のコマンドを実行します。

    composer update new/package
    

Composerが "あなたの要求はインストール可能なパッケージのセットに解決できなかった"と言って文句を言うなら、あなたはフラグ--with-dependenciesを渡すことによってこれを解決することができます。これはあなたがインストール/アップデートしようとしているパッケージのすべての依存関係をホワイトリストにします(あなたの他の依存関係のどれも)。

質問者のLaravelおよびmcryptに関する問題については、CLI php.iniで正しく有効になっていることを確認してください。 php -mがmcryptをリストしていない場合、それはありません。

重要:new/packageを使うときはcomposer updateを必ず指定してください。この引数を省略すると、すべての依存関係とcomposer.lockが更新されます。

265
Seldaek

実際には、正しい解決策は次のとおりです。

composer require vendor/package

Composer用のCLIドキュメント から抜粋したものです。

requireコマンドは、現在のディレクトリからcomposer.jsonファイルに新しいパッケージを追加します。

php composer.phar require

要件を追加/変更した後、変更された要件がインストールまたは更新されます。

対話的に要件を選択したくない場合は、単にそれらをコマンドに渡すことができます。

php composer.phar require vendor/package:2.* vendor/package2:dev-master

composer updateがcomposer.jsonにある新しいパッケージをインストールするのは事実ですが、それはcomposer.lockファイルとインストールされているすべてのパッケージも更新しますcomposer.jsonにあるファジー論理(コロンの後の>または*文字)によると!これはcomposer update vendor/packageを使用することで回避できますが、私はあなたは潜在的に壊れたプロジェクトから離れて忘れられた議論の1つなので、それを習慣にすることをお勧めしません…

新しい依存関係を追加するために、物事を健全に保ち、composer require vendor/packageを使用してください。 ????

29
Matthematics

私のユースケースはもっと単純で、あなたの役職には合うがあなたのそれ以上の詳細には当てはまらない。

つまり、他のすべてのパッケージを更新せずに、まだ私のcomposer.jsonに入っていない新しいパッケージをインストールしたいのです。

ここでの解決策はcomposer require x/yです

2
tremby

私の場合は、以下のリポジトリを用意しています。

  • .json内の要件A、B、C、D
  • .lockのA、B、Cのみ

その間、A、B、Cはロックが生成された時点に関して新しいバージョンを持っていました。

何らかの理由で、私は "ベンダ"を削除してcomposer installを実行しようとしたがメッセージが表示されず失敗した。

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

私はcomposer update vendorD/libraryDを発行してSeldaekからソリューションを実行しようとしましたが、作曲家はより多くのものを更新することを主張したので、.lockも私のgitツールに見られる変更を余儀なくされました。

私が使用した解決策は次のとおりです。

  1. vendorsディレクトリをすべて削除します。
  2. VendorD/LibraryDから要件.jsonを一時的に削除します。
  3. composer installを実行してください。
  4. その後、ファイル.jsonを削除し、リポジトリから再度チェックアウトします(ファイルを再追加するのと同じですが、空白の変更を避けるため)。
  5. それからSeldaekのソリューションcomposer update vendorD/libraryDを実行してください。

ライブラリをインストールしましたが、さらに、git diffは、.lockに他のものを編集せずに新しいものだけが追加されたことを示しました。

(ポインタのThnx Seldaek;))

0
Xavi Montero