Как может мельничная задача обновлять переменные среды, чтобы более поздние задачи видели обновленное значение?

В документации по 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, вы можете увидеть, вероятно, устаревшие переменные (именно те, которые были текущими на момент запуска сервера).

Другие вопросы по тегам