Kotlin y Gradle – Lectura desde stdio

Estoy tratando de ejecutar mi class Kotlin usando el command:

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

Aquí está mi class HelloWorld.kt :

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

Aquí está mi build.gradle.kts :

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

El código se ejecuta, pero los datos contenidos en el file input.txt no se muestran. Aquí está la salida que obtengo:

 Hello, world! null 

Quiero poder ejecutar el command gradlew anterior y la secuencia de input.txt se networkingirige a stdio. Puedo hacer eso fácilmente en C ++. Una vez que compilo mi file .cpp, puedo ejecutar:

 ./my_code < input.txt 

y se ejecuta como se esperaba

¿Cómo puedo lograr lo mismo con Kotlin y Gradle?

Actualización : Basado en esta respuesta , intenté agregar esto a build.gradle.kts pero no es una syntax válida:

enter image description here

La sugerencia de AjahnCharles sobre la run { standardInput = System.in } es correcta, pero para portarla a kotlin-dsl necesita una syntax diferente. run en este caso es el nombre de la tarea y configurar la tarea existente del complemento de la application . Para configurar la tarea existente en kotlin-dsl debe usar una de estas maneras:

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

o

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

La próxima versión de Gradle 4.3 debería proporcionar API para que los escritores de plugins lean la input del usuario.

El motivo de la diferencia entre Groovy y Kotlin en este caso es que Groovy usa types dynamics, pero en Kotlin debe especificar el tipo de tarea para que tenga autocompletado y solo para comstackr el script de configuration.

Casi, pero esto no funciona: '(

En teoria

Entiendo que: < input.txt establece la input estándar para el process gradlew, pero por defecto esto no se reenvía a su progtwig.

Desea agregar esto a su build.gradle.kts:

 run { standardInput = System.`in` } 

Fuentes:
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


En la práctica

Estas configuraciones de compilation parecen iguales para mí, pero Groovy funciona y Kotlin no . Estoy empezando a pensar que el DSL de Gradle Kotlin aún no es compatible con el término standardInput : /

Gradle en Kotlin vs Gradle en Groovy

Aquí está mi versión Groovy de trabajo si eso es de alguna ayuda:

 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 }