Kotlin и Gradle – Чтение из stdio

Я пытаюсь выполнить класс Kotlin с помощью команды:

./gradlew -q run < src/main/kotlin/samples/input.txt 

Вот мой класс HelloWorld.kt :

 package samples fun main(args: Array<String>) { println("Hello, world!") val lineRead = readLine() println(lineRead) } 

Вот мой build.gradle.kts :

 plugins { kotlin("jvm") application } application { mainClassName = "samples.HelloWorldKt" } dependencies { compile(kotlin("stdlib")) } repositories { jcenter() } 

Код выполняется, но данные, содержащиеся внутри файла input.txt, не отображаются. Вот результат, который я получаю:

 Hello, world! null 

Я хочу, чтобы выполнить команду gradlew выше, и поток input.txt будет перенаправлен на stdio. Я легко могу сделать это на C ++. Как только я скомпилирую мой файл .cpp, я могу запустить:

 ./my_code < input.txt 

и он выполняется, как ожидалось.

Как я могу достичь того же самого с Котлином и Грейдлом?

Обновление : на основе этого ответа я попытался добавить это в build.gradle.kts, но это не допустимый синтаксис:

введите описание изображения здесь

Предложение AjahnCharles о run { standardInput = System.in } верное, но для его переноса в kotlin-dsl вам нужен другой синтаксис. run в этом случае – это имя задачи, и вы настраиваете существующую задачу плагина application . Чтобы настроить существующую задачу в kotlin-dsl, вы должны использовать один из следующих способов:

 val run by tasks.getting(JavaExec::class) { standardInput = System.`in` } 

или

 val run: JavaExec by tasks run.standardInput = System.`in` 

Предстоящая версия Gradle 4.3 должна предоставить API для плагинов, чтобы читать данные пользователя.

Причина различия между Groovy и Kotlin в этом случае, поскольку Groovy использует динамические типы, но в Kotlin вы должны указать тип задачи, чтобы иметь автозаполнение и просто компилировать сценарий конфигурации

Почти, но это не работает: '(

В теории

Мое понимание: < input.txt устанавливает стандартный ввод для процесса gradlew, но по умолчанию это не перенаправляется в вашу программу.

Вы хотите добавить это в свой build.gradle.kts:

 run { standardInput = System.`in` } 

Источники:
https://discuss.gradle.org/t/why-doesnt-system-in-read-block-when-im-using-gradle/3308/2
https://discuss.gradle.org/t/how-can-i-execute-a-java-application-that-asks-for-user-input/3264


На практике

Эти сборные конфигурации выглядят примерно одинаково для меня, но Groovy работает, а Kotlin этого не делает . Я начинаю думать, что Gradle Kotlin DSL еще не поддерживает standardInput версию: /

Грейдл в Котлине против Грейдл в Гровом

Вот моя рабочая версия Groovy, если это поможет:

 apply plugin: 'kotlin' apply plugin: 'application' buildscript { ext.kotlin_version = '1.1.4' repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } repositories { jcenter() } dependencies { // api => exported to consumers (found on their compile classpath) // implementation => used internally (not exposed to consumers) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } mainClassName = "samples.HelloWorldKt" run { standardInput = System.in } 
Intereting Posts