如何使用Composer更新单个库?

463
我需要为我的SF2分发安装一个软件包(DoctrineFixtures)。
当我运行
php composer.phar update

我明白了

  - Updating twig/twig (dev-master 39d94fa => v1.13.0)
    The package has modified files:
    M CHANGELOG
    M doc/filters/batch.test
    M doc/filters/index.rst
    M doc/filters/url_encode.rst
    M doc/functions/index.rst
    M doc/tags/index.rst
    M doc/tests/index.rst
    M lib/Twig/Autoloader.php
    M lib/Twig/Compiler.php
    M lib/Twig/CompilerInterface.php
-10 more files modified, choose "v" to view the full list

看起来上一个开发人员编辑了许多 vendor 文件夹内的文件。

为了解决这个问题,我尝试了

php composer.phar update <package_name>

但这似乎不起作用。我如何从composer.json仅更新/安装一个库?


你正在使用正确的命令。你能给我们展示一下你的 composer.json 文件吗? - cheesemacfly
请尝试使用我提供的命令,否则请提供您收到的错误描述(例如,如果composer出现问题,请提供composer输出)。 - Nicolai Fröhlich
你的composer.json文件可能会引用一个项目的替代分支。 - iconoclast
我在我的Laravel项目中更新了一个特定的依赖项,并明确指定要安装的特定组件:composer update laravelcollective/html。看起来这样做是有效的。 - marko
但是似乎不起作用,你觉得为什么呢? - Black
8个回答

740

要安装版本为2.1.*并且最低稳定性为@devdoctrine/doctrine-fixtures-bundle,请使用以下命令:

composer require doctrine/doctrine-fixtures-bundle:2.1.*@dev

然后只需更新这个单独的软件包:

composer update doctrine/doctrine-fixtures-bundle

13
有时候,通过在更新/安装时使用-vvv(详细模式:composer.phar update -vvv package/package),可能会更好,因为偶尔会出现交互提示,否则可能会被隐藏。 - timhc22
始终更新优化ClassMap。在“composer update -o”命令中添加“-o”参数。 - Muhammed
在这个例子中,update命令有什么用?难道require不已经更新/安装了包吗?当我在require之后立即执行update时,Composer会说“没有要安装或更新的内容”。 - clemlatz
33
这条命令"composer.phar update doctrine/doctrine-fixtures-bundle"会更新所有其他的软件包。 - podarok
2
无法工作,这会更新许多软件包。 - Black
显示剩余3条评论

241

如果您只想更新一些软件包而不是全部,您可以将它们列出来:

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

你也可以使用通配符一次更新一堆软件包:

php composer.phar update vendor/*

正如@ZeroThe2nd所评论的,ZSH用户可能需要将它们的vendor/*用引号括起来:

php composer.phar update "vendor/*"
  • --prefer-source: 当可用时从源码安装软件包。
  • --prefer-dist: 当可用时从远程存储库安装软件包。
  • --ignore-platform-reqs: 忽略phphhvmlib-*ext-*的要求,并强制进行安装,即使本地计算机不满足这些要求。另请参阅platform配置选项
  • --dry-run: 模拟命令,实际上不执行任何操作。
  • --dev: 安装列在require-dev中的软件包(默认行为)。
  • --no-dev: 跳过安装列在require-dev中的软件包。自动加载程序生成跳过autoload-dev规则。
  • --no-autoloader: 跳过自动加载程序生成。
  • --no-scripts: 跳过在composer.json中定义的脚本执行。
  • --no-plugins: 禁用插件。
  • --no-progress: 移除进度显示,可以干扰某些终端或不处理退格字符的脚本。
  • --optimize-autoloader (-o): 将PSR-0/4自动加载转换为类映射以获得更快的自动加载程序。特别是用于生产环境,但运行时间可能有点长,因此目前不是默认情况。
  • --lock: 仅更新锁定文件哈希以抑制锁定文件过时的警告。
  • --with-dependencies: 将白名单软件包的所有依赖项也添加到白名单中。
  • --prefer-stable: 首选依赖的稳定版本。
  • --prefer-lowest: 首选依赖的最低版本。有助于测试要求的最小版本,通常与--prefer-stable一起使用。

1
请注意,ZSH用户可能需要用引号括起他们的vendor/*composer update "vendor/*" - ZeroThe2nd

163

安装、更新和要求之间的区别

假设以下场景:

composer.json

"parsecsv/php-parsecsv": "0.*"

composer.lock文件

  "name": "parsecsv/php-parsecsv",
            "version": "0.1.4",

最新版本为1.1.0。最新的0.*版本是0.3.2

安装:composer install parsecsv/php-parsecsv

这将按照锁定文件中指定的版本号0.1.4进行安装。

更新:composer update parsecsv/php-parsecsv

这将把该包更新到版本0.3.2,并且会根据你的composer.json文件更新composer.lock文件中的条目。

要求:composer require parsecsv/php-parsecsv

这将安装或更新最新版本1.1.0,同时还会更新composer.jsoncomposer.lock文件。


很棒,因此要在受限版本中刷新一个包,可以使用composer update author/package 然后是 composer install author/package - William Randokun
@WilliamRandokun 如果你之前已经安装过了,那么只需要运行 composer update package 即可,无需再调用 install。 - Adam
2
完全符合我的要求。解释得很清楚。已点赞。 - kapitan
2
谢谢。我以前不知道 composer require 命令也会将包更新到最新版本。 - winnie damayo
我认为这已经过时了。它似乎更新了所有的包,但完全没有触及我的composer.json文件。 - tremby
显示剩余7条评论

25
你可以使用以下命令来更新任何带有其依赖项的模块。
composer update vendor-name/module-name --with-dependencies

19

您基本上可以按照以下步骤安装新软件包。

php composer.phar require

然后终端会要求您输入要搜索的软件包名称。

$ Search for a package []: //Your package name here

然后终端会询问包的版本(如果想要最新版本,可以将其留空)

$ Enter the version constraint to require (or leave blank to use the latest version) []: //your version number here

然后您只需按下回车键。如果您不想安装另一个软件包,终端将会要求您操作并再次按下回车键即可完成。


15

只需使用

composer require {package/packagename}

喜欢

composer require phpmailer/phpmailer
如果软件包不在vendor文件夹中,Composer会将其安装;如果软件包已经存在,则Composer会更新软件包到最新版本。 更新: require 安装或更新最新的软件包版本。如果您只想更新一个软件包,请使用 update

这样做不会按预期工作,因为它会将库放入composer.json中。这对于更新包是不必要的。 - Nico Haase
不像预期那样工作。它还会在过程中更新/降级其他软件包。 - Black
@Black require 安装或更新最新的软件包版本。如果您想要更新一个软件包,只需使用 update 命令即可。回答已更新。 - Mostafa

6
为了确保composer更新已经安装的包至符合composer.json中设定的版本约束条件的最新版本,请将该包从vendor中删除,然后执行以下命令:
php composer.phar update vendor/package

6
您可以在此帖子中找到相同的建议: https://github.com/composer/composer/issues/3112。附注:没有解释的负评很容易被执行,但并没有什么用。 - Tsounabe

5
因为你想要安装特定的软件包 “我只需要为我的SF2分发安装一个软件包(DoctrineFixtures)。”

php composer.phar require package/package-name:package-version 就足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接