【问题标题】:Error "could not delete" with Composer on VagrantVagrant 上的 Composer 出现“无法删除”错误
【发布时间】:2014-11-30 17:23:57
【问题描述】:

我有一个运行 Linux 的 Vagrant,我正在尝试安装 Symfony。

在命令composer create-project symfony/framework-standard-edition ./ "2.5.*"之后出现错误:

[RuntimeException]
  Could not delete ./.git/objects/pack/tmp_idx_llwUKb:

如果我尝试作曲家更新另一个项目,我总是有这种错误Could not delete

有什么想法吗?

编辑:对于另一个项目的简单sudo composer update -vvv

  - Installing sonata-project/admin-bundle (dev-master 8a022aa)
Failed to download sonata-project/admin-bundle from source: Could not delete /vagrant/crm_neo/vendor/sonata-project/admin-bundle/.git/objects/pack/tmp_idx_hchQhc:
Now trying to download from dist
  - Installing sonata-project/admin-bundle (dev-master 8a022aa)

Failed: [RuntimeException] Could not delete /vagrant/crm_neo/vendor/sonata-project/admin-bundle/.git/objects/pack/tmp_idx_hchQhc:



  [RuntimeException]
  Could not delete /vagrant/crm_neo/vendor/sonata-project/admin-bundle/.git/o
  bjects/pack/tmp_idx_hchQhc:



Exception trace:
 () at phar:///usr/local/bin/composer/src/Composer/Util/Filesystem.php:193
 Composer\Util\Filesystem->unlink() at phar:///usr/local/bin/composer/src/Composer/Util/Filesystem.php:151
 Composer\Util\Filesystem->removeDirectoryPhp() at phar:///usr/local/bin/composer/src/Composer/Util/Filesystem.php:129
 Composer\Util\Filesystem->removeDirectory() at phar:///usr/local/bin/composer/src/Composer/Util/Filesystem.php:35
 Composer\Util\Filesystem->remove() at phar:///usr/local/bin/composer/src/Composer/Util/Filesystem.php:80
 Composer\Util\Filesystem->emptyDirectory() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:108
 Composer\Downloader\FileDownloader->doDownload() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:89
 Composer\Downloader\FileDownloader->download() at phar:///usr/local/bin/composer/src/Composer/Downloader/ArchiveDownloader.php:35
 Composer\Downloader\ArchiveDownloader->download() at phar:///usr/local/bin/composer/src/Composer/Downloader/DownloadManager.php:201
 Composer\Downloader\DownloadManager->download() at phar:///usr/local/bin/composer/src/Composer/Installer/LibraryInstaller.php:156
 Composer\Installer\LibraryInstaller->installCode() at phar:///usr/local/bin/composer/src/Composer/Installer/LibraryInstaller.php:87
 Composer\Installer\LibraryInstaller->install() at phar:///usr/local/bin/composer/src/Composer/Installer/InstallationManager.php:152
 Composer\Installer\InstallationManager->install() at phar:///usr/local/bin/composer/src/Composer/Installer/InstallationManager.php:139
 Composer\Installer\InstallationManager->execute() at phar:///usr/local/bin/composer/src/Composer/Installer.php:548
 Composer\Installer->doInstall() at phar:///usr/local/bin/composer/src/Composer/Installer.php:217
 Composer\Installer->run() at phar:///usr/local/bin/composer/src/Composer/Command/UpdateCommand.php:128
 Composer\Command\UpdateCommand->execute() at phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:252
 Symfony\Component\Console\Command\Command->run() at phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:889
 Symfony\Component\Console\Application->doRunCommand() at phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:193
 Symfony\Component\Console\Application->doRun() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:135
 Composer\Console\Application->doRun() at phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:124
 Symfony\Component\Console\Application->run() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:84
 Composer\Console\Application->run() at phar:///usr/local/bin/composer/bin/composer:43
 require() at /usr/local/bin/composer:15

【问题讨论】:

  • 您可以将-vvv 附加到该作曲家命令并使用输出更新问题吗?

标签: symfony vagrant


【解决方案1】:

我发现的最佳技巧是将取消链接命令替换为以下命令。我正在运行 ubuntu。

sudo nano +219 /usr/share/php/Composer/Util/Filesystem.php

exec("sudo rm -rf $path"); 返回真;

【讨论】:

    【解决方案2】:

    这与问题有点无关,但在我的情况下是 Docker。它失败了,因为 Webpack 正在监视并且它不允许删除其他文件。

    当我关闭 Webpack 时它起作用了。

    【讨论】:

      【解决方案3】:

      就我而言,我只使用了 NFS 文件夹类型而不是共享文件夹,它可以工作:

      folders:
          - map: ~/code/cs-cart-trial
            to: /home/code/cs-cart-trial
            type: "nfs"
      

      【讨论】:

      • 同样使用 NFS 解决问题,VirtualBox 6.1.18 仍然存在同样问题
      【解决方案4】:

      我遇到了这个问题并花了很多时间进行研究。我已经尝试了所有可能的选项来修复它,但没有一个对我有用。对我来说,这个错误发生在带有 Vagrant 和 VirtualBox 提供程序的 GNU/Linux 主机上。

      原来它是一个VirtualBox bug,与创建/删除文件时的文件系统层和竞争条件有关。它仅适用于 VirtualBox 共享文件夹,而不适用于常规文件夹。可悲的是,它似乎不会很快得到修复。

      有些人报告说他们能够使用以下技巧解决问题:

      • 降级到 VirtualBox 版本 6.0.4
      • 使用nfsrsync 代替共享文件夹。
      • Patchingcomposer 在某些操作后添加一些暂停。
      • 使用--no-plugins 选项禁用插件。

      但这一切对我来说似乎很肮脏。我个人能够使用 GitHub 上建议的 workaround 来配置 composer 以从源代码安装包。这是一种简单而干净的技巧,不会对您的工作流程产生重大负面影响。尝试将以下配置放入您的~/.config/composer/config.json。或者,您可以根据需要相应地编辑您的composer.json。请记住,composer.json 将覆盖您的全局配置。

      {
          "config": {
              "preferred-install": "source"
          }
      }
      

      【讨论】:

      • 这个答案应该有更多的选票。我以前也遇到过这个问题,但完全忘记了它,直到你提到了一个 VirtualBox 错误——然后它又泛滥成灾。不过好消息!看起来 5 天前有人被分配到该错误,所以希望可以看到更永久的修复。
      【解决方案5】:

      对于 Cakephp 4.2.1 有同样的问题

      错误:

      无法删除 /var/www/vendor/cakephp/plugin-installer/src:

      解决办法:

      基于https://stackoverflow.com/a/63139337/1110760

      在尝试了上面提到的几个选项后,对我来说这是最简单的解决方法。

      composer install --prefer-source


      --no-plugins 的论点在某种程度上也很有效。它跳过了一些包,但我的本地主机似乎工作得很好。这更快,但它缺少一些。

      【讨论】:

        【解决方案6】:

        我通过创建一个挂载解决了这个问题: 在 /home/vagrant 创建一个名为 vendor 的文件夹 然后应用命令:mount --bind /home/vagrant/vendor /path/to/source/vendor

        【讨论】:

          【解决方案7】:

          刚刚遇到同样的问题。

          我发现访问某些本地文件时出现问题。在我的情况下,目标目录位于“root”下,我不是 root 用户。

          解决方案

          更改文件/目录的权限/所有者。

          1. 重新定义所有者:

            sudo chown myuser:myuser -R /path/to

          2. 您所在的组可能缺少一些权限。
            所以,尝试运行:

            sudo chmod g+rwX -R /path/to

          或者,如果它适合您,您可以使用“sudo”运行您的命令(不推荐)。 :)

          附: Never use 777。它不安全。

          UPD1

          另一件事,您可能会发现对解决问题的根源有用,将您的 composer 二进制文件包装起来以始终代表某个用户运行它。

          $ cat /usr/local/bin/composer
          #!/bin/bash
          
          # run composer behalf www-data user
          
          set -o pipefail
          set -o errexit
          set -o nounset
          #set -o xtrace
          
          [[ "${DEBUG:-}" = "true" ]] && set -o xtrace || true
          
          composer_debug=$([[ 'true' != "${COMPOSER_DEBUG:-}" ]] || echo '-vvv' )
          
          sudo -u www-data -- /usr/bin/composer ${composer_debug:-} $@
          

          【讨论】:

            【解决方案8】:

            我在本地 Homestead 环境中的 Laravel 框架升级练习期间尝试更新项目依赖项(使用 composer update)(运行 vagrant ssh 以作为默认的“vagrant”用户登录)并且之前的答案都没有这个线程对...有任何影响。

            Could not delete /home/vagrant/projects/projectname/vendor/kylekatarnls/update-helper/src/UpdateHelper
            

            ...我反复遇到的错误信息。

            唯一对我有用的是包含一个作曲家选项,如下所示:

            composer update --no-plugins
            

            Plugins 用于更改或扩展 Composer 的功能。上面的命令禁用所有已安装的插件。不幸的是,我不清楚为什么这个命令对我有用,因为我自己当然没有编写任何插件。我只能得出结论,是安装了一个错误的 Composer 插件导致了这个问题。

            【讨论】:

            • 这对我不起作用(也在 Laravel Homestead 上)。另外,解释一下--no-plugins 做了什么以及会牺牲什么会很有帮助。但它没有用。
            • 这对我有用,但它跳过了一些必需的包(cakephp 4.x)。当我使用--prefer-source 时,它会全部安装,但速度很慢...
            • 我在使用 TYPO3 v9.5 时遇到了这个问题。这个选项解决了它。谢谢!
            • 对于 Laravel Homestead,使用 NFS...它将解决问题...查看 4.2 的 medium.com/@dogcomp/ec996f9a2cb6 了解如何配置 NFS。
            【解决方案9】:

            在我的情况下,我尝试了composer update,但我得到了

            [运行时异常] 无法删除 .../vendor/bin/php-parse:

            尽管我使用的是 Laravel 框架,但这个问题是谷歌的第一个链接,所以我决定发布一个答案。

            我的解决方案是授予vendor 的所有权:sudo chown -R $USER:www-data vendor/
            sudo chown -R $USER:www-data composer.json


            更新:我的主机操作系统是 Ubuntu 16.04。

            【讨论】:

            • 我也在使用 Laravel Homestead vagrant,今天早上突然开始遇到问题,说[RuntimeException] Could not delete。不幸的是,您的解决方案对我没有任何改变。
            • @Ryan 我的解决方案不是通用的,就我而言,问题在于composer.json 文件和vendor 的所有权。检查您对其他文件夹的权限。
            • 这件事昨天发生在我身上多次,通过重新启动 Windows 暂时解决了。不过,我最近的猜测是它与 NetBeans 11.2 有关。我最近从 NetBeans 8.2 升级,我认为 11.2 的速度要慢得多,而且似乎访问文件的频率更高,而且肯定会弄乱他们的权限。
            • @Ryan 哦,您正在使用 Windows 作为主机系统。我已经更新了我的答案。
            【解决方案10】:

            对我来说,它有助于通过命令行从下载主页https://getcomposer.org/download/ 安装(新)版本。我可以排除一些文件权限,因为我是使用 chmod +R 0777 的 root,尽管我安装了 virtualbox 驱动器。无论如何,既然新版本工作了,那就意味着它是版本,或者通过 php phar 运行一个新版本,并且原来的 bin 属于 root

            php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
            php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
            php composer-setup.php
            php -r "unlink('composer-setup.php');"
            

            【讨论】:

              【解决方案11】:

              要检查的另一件事是,Composer 需要在它有权访问的目录的上下文中运行。

              在我的例子中,我试图从 /var/www 发出一个创建项目命令,针对 /var/www/html。 /var/www 归 root 所有,/var/www/html 归我执行 Composer 的同一用户所有(www-data)。我收到以下错误;无法删除 /var/www/html/:

              从 /var/www/html 本身发出相同的 Composer 命令,它运行良好。

              【讨论】:

                【解决方案12】:

                对于 Windows 用户

                哇,我不敢相信我花了多长时间才意识到这一点,遗憾的是它已经发生了很多次,我终于写下这篇笔记,以便我和其他人下次可以快速恢复。

                1. 只需使用 Windows 资源管理器删除 /vendor/whatever_project_name 文件夹,而不是尝试从 Vagrant 命令行中删除它。

                2. 然后运行composer update重新安装依赖。

                【讨论】:

                  【解决方案13】:

                  这与主机和来宾操作系统之间的文件夹同步有关,该文件夹可能只是暂时从您的主机锁定。

                  解决方案只是从主机操作系统中删除有问题的.git 文件夹,或者重新启动机器并再次启动composer install

                  理想情况下,每个操作系统都有自己的依赖项和不同的二进制文件,因此您应该将您的 /vendor 文件夹从 rsync/vagrant 文件夹共享中隔离出来,就像您在 Nodejs 项目中对 /node_modules 执行相同操作一样。

                  【讨论】:

                    【解决方案14】:

                    我在配置机器时遇到了这个问题,它被引导运行composer install。我只是退出了虚拟机并在我的主机上运行composer install 并且它工作了。

                    因此,如果您在在 VM 内运行 Composer 时遇到此问题,只需尝试在 VM 外运行 Composer

                    更新: 正如下面的 cmets 所指出的,由于本地环境和 Vagrant 环境之间的系统配置不同,这可能会导致安装不同版本的软件包时出现一些问题,因此在安装时请务必小心谨慎。试试这个。

                    【讨论】:

                    • 这可能会让你继续前进,但不能解决问题。
                    • 对此要小心。根据 PHP 版本,composer 可能想要下载不同的包。因此,如果您的 vb 版本与默认操作系统版本不同,则可能会成为问题。
                    • @MaciejPaprocki 我同意,这也使使用 Vagrant 的整个意义变得毫无用处,但是当您看不到其他任何东西时,就可以这样做了。
                    • @aalaap 不幸的是,我多次遇到类似情况,但是,最好将其添加到您的答案中,因为新手用户这样做后可能会遇到很多问题。跨度>
                    • 我尝试在 Windows 和 Vagrant 下运行 composer。当我在 VM 下运行 composer 时,我对 symfony 包有类似的错误。在 windows 下 git bash 终端作曲家工作正常。非常感谢
                    【解决方案15】:

                    对我来说,这是由 作曲家的超时引起的。我检查了我的网速,发现它降至 0.7M,几乎无法使用。在我重新连接 wifi 并让我的互联网连接速度恢复正常后,错误就消失了。

                    【讨论】:

                      【解决方案16】:

                      直接跑吧

                      sudo chmod -R 777 /folder/path
                      

                      这将授予您对正在运行 composer 的文件夹的写入权限。 我知道这是一个旧帖子,但它有效,所以我必须分享它。

                      【讨论】:

                      • 我上面也有同样的问题。这是由于权限问题。授予对我的文件夹的写访问权限后,它工作正常
                      • 将文件夹设置为 777 是鲁莽的,最好是 755
                      【解决方案17】:

                      在我的情况下,通过删除插件并重新创建框来解决问题。

                      【讨论】:

                        【解决方案18】:

                        在 AWS 上我在部署 Yii 框架项目时遇到了这个错误

                        /var/app/current/vendor/

                        文件夹我删除了其中的所有内容,然后返回到我的文档根目录并运行 composer update 它再次获取了所有存储库。

                        【讨论】:

                          【解决方案19】:

                          我们也遇到了问题。有几个人似乎有这个问题,尚未提供修复。有关更多信息,您可以查看 vagrant-winnfsd 的 github issues

                          【讨论】:

                            【解决方案20】:

                            这发生在我身上一次,结果证明我正在完成作曲家的超时。

                            您可以采取以下措施来获得一些速度:

                            1. 增加 composer process-timeout(默认 300)(如果以下设置可以帮助您提高速度,但不会受到伤害,则不需要
                            2. dist 设置为首选安装类型。
                            3. 为github启用https协议,速度更快。

                            ~/.composer/config.json

                            {
                                "config": {
                                    "process-timeout":      600,
                                    "preferred-install":    "dist",
                                    "github-protocols":     ["https"]
                                }
                            }
                            

                            如果之后还是有问题,也可以清除composer的缓存:

                            rm -rf ~/.composer/cache
                            

                            【讨论】:

                            • 是的,我清除了缓存。我在 symfony 文件夹中的 config.json 中添加了这些行
                            • 您是否以vagrant 用户身份运行作曲家?如果没有,该用户对/vagrant 目录有什么权限?
                            • 我在 SSH 上使用默认的 vagrant 用户
                            • 尝试 git 克隆一个无法在 composer 下安装的存储库。至少你可以确定问题的根源:git或composer
                            • 解决方案对我有用,在流浪机器上,通过 ssh 使用流浪用户。不仅极限更高,速度也提升不少。谢谢!
                            猜你喜欢
                            • 2019-03-06
                            • 2019-11-19
                            • 2020-10-30
                            • 1970-01-01
                            • 2015-05-03
                            • 2022-07-18
                            • 2016-04-12
                            • 2016-09-04
                            • 1970-01-01
                            相关资源
                            最近更新 更多