Рабочий каталог¶
Правило: без явного cwd рабочим каталогом становится корень проекта.
Не каталог программы. .env, migrations/, configs/ и templates/ лежат в
корне репозитория, и оттуда же вы запускаете программу руками.
Каталог пакета — это конвенция тестов: go test и cargo test стартуют
оттуда. К запуску она отношения не имеет, а в раскладке с несколькими cmd/* она
дала бы столько разных рабочих каталогов, сколько бинарников, и ни одного
правильного.
Порядок разрешения¶
- явный
cwdпрофиля; - корень проекта;
- каталог, из которого запустили сам
bugsaur— только для ручного запуска--adapter/--program, у которого нет проекта, а значит и корня.
Задать явно¶
Относительный cwd считается от корня проекта.
Самая частая причина его задать — тест, который читает testdata/ из каталога
своего пакета, то есть ровно оттуда, откуда его запустили бы go test или
cargo test.
Он уходит адаптеру, а не только ставится процессу¶
Рабочий каталог передаётся адаптеру в теле DAP-запроса, а не просто становится каталогом самого процесса адаптера.
Разница видна там, где адаптер и отлаживаемое — разные процессы: dlv отдаёт
отлаживаемому свой каталог по наследству, а debugpy — нет.
Для ручного запуска¶
У 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".