Как установить переменную среды в gradle через задачу?

У меня есть приложение gradle. И мой основной gradle файл включает некоторые задачи (groovy). Мне нужно, когда я запускаю свою задачу - переменная окружения "LANG" устанавливает кодировку = ru_RU.koi8-r (для Windows, Linux), а после завершения моей задачи - переменная среды содержит начальное значение (en_US.UTF-8), Как это сделать? Помогите мне, пожалуйста.

Ответы

Ответ 1

Мне пришлось провести некоторое исследование в этой теме и попытаться прояснить некоторые открытые проблемы. Я бы сделал это в двух комментариях, но у меня пока нет достаточной репутации. Так как я нашел Игоря Ганапольского комментарий и на других сайтах, но без ответа каждый раз, когда я чувствую необходимость писать другой ответ, даже если на вопрос уже ответил.

Как сказал Мартин Раджняк, вы можете установить переменную среды, как он показал. Но эта переменная действительна только для заданной задачи или соответствующего процесса. Это означает, что вы не можете использовать его в следующей задаче. Я проверил, что, задав две зависимые задачи:

task('firstTask', type:Exec) {
    environment "FOO", "bar"

    workingDir '.'
    commandLine 'cmd', '/c', 'print.bat'
}

task ('secondTask', type:Exec) {
    dependsOn firstTask

    workingDir '.'
    commandLine 'cmd', '/c', 'print.bat'
}

Команда print.bat выполняет только эхо-переменную среды:

@echo off
echo %FOO%

Запуск сборки с помощью команды gradle secondTask даст:

> Task :firstTask
bar

> Task :secondTask
ECHO ist ausgeschaltet (OFF).

Итак, переменная окружения больше не существует для secondTask.

Так много для актуальной темы, но есть еще одна важная вещь, которая может быть причиной проблемы Игоря: Метод environment недоступен для каждой задачи Gradle. Как вы можете видеть в документации Exec -task-type, метод environment явно определен для Exec -task -типа.

Чтобы быть полным, я хочу упомянуть, что вы можете передавать переменные в java-процесс, используя JavaExec -task-type и его метод systemProperty. Но вы не можете использовать environment здесь, потому что этот метод не определен для JavaExec -task-type.

Однако я все еще ищу способ определить переменную среды, которая действительна для всей сборки, не определяя ее непосредственно через операционную систему.

Ответ 2

Насколько я знаю, вы не можете установить переменную системной среды из Gradle Задачи.

Однако для этого процесса можно задать переменную окружения. Таким образом, если вам нужно установить переменную окружения только для сборки, используйте это:

task MyTask(type: Exec) {
  environment 'ENVIRONMENT_VARIABLE_NAME', 'environment_variable_value'

  // run or build code that needs that environment variable
}

Вы также можете сделать компиляцию зависимой от этой задачи, поэтому, если вы создаете свой код, вы устанавливаете переменную среды перед компиляцией:

tasks.withType(JavaCompile) {
  compileTask -> compileTask.dependsOn MyTask
}

Ответ 3

Существует более легкое решение

tasks.withType(org.gradle.api.tasks.testing.Test) {
    systemProperty 'host', 'DEV'
}

Ответ 4

Чтобы установить переменную среды для определенного типа задачи, вы можете использовать следующий фрагмент кода. Переменная окружения "DOCKER_HOST" будет установлена ​​для всех задач типа "Exec".

tasks.withType(Exec) {
    environment "DOCKER_HOST", "tcp://localhost:2375"
}