Кейс: нужен какой-нибудь php инструмент, но простой composer req --dev instrument не работает, так как есть несовместимые зависимости. Чисто для примера, возьмем phpstan. Создаем папку bin/phpstan-isolated. Делаем там composer init, composer req --dev phpstan/phpstan, не забываем добавить папку vendor новую в .gitignore. Пользоваться уже можно, через bin/phpstan-isolated/vendor/bin/phpstan. Не слишком удобно. Создаём файл bin/phpstan следующего содержания: #!/usr/bin/env bash
set -euo pipefail # Выход при ошибках, неопределенных переменных и ошибках в конвейере
#Функция для вывода сообщений об ошибкахerror_exit() { echo "Ошибка: $1" >&2 exit 1 }
#Абсолютный путь к директории проекта (корень репозитория)SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
#Директория, где находится изолированная версия PHPStanPHPSTAN_ISOLATED_DIR="$SCRIPT_DIR/phpstan-isolated"
#Путь к исполняемому файлу PHPStanPHPSTAN_BIN="$PHPSTAN_ISOLATED_DIR/vendor/bin/phpstan"
#Проверяем, установлен ли composerif ! command -v composer &>/dev/null; then error_exit "Composer не установлен или не найден в PATH" fi
#Проверяем, существует ли папка vendorif [[ ! -d "$PHPSTAN_ISOLATED_DIR/vendor" ]]; then echo "Папка vendor не найдена в $PHPSTAN_ISOLATED_DIR. Выполняем composer install..." ( cd "$PHPSTAN_ISOLATED_DIR" || error_exit "Не удалось перейти в директорию $PHPSTAN_ISOLATED_DIR" composer install || error_exit "Ошибка при выполнении composer install в $PHPSTAN_ISOLATED_DIR" ) fi
#Проверяем, существует ли исполняемый файл PHPStan и является ли он файломif [[ ! -f "$PHPSTAN_BIN" ]] || [[ ! -x "$PHPSTAN_BIN" ]]; then error_exit "Файл $PHPSTAN_BIN не найден или не является исполняемым файлом" fi
#Запускаем PHPStan с переданными аргументамиexec "$PHPSTAN_BIN" "$@" Таким образом, даже после свежего клонирования репозитория, наш bin/phpstan сам доставит vendor и будет работать независимо от основного проекта.