Кейс: нужен какой-нибудь 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)"

#Директория, где находится изолированная версия PHPStan

PHPSTAN_ISOLATED_DIR="$SCRIPT_DIR/phpstan-isolated"

#Путь к исполняемому файлу PHPStan

PHPSTAN_BIN="$PHPSTAN_ISOLATED_DIR/vendor/bin/phpstan"

#Проверяем, установлен ли composer

if ! command -v composer &>/dev/null; then error_exit "Composer не установлен или не найден в PATH" fi

#Проверяем, существует ли папка vendor

if [[ ! -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 и будет работать независимо от основного проекта.