PHPStorm File Watcher + WSL rsync для композер-пакета

Часто нужно одновременно поддерживать композер-пакет и проверять его в другом проекте, где он реально используется. Варианты вроде composer update с деф-версией, ручной правки прямо в целевом проекте или копирования изменений обратно в пакет быстро превращаются в боль - легко запутаться и теряется время.

Решение - настроить автоматическую синхронизацию: работаем в чистом репозитории пакета, а любые сохранения сразу попадают в проект, где пакет используется. Схема простая: IDE следит за изменениями и через синк-инструмент обновляет их в целевой папке проекта. В результате цикл правка-проверка становится почти мгновенным, без ручных апдейтов.

Т.е. задача: редактировать код пакета в отдельном проекте, а изменения проверять там где пакет используется - без дополнительных composer update.

  • Если работаешь на Ubuntu - все просто: rsync есть из коробки, PhpStorm крутится на Ubuntu, команды выполняются напрямую. Вотчер настраивается без обходных путей.

  • Здесь я показываю кейс для WSL: PhpStorm работает на Windows, а синхронизация идет командой, запущенной внутри WSL. Идея та же, только стартуем rsync из Linux-среды, пока правим код в Windows.

Условия:

  • Windows + WSL.
  • Оба пути доступны в WSL как Linux-пути.

Настройка PHPStorm File Watcher

  • Name: Sync package via WSL rsync
  • File type: Any
  • Scope: Project Files
  • Program: wsl.exe
  • Arguments:
    -e rsync
    -azv
    --delete
    --exclude=.idea/
    --exclude=.git/
    --exclude=.github/
    --exclude=vendor/
    --exclude=node_modules/
    --exclude=tests/
    --exclude=tmp/
    --exclude=phpunit.xml
    --exclude=composer.json
    --exclude=composer.lock
    --exclude=.distignore
    --exclude=.gitignore
    --exclude=.gitattributes
    --exclude=.editorconfig
    /home/user/packs/composer-package/
    /home/user/sites/mysite/vendor/vendor-name/pack-name/

Заметки:

  • Параметр --delete держит целевую папку в актуальном состоянии, если файл удален в исходнике.

  • Конструкция {...} для --exclude не работает в таком режиме.

  • Подробнее про rsync