Composer:古い依存関係を更新せずに別の依存関係をインストールするにはどうすればよいですか?


196

いくつかの依存関係があるプロジェクトがあり、別のプロジェクトをインストールしたいのですが、他のプロジェクトはそのままにしたいと思います。したがって、を編集しました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"
}

1
mcryptの警告は、複数のphpのインストールによるものである可能性があります
。mcrypt拡張子を持つ

回答:


293

新しいパッケージをインストールするには、次の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 -mmcryptがリストされていない場合は、欠落しています。

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


3
「アップデート用にリストされているパッケージ[...]がインストールされていません。無視します。」というメッセージを受け取りました。
ゲリー

11
これは私にはうまくいきません。アップデート用にリストされている「パッケージ "x / y"がインストールされていません。。無視」し、それがすべての更新については行くそれはまさに私が何をしたいの反対で私が欲しい、それは他のすべてを更新し、新しいパッケージをインストールしないように。。
tremby

3
機能しません。「要件をインストール可能なパッケージのセットに解決できませんでした。」(そして、私が尋ねるのとはまったく関係のない、いくつかの古いパッケージについてのテキスト)1つのパッケージを更新するように頼むとき。
OZ_ 2014年

@trembyはここで問題なく動作します。多分あなた"new/package" : "*",はcomposer.json "require"セクションに追加するのを忘れましたか?
Potherca、2014

@OZ_ 依存関係を1つだけインストールする場合でも、他の依存関係と競合しないことを確認するために、最初に解決する必要があります。
Potherca、2014

30

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

composer require vendor/package

ComposerCLIドキュメントから取得

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

php composer.phar require

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

要件をインタラクティブに選択したくない場合は、コマンドに渡すことができます。

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

composer updatecomposer.jsonにある新しいパッケージをインストールすることは事実ですが、composer.jsonにあるファジーロジック(またはコロンの後の文字)に従ってcomposer.lockファイルとインストール済みパッケージも更新しますこれはを使用することで回避できますが、壊れている可能性のあるプロジェクトから離れて議論を忘れているため、この習慣を身に付けることはお勧めしません…>*composer update vendor/package

物事を正気に保ちcomposer require vendor/package、新しい依存関係を追加してください!😉


しかし、使用しcomposer requireてcomposer.lockファイルを更新しますか?
Phil

2

私のユースケースはより単純で、タイトルだけに適合しますが、詳細には適合しません。

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

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


1

私の場合、私は次のリポジトリを持っています:

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

その間、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.

私はSeldaekからソリューションを実行しようとしましたcomposer update vendorD/libraryDが、作曲家はより多くのものを更新するように要求しました.lock

私が使用した解決策は:

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

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

(ポインタにはThnx Seldaek;))


それはやり過ぎです。ロックファイルを削除してcomposer installを実行するだけです。うまくいく
astroanu 2015年

6
これは、依存関係を喜んで再構築でき、何か問題が発生した場合に修正して修正できる非プロ環境でも同じです。しかし、サーバーに障害が発生すると、1時間あたり$ 10.000が失われることになりますが、サーバーcomposer.lockが正常に削除および再構築されてはならないことは間違いありません。.lockロック用です!! ; D-それ以外の場合、ロックファイルは役に立たず、コミットしないか、まったく存在しなくなります。品質志向の会社で経営していて、たとえば1.000の依存関係を持つロックを再構築してコミットすると、それらすべてが変化し、QAの人々があなたを殺すためにやってきます。
Xavi Montero

2
ちょっと@astroanuは、以前に依存関係をインストールし、その依存関係の一部が最新バージョンの開発マスターを取得していた場合、単にcomposer.lockを削除してインストールを実行するだけで重大な問題が発生する可能性があることを明確にするためです。依存関係の導入による影響を検証する機会がなかった場合、予期しない結果が発生し、ユーザーに悪い体験をもたらす可能性があります。
dkcwd 2016年

もちろん、ロックファイルを削除し、インストール/更新を実行するか、ロックファイルを削除せずに更新を実行すると、アプリケーションの安定性に影響します。Composerの更新は、開発環境でのみ実行する必要があります。プロダクションビルドはロックファイルに保存されているものに対してテストされるため、プロダクションでは常にcomposerインストールを使用します。
astroanu 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.