Перейти к содержанию

Рабочий каталог

Правило: без явного cwd рабочим каталогом становится корень проекта.

Не каталог программы. .env, migrations/, configs/ и templates/ лежат в корне репозитория, и оттуда же вы запускаете программу руками.

Каталог пакета — это конвенция тестов: go test и cargo test стартуют оттуда. К запуску она отношения не имеет, а в раскладке с несколькими cmd/* она дала бы столько разных рабочих каталогов, сколько бинарников, и ни одного правильного.

Порядок разрешения

  1. явный cwd профиля;
  2. корень проекта;
  3. каталог, из которого запустили сам bugsaur — только для ручного запуска --adapter / --program, у которого нет проекта, а значит и корня.

Задать явно

[profiles.orders-test]
adapter = "dlv"
program = "internal/orders"
cwd = "internal/orders"

Относительный cwd считается от корня проекта.

Самая частая причина его задать — тест, который читает testdata/ из каталога своего пакета, то есть ровно оттуда, откуда его запустили бы go test или cargo test.

Он уходит адаптеру, а не только ставится процессу

Рабочий каталог передаётся адаптеру в теле DAP-запроса, а не просто становится каталогом самого процесса адаптера.

Разница видна там, где адаптер и отлаживаемое — разные процессы: dlv отдаёт отлаживаемому свой каталог по наследству, а debugpy — нет.

Для ручного запуска

bugsaur run --adapter dlv --program ./cmd/api --cwd .

У PHP его нет

К PHP cwd не применяется: адаптер не запускает процесса, значит и задавать рабочий каталог некому. PHP-процесс получает каталог от того, кто его поднимает — PHP-FPM, Docker, CLI. См. Языки → PHP.

Как увидеть разницу

Поведение легко проверить на Rust-фикстуре из репозитория: она печатает свой cwd и наличие Cargo.toml рядом:

make fixture-rust

# Старый дефолт — каталог программы, то есть target/debug:
cd fixtures/rust-hello/target/debug && ./rust-hello   # Cargo.toml рядом: false

# Нынешний дефолт — корень пакета:
cd fixtures/rust-hello && ./target/debug/rust-hello   # Cargo.toml рядом: true

Под отладчиком без явного cwd получается второе. Чтобы увидеть первое, допишите в профиль cwd = "target/debug".