Composer 中文

in 默认分类 with 0 comment

原文地址

  1. 一般
  2. 找不到包裹
  3. 在travis-ci.org上找不到包裹
  4. 在Jenkins-build中找不到包
  5. 我有一个依赖项,在其composer.json中包含一个“存储库”定义,但它似乎被忽略了。
  6. 我已将锁定依赖项锁定到特定提交但获得意外结果。
  7. 需要覆盖包版本
  8. 内存限制错误
  9. Xdebug对Composer的影响
  10. “系统找不到指定的路径”(Windows)
  11. API速率限制和OAuth令牌
  12. proc_open():fork失败错误
  13. 降级模式
  14. 操作超时(IPv6问题)
  15. Composer与SSH ControlMaster挂起
  16. Zip存档未正确解压缩。

故障排除#

这是使用Composer时常见陷阱的列表,以及如何避免它们。

一般#

在询问任何人之前,composer diagnose请先检查是否存在常见问题。如果全部检出,请继续执行后续步骤。

使用Composer遇到任何问题时,请务必使用最新版本。有关详细信息,请参阅自我更新

通过运行安装程序的检查,确保您的设置没有问题curl -sS https://getcomposer.org/installer | php -- --check。

确保您直接从您的安装厂商composer.json通过 rm -rf vendor && composer update -v故障排除时,不包括与现有供应商的装置或任何可能的干扰composer.lock 项。

尝试通过运行清除Composer的缓存composer clear-cache。

找不到包#

仔细检查您的或存储库分支和标记名称中是否存在拼写错误composer.json。

务必设置正确的 最小稳定性。要开始使用或确保没有问题,请设置minimum-stability为“dev”。

不应来自Packagist的软件包应始终在根软件包中定义(软件包取决于所有供应商)。

在存储库的所有分支和标记中使用相同的供应商和软件包名称,尤其是在维护第三方分支和使用时 replace。

如果要更新到最近发布的软件包版本,请注意Packagist在Composer可以看到新软件包之前有最多1分钟的延迟。

如果要更新单个程序包,则可能依赖于较新的版本本身。在这种情况下,添加--with-dependencies参数或添加需要更新的所有依赖项。

在travis-ci.org上找不到包裹#

检查上面的“未找到包”项。

如果测试的软件包是其依赖项之一(循环依赖项)的依赖项,则问题可能是Composer无法正确检测软件包的版本。如果它是一个git克隆,它通常是正常的,并且Composer将检测当前分支的版本,但travis执行浅克隆,因此在测试拉取请求和特征分支时,进程可能会失败。最佳解决方案是通过名为COMPOSER_ROOT_VERSION的环境变量定义您所使用的版本。dev-master例如,将其设置为将根软件包的版本定义为dev-master。使用:before_script: COMPOSER_ROOT_VERSION=dev-master composer install将调用的变量导出到composer。

在Jenkins-build中找不到包#

检查上面的“未找到包”项。
失败的原因类似于travis-ci.org上可能出现的问题:Jenkins中的git-clone / checkout将分支留在“分离的HEAD”状态。因此,Composer无法识别当前签出分支的版本,并且可能无法解析循环依赖关系。要解决此问题,您可以在Gkins设置中使用“附加行为” - >“签出到特定的本地分支”,以获取Jenkins作业,其中“本地分支”应与您签出的分支相同。使用此功能,结帐将不再处于分离状态,并且可以正确识别循环依赖性。

我有一个依赖项,在其composer.json中包含一个“存储库”定义,但它似乎被忽略了。#

所述repositories配置属性被定义为根只。它不是遗传的。你可以在“ 为什么不能以递归的方式加载存储库? ”文章中阅读更多关于这背后的原因。解决此限制的最简单方法是将repositories定义移动或复制到根composer.json中。

我已将锁定依赖项锁定到特定提交但获得意外结果。#

虽然Composer支持使用#commit-ref语法将依赖项锁定到特定提交,但是有一些注意事项需要考虑。最重要的一个是有记录的,但经常被忽视:

注意:虽然这有时很方便,但从长远来看,它不应该是如何使用软件包的,因为它带有技术限制。仍将从散列之前指定的分支名称中读取composer.json元数据。因此,在某些情况下,它不是一个实际的解决方法,您应该尽快尝试切换到标记版本。

这种限制没有简单的解决方法。因此强烈建议您不要使用它。

需要覆盖包版本#

假设您的项目依赖于包A,而包A又取决于包B的特定版本(比如0.1)。但是你需要一个不同版本的包B(比如说0.11)。

您可以通过将版本0.11更改为0.1来解决此问题:

composer.json:

{
    "require": {
        "A": "0.2",
        "B": "0.11 as 0.1"
    }
}

有关更多信息,请参阅别名。

内存限制错误#

使用此消息,Composer有时可能会失败一些命令:

PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted <...>

在这种情况下,memory_limit应该增加PHP 。

注意: Composer内部增加memory_limitto 1.5G。

要获取当前memory_limit值,请运行:

php -r "echo ini_get('memory_limit').PHP_EOL;"

尝试增加php.ini文件中的限制(例如,/etc/php5/cli/php.ini对于类似Debian的系统):

; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1

Composer还尊重由COMPOSER_MEMORY_LIMIT环境变量定义的内存限制:

COMPOSER_MEMORY_LIMIT=-1 composer.phar <...>

或者,您可以使用命令行参数来增加限制:

php -d memory_limit=-1 composer.phar <...>

当激活shell fork炸弹保护时,cPanel实例上也会发生此问题。有关更多信息,请参阅cPanel站点上的fork bomb功能文档。

Xdebug对Composer的影响#

为了在启用xdebug扩展时提高性能,Composer会在没有它的情况下自动重启PHP。您可以使用环境变量覆盖此行为:COMPOSER_ALLOW_XDEBUG=1。

如果正在使用xdebug,Composer将始终显示警告,但您可以使用环境变量覆盖它: COMPOSER_DISABLE_XDEBUG_WARN=1。如果您意外地看到此警告,则重新启动过程失败:请报告此问题。

“系统找不到指定的路径”(Windows)#

打开注册表。
AutoRun在里面搜索一个键HKEY_LOCAL_MACHINESoftwareMicrosoftCommand Processor, HKEY_CURRENT_USERSoftwareMicrosoftCommand Processor 或者HKEY_LOCAL_MACHINESoftwareWow6432NodeMicrosoftCommand Processor。
检查它是否包含不存在的文件的任何路径,如果是这种情况,请删除它们。

API速率限制和OAuth令牌#

由于GitHub对其API的速率限制,可能会发生Composer提示身份验证,询问您的用户名和密码,以便它可以继续其工作。

如果您不希望向Composer提供GitHub凭据,可以使用以下过程手动创建令牌:

在GitHub上创建 OAuth令牌。 阅读更多相关内容。

将其添加到正在运行的配置中 composer config -g github-oauth.github.com
现在Composer应该安装/更新而不要求身份验证。

proc_open():fork失败的错误#

如果作曲家在某些命令上显示proc_open()fork失败:

PHP Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar

这可能会发生,因为VPS内存不足并且没有启用交换空间。

free -m

total used free shared buffers cached
Mem: 2048 357 1690 0 0 237
-/+ buffers/cache: 119 1928
Swap: 0 0 0

要启用交换,您可以使用例如:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

您可以按照本教程制作永久交换文件。

降级模式#

由于Travis和其他系统存在一些间歇性问题,我们引入了降级网络模式,这有助于Composer成功完成但禁用了一些优化。首次检测到问题时会自动启用此功能。如果您偶尔看到这个问题,您可能不必担心(缓慢或过载的网络也会导致超时),但如果它反复出现,您可能需要查看下面的选项以识别并解决它。

如果您已经指向此页面,则需要检查以下内容:

如果您使用的是ESET防病毒软件,请进入“高级设置”并禁用“Web访问保护”下的“HTTP-scanner”
如果您使用的是IPv6,请尝试禁用它。如果这解决了您的问题,请与您的ISP或服务器主机联系,问题不在于Packagist级别,而在于您与Packagist(即整个互联网)之间的路由规则。解决这些问题的最佳方法是提高对有能力修复它的网络工程师的认识。请查看IPv6解决方法的下一部分。

如果以上都没有帮助,请报告错误。

操作超时(IPv6问题)#

如果未正确配置IPv6,则可能会遇到错误。一个常见的错误是:

The "https://getcomposer.org/version" file could not be downloaded: failed to
open stream: Operation timed out

我们建议您修复IPv6设置。如果无法做到这一点,您可以尝试以下解决方法:

解决方法Linux:

在linux上,似乎运行此命令有助于使ipv4流量具有比ipv6更高的prio,这是比完全禁用ipv6更好的选择:

sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf"

解决方法Windows:

在Windows上唯一的办法是完全禁用ipv6,我担心(无论是在Windows中还是在家用路由器中)。

解决方法Mac OS X:

获取您的网络设备的名称:

networksetup -listallnetworkservices

在该设备上禁用IPv6(在本例中为“Wi-Fi”):

networksetup -setv6off Wi-Fi

运行作曲家......

您可以再次启用IPv6:

networksetup -setv6automatic Wi-Fi

也就是说,如果这可以解决您的问题,请与您的ISP联系,以尝试解决路由错误。这是让每个人都能解决问题的最好方法。

使用SSH ControlMaster挂起作曲家#

当您尝试从一个Git仓库安装软件包,并使用ControlMaster 设置为你的SSH连接,Composer可能会无休止地挂起,您会看到sh 在这个过程中defunct的状态在进程列表中。

原因是SSH Bug:https://bugzilla.mindrot.org/show_bug.cgi? id = 1988

解决方法是,在运行Composer之前打开与Git主机的SSH连接:

ssh -t git@mygitserver.tld
composer update

有关更多信息,另请参阅https://github.com/composer/composer/issues/4180

Zip存档未正确解压缩。#

Composer可以使用系统提供的unzip实用程序或PHP的本机ZipArchive类解压缩zipball 。该ZipArchive班是最好的Windows。在ZIP文件可以包含权限和符号链接的其他操作系统上,unzip首选该实用程序。如果您需要这些功能,建议您安装它。

Responses