Почему после обновления композитора каталог поставщика теряется?

У меня ВМ со следующим 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.

2 ответа

Решение

Так работает композитор. Если вы хотите что-то добавить в ~/.composer/vendorтогда вы должны положить его в ~/.composer/composer.json, По умолчанию каталог поставщика будет расположен рядом с composer.json файл.

У вас есть несколько вариантов здесь. Лучше всего просто обойтись без /vendor/composer.jsonи просто беги composer global require "drush/drush": "dev-master" вместо. Что добавит drush/drush в ~/.composer/composer.jsonи установите его. Затем вы получите символическую ссылку на каталог Drush в ~/.composer/vendor/binЯ подозреваю, к чему вы стремитесь.

Что касается обходного пути, использовать файл 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"
    }
}

который установит drush во всем мире с минимальной головной болью, как /usr/local/bin должно быть уже в ПУТИ.


Или, если вы не хотите жестко задавать путь в файле JSON (чтобы его можно было использовать между разными службами), есть еще более простой способ, предложенный, например, jonhattan:

  • Способ 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
    
  • Трэвис CI путь:

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

Вместо install Вы также можете использовать update,

Другие вопросы по тегам