Передача аргументов и окружения¶
Дать отлаживаемой программе ту командную строку и то окружение, которых она ждёт.
Аргументы¶
[profiles.app]
adapter = "dlv"
program = "cmd/api"
args = ["--config", "${root}/configs/dev.yaml", "--verbose"]
По элементу списка на аргумент. Значение с пробелом внутри — это всё равно один элемент:
args = ["--message", "hello world"] # два аргумента — правильно
args = ["--message hello world"] # один аргумент — почти наверняка не то
Шелла в процессе нет: ни разбиения на слова, ни раскрытия шаблонов, ни
подстановки $VAR. Единственная подстановка — ${root}, дающая абсолютный путь
корня проекта.
Окружение: два поля под две задачи¶
[profiles.api]
adapter = "dlv"
program = "cmd/api"
env_file = ".env"
env = { LOG_LEVEL = "debug", ROOT = "${root}" }
env_file— общий для команды, лежит в репозитории или в.gitignore;env— точечная правка на сейчас.
Приоритет от слабого к сильному: унаследованное окружение → env_file →
env.
Написанное в профиле явно выигрывает всегда, поэтому забытый DATABASE_URL в
вашем шелле не может молча победить конфиг.
Рецепты¶
Приложение само читает .env¶
Делать ничего не нужно: рабочим каталогом становится корень проекта, поэтому
относительный .env находится так же, как при запуске программы руками.
Приложение не читает .env само¶
Если переменные раньше приезжали от direnv или расширения редактора, назовите
файл явно:
Монорепа с общим .env выше корня¶
# services/api/.bugsaur/config.toml
[profiles.api]
adapter = "dlv"
program = "."
env_file = "../../.env"
Свой .env у каждой команды¶
Включить подробные логи на один прогон¶
Переменные, которые выставляет cargo run, а прямой запуск нет¶
Формат .env¶
# комментарий
DATABASE_URL=postgres://localhost/app
export PORT=8080
GREETING="hello world" # кавычки сохраняют пробелы
MULTI="a\nb" # в двойных кавычках работают \n \r \t \\ \"
LITERAL='a\nb' # в одинарных значение берётся буквально
HASH=a#b # комментарий начинается только с ` #`
EMPTY=
Ни интерполяции ${VAR}, ни многострочных значений. Строка, которая не
разобралась, останавливает запуск и называет свой номер. При повторяющемся ключе
выигрывает последний.
PHP не принимает ни того, ни другого¶
PHP-адаптер ничего не запускает, поэтому args, env и env_file к нему не
применяются. Передавайте их там, где PHP действительно стартует: в
docker-compose.yml, в конфиге пула FPM или в командной строке:
Если не работает¶
| Симптом | Причина | Что делать |
|---|---|---|
Запуск остановлен: не найден env_file |
файл назван, но его нет | почините путь — он считается от корня |
Запуск остановлен на строке .env |
эта строка не разбирается | проверьте кавычки; интерполяция не поддерживается |
| У переменной не то значение | её перебило что-то более сильное | env сильнее env_file, тот сильнее унаследованного |
${VAR} попадает в значение буквально |
.env не интерполирует |
впишите значение явно или задайте его в env |
| Аргумент приходит одной строкой | он записан одним элементом списка | разбейте на отдельные элементы |