私はいくつかの依存関係を持ったプロジェクトを持っていて、それをもう一つインストールしたいのですが、他のものをそれらがそうであるように保ちたいのです。だから私は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"
}
新しいパッケージをインストールするには、2つの方法があります。
require
コマンドを使用して、単に実行します。
composer require new/package
Composerは使用するのに最適なバージョン制約を推測し、パッケージをインストールし、それをcomposer.lock
に追加します。
次のコマンドを実行して明示的なバージョン制約を指定することもできます。
composer require new/package ~2.5
- または -
update
コマンドを使用して、新しいパッケージをcomposer.json
に手動で追加してから、次のコマンドを実行します。
composer update new/package
Composerが "あなたの要求はインストール可能なパッケージのセットに解決できなかった"と言って文句を言うなら、あなたはフラグ--with-dependencies
を渡すことによってこれを解決することができます。これはあなたがインストール/アップデートしようとしているパッケージのすべての依存関係をホワイトリストにします(あなたの他の依存関係のどれも)。
質問者のLaravelおよびmcryptに関する問題については、CLI php.iniで正しく有効になっていることを確認してください。 php -m
がmcryptをリストしていない場合、それはありません。
重要:new/package
を使うときはcomposer update
を必ず指定してください。この引数を省略すると、すべての依存関係とcomposer.lock
が更新されます。
実際には、正しい解決策は次のとおりです。
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
を使用してください。 ????
私のユースケースはもっと単純で、あなたの役職には合うがあなたのそれ以上の詳細には当てはまらない。
つまり、他のすべてのパッケージを更新せずに、まだ私のcomposer.json
に入っていない新しいパッケージをインストールしたいのです。
ここでの解決策はcomposer require x/y
です
私の場合は、以下のリポジトリを用意しています。
.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ツールに見られる変更を余儀なくされました。
私が使用した解決策は次のとおりです。
vendors
ディレクトリをすべて削除します。VendorD/LibraryD
から要件.json
を一時的に削除します。composer install
を実行してください。.json
を削除し、リポジトリから再度チェックアウトします(ファイルを再追加するのと同じですが、空白の変更を避けるため)。composer update vendorD/libraryD
を実行してください。ライブラリをインストールしましたが、さらに、git
diffは、.lock
に他のものを編集せずに新しいものだけが追加されたことを示しました。
(ポインタのThnx Seldaek;))