我有一个包含一些依赖项的项目,我想安装另一个,但我想保持其他项目的原样。所以我编辑了 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,所以我不知道为什么它在那里抱怨。
那么,我该如何安装这个新的依赖项呢?
我的作曲家.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"
}
要安装一个新的包,只有那个,你有两个选择:
使用 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,那么它就丢失了。
重要提示:在使用 composer update
时不要忘记指定 new/package
!省略该参数将导致所有依赖项以及 composer.lock
被更新。
实际上,正确的解决方案是:
composer require vendor/package
取自 CLI documentation for Composer:
require 命令将新包从当前目录添加到 composer.json 文件。 php composer.phar require 添加/更改需求后,将安装或更新修改后的需求。如果您不想以交互方式选择需求,您可以将它们传递给命令。 php composer.phar 需要 vendor/package:2.* vendor/package2:dev-master
虽然 composer update
确实会安装 composer.json 中的新软件包,但它还会根据任何更新更新 composer.lock 文件和任何已安装的软件包在 composer.json 中找到模糊逻辑(冒号后的 >
或 *
字符)! 这可以通过使用 composer update vendor/package
来避免,但我不建议你养成它的习惯,因为你'从一个可能被破坏的项目中重新获得一个被遗忘的论点……
保持理智并坚持使用 composer require vendor/package
来添加新的依赖项! 😉
composer require
会更新 composer.lock 文件吗?
我们可以在不更新其他依赖项的情况下安装新包,如下所示:
composer require package/name --no-update
这会将您的包添加到composer.json(没有更新composer.lock)
composer update package/name
这现在将安装/更新您的新包,将其添加到 composer.lock 而不更新其他部门
我的用例更简单,只适合您的标题,但不适合您的更多细节。
也就是说,我想安装一个尚未在我的 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.
我尝试从 Seldaek 运行解决方案,发出 composer update vendorD/libraryD
但作曲家坚持要更新更多内容,所以 .lock
看到我的 git 工具发生了太多变化。
我使用的解决方案是:
删除所有供应商目录。暂时从 .json 中删除需求 VendorD/LibraryD。运行作曲家安装。然后删除文件 .json 并从 repo 中再次签出(相当于重新添加文件,但避免潜在的空白更改)。然后运行 Seldaek 的解决方案 composer update vendorD/libraryD
它确实安装了库,但除此之外,git
diff 告诉我,在 .lock
中只添加了新内容,而没有编辑其他内容。
(Thnx Seldaek 的指针;))
composer.lock
永远不应该被愉快地删除和重建。 .lock
是...用于锁定!! ;D - 否则锁定文件将无用,您将不会提交它,或者它根本不存在。如果您在一家以质量为导向的公司中运行并重建并提交具有 1.000 个依赖项的锁,所有这些都会更改,并且 QA 人员会来杀了您哈哈哈。
"require"
部分添加"new/package" : "*",
?