Установка systemProperty в gradle.taskGraph.whenReady

Я пытаюсь прочитать имя пользователя и пароль, необходимые для входа в мое приложение и присвоить его системному свойству. Я могу читать значения, используя System.console().readLine но я не могу присвоить его системному свойству. Значения свойства всегда равны нулю, я знаю, что это значение равно нулю System.console().println на двух свойствах.

Причина я использую gradle.taskGraph.whenReady потому что я не хочу, чтобы пароль запрашивался для каждой задачи, а только при запуске задачи, предназначенной для Live.

Ниже мой мой код

def user_login =""
def pass_login =""

gradle.taskGraph.whenReady { taskGraph ->
    user_login = System.console().readLine("\nPlease enter username: ")
    pass_login = System.console().readPassword("\nPlease enter password: ")

    test {
        systemProperty "username", new String(user_login)
        systemProperty "password", new String(pass_login)    
    }
}

Я пробовал без test{...} но это дает следующее сообщение об ошибке:

Could not find method systemProperty() for arguments [username,] on root project

Я много искал в Google, но не нашел ответа на этот вопрос, любая помощь по этому вопросу очень ценится.

Спасибо.

2 ответа

Вы могли бы просто позвонить System.setProperty()

Я не думаю, что существует метод, называемый systemProperty либо на заводной, либо на gradle

Изменить: Ваше приложение и скрипт Gradle не работают в одном экземпляре JVM. Это означает, что системные свойства, установленные в скрипте gradle, не передаются приложению. Вам нужно будет найти другой способ получить имя пользователя и пароль в вашем приложении.

Из того, что я вижу в последних документах Gradle, Test имеет systemProperties свойство, которое принимает Map, Здесь нет systemProperty, Итак, я считаю, что вы хотите следующее (не проверено... см. № 2 ниже):

def user_login =""
def pass_login =""

gradle.taskGraph.whenReady { taskGraph ->
    user_login = System.console().readLine("\nPlease enter username: ")
    pass_login = System.console().readPassword("\nPlease enter password: ")

    test {
        systemProperties "username": user_login, "password": pass_login    
    }
}  

Я также хотел добавить, что я вижу несколько проблем с вашим подходом, которые вы, возможно, захотите пересмотреть.

  1. gradle - это инструмент / платформа для сборки, и сборки предназначены для минимального вмешательства человека. Разве это не должно быть автоматизировано? Ввод вашего имени пользователя и пароля будет очень утомительным, очень быстро. Я считаю, что вы должны рассмотреть возможность использования свойств gradle. Таким образом, пользователь сборки устанавливает свое имя пользователя и пароль для своего пользователя. gradle.properties файл. Это дает дополнительное преимущество, так как доступно для нескольких сборок без необходимости когда-либо запрашивать пользователя.
  2. Почему это происходит в taskGraph закрытие? Как это зависит от taskGraph настраивается? Как другие задачи в вашей сборке будут использовать это? Я не верю, что ваш код будет работать. test Задача, предоставляемая тем плагином, который вы используете, уже была настроена ко времени taskGraph готов. Google gradle configuration vs execution чтобы получить много обсуждений по теме, или используйте этот пример.

Рассмотрите возможность использования:

/**
 * ~/.gradle/gradle.properties
 */
userName = me
userPassword = YouWillNeverKnow

/**
 * build.gradle
 */
apply plugin: 'java'
test {
        // use safe navigation to avoid missing property exception
        systemProperties "username": project?.userName, "password": project?.userPassword
    }
}  

Я проверил вышеупомянутое, используя мое тестирование спока для моего отличного проекта, и это сработало.

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