为什么 Composer 更新后供应商目录放错了位置?

为什么 Composer 更新后供应商目录放错了位置?

我有虚拟机包含以下composer.json文件/vagrant

{
    "require": {
        "drush/drush": "dev-master"
    }
}

然后当我composer update在该文件夹中运行时,它会下载要求/vagrant/vendor,而不是预期的本地 HOME 目录照常(~/.composer/vendor)。

有什么原因吗?如何解决?

我在用着:

Composer version 1.0-dev (15face5432d7b7334db6ac69fac0190971cafa6e) 2015-09-23 17:46:25

在 Ubuntu 15.04 上。

答案1

这就是 composer 的工作原理。如果你想要将某些内容添加到~/.composer/vendor,那么你应该将其放入~/.composer/composer.json。默认情况下,vendor 目录将放在文件旁边composer.json

这里有几个选项。最好的办法可能是放弃/vendor/composer.json,而直接运行composer global require "drush/drush": "dev-master"。这将添加drush/drush~/.composer/composer.json,并安装它。然后您将在 中获得一个指向 Drush 目录的符号链接~/.composer/vendor/bin,我怀疑这就是您想要的。

答案2

至于解决方法,要使用不在的 JSON 文件~/.composer/composer.json可以指定供应商路径config/中vendor-dir,例如:

{
    "config": {
        "vendor-dir": "~/.composer/vendor"
    },
    "require": {
        "drush/drush": "dev-master"
    }
}

应该安装drush~/.composer/vendor/drush/drush/drush,然后需要对 PATH 变量进行适当的更改,例如

ex +'$s@$@\rexport PATH=\~/.composer/vendor/bin:$PATH@' -cwq ~/.bashrc

为了使其成为全局的(通过以 身份运行root),我猜/var/lib/vendor可以使用vendor-dir,并将正确的路径附加到全局文件之一中的 PATH 变量(例如/etc/bash.bashrc或 )/etc/profile,或者指定bin-dir在 JSON 文件中,例如:

{
    "config": {
        "vendor-dir": "/var/lib/vendor",
        "bin-dir": "/usr/local/bin"
    },
    "require": {
        "drush/drush": "dev-master"
    }
}

由于它已经在 PATH 中了,因此可以drush以最少的麻烦进行全局安装。/usr/local/bin


或者,如果你不想在 JSON 文件中对路径进行硬编码(以便可以在不同的服务之间共享),那么还有更简单的方法,如乔恩哈坦, 例如:

  • VM 方式(以 root 身份):

    COMPOSER_HOME=/var/lib/composer COMPOSER_BIN_DIR=/usr/local/bin COMPOSER_VENDOR_DIR=/var/lib/composer/vendor composer -nqq install --no-interaction --optimize-autoloader
    
  • Travis CI 方式:

    COMPOSER_BIN_DIR=~/bin composer -nqq install --no-interaction --optimize-autoloader --prefer-source
    

您还install可以使用update

相关内容