Как может мельничная задача обновлять переменные среды, чтобы более поздние задачи видели обновленное значение?
В документации по API-интерфейсу задач mill v0.9.9 сказано:
Mill поддерживает долгоживущий сервер JVM, чтобы избежать повторной загрузки классов. Из-за этого запуск System.getenv в задаче может не дать обновленных переменных среды, поскольку он будет инициализирован при запуске сервера, а не при выполнении клиента. Чтобы обойти это, клиент mill отправляет переменные среды на сервер в том виде, в котором он их видит, и сервер делает их доступными как Map [String, String] через Ctx API.
Так что читать обновленную переменную среды просто:
def envVar = T.input { T.ctx.env.get("ENV_VAR") }
но как задача может сделать это: «клиент мельницы отправляет переменные среды на сервер», чтобы следующие выполняющиеся задачи увидели обновленную переменную среды?
1 ответ
Это почти все сказано. Но для большей ясности: клиент mill запускается каждый раз, когда вы запускаете команду mill, поэтому он также может видеть текущие переменные среды ОС. Именно этот клиент фиксирует эти переменные и отправляет их на уже работающий сервер Mill перед выполнением графа задач.
Кроме того, чтобы это работало, важно использовать контекстный API для доступа к переменной системной среды через
T.ctx.env
. Поскольку этот контекст предоставляется моей Mill, сервер Mill может получить доступ к самым актуальным переменным среды. Напротив, если бы вы использовали Javas
System.getenv
API, вы можете увидеть, вероятно, устаревшие переменные (именно те, которые были текущими на момент запуска сервера).