2017-06-23 67 views
8

tôi xây dựng các bước sử dụng gradle xây dựng trong mẫu từ TeamCity nhưng tiếc là tôi nhận được:Biên soạn dự án Android với Kotlin trên TeamCity không

[16:29:22][:presentation:compileLocalDebugKotlin] Using kotlin incremental compilation 
[16:29:48][:presentation:compileLocalDebugKotlin] Compilation with Kotlin compile daemon was not successful 
[16:29:48][:presentation:compileLocalDebugKotlin] java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 
[16:29:48][:presentation:compileLocalDebugKotlin] java.io.EOFException 
[16:29:48][:presentation:compileLocalDebugKotlin] at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:229) 
[16:29:48][:presentation:compileLocalDebugKotlin] at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162) 

Bất kỳ ý tưởng về lý do tại sao tôi có thể có được điều này?

+1

hiển thị các tệp build.gradle của bạn, vui lòng – Lovis

+0

thật tuyệt vời. hai ngày sau khi bình luận về điều này tôi chạy vào cùng một vấn đề ... xem câu trả lời của tôi cho giải pháp của tôi – Lovis

Trả lời

3

Tôi đã gặp sự cố tương tự. Tuy nhiên, nó không được kết nối với Kotlin.

Tôi phải vô hiệu hóa deamon gradle (dù sao cũng không được đề xuất trên máy chủ CI).

Trong teamcity bạn có thể ví dụ: làm điều đó bằng cách thêm -Dorg.gradle.daemon=false vào biến môi trường GRADLE_OPTS.

Xem https://docs.gradle.org/current/userguide/gradle_daemon.html

+0

Điều này là chính xác. Cũng bắt đầu với Gradle 3.0, Gradle là daemon theo mặc định có nghĩa là KotlinCompileDaemon sẽ bám sát. –

+0

Lưu ý từ liên kết: Kể từ Gradle 3.0, chúng tôi bật Daemon theo mặc định và ** khuyên bạn nên sử dụng nó cho cả máy phát triển và máy chủ Tích hợp liên tục **. Tuy nhiên, nếu bạn nghi ngờ rằng Daemon làm cho CI của bạn xây dựng không ổn định, bạn có thể vô hiệu hóa nó để sử dụng thời gian chạy mới cho mỗi bản dựng vì thời gian chạy hoàn toàn tách biệt với bất kỳ bản dựng trước nào. –

+0

@lovis sẽ biến môi trường ghi đè các giá trị gradle.properties? Chúng tôi muốn kích hoạt daemon trong môi trường dev nhưng vô hiệu hóa nó trên máy chủ CI. –

1

Theo mặc định, trình biên dịch Kotlin thực hiện trong trình xử lý của chính nó. Vượt qua cấu hình này để Gradle khi chạy trên CI để biên dịch Kotlin trong cùng một quá trình xây dựng:

-Dkotlin.compiler.execution.strategy="in-process" 

Vô hiệu hóa daemon Gradle cũng là thực tế phổ biến trong môi trường CI:

-Dorg.gradle.daemon=false 

Người ta có thể hy vọng rằng các Gradle Thuộc tính daemon cũng sẽ vô hiệu hoá trình nền trình biên dịch của trình biên dịch Kotlin, nhưng đó không phải là những gì đang xảy ra. GradleKotlinCompilerRunner.kt chỉ xem xét thuộc tính org.gradle.daemonsau thuộc tính kotlin.compiler.execution.strategy. Nếu chiến lược thực hiện không được định nghĩa, các Á hậu sử dụng chiến lược "daemon" theo mặc định:

val executionStrategy = System.getProperty(KOTLIN_COMPILER_EXECUTION_STRATEGY_PROPERTY) ?: DAEMON_EXECUTION_STRATEGY 
if (executionStrategy == DAEMON_EXECUTION_STRATEGY) { 
    val daemonExitCode = compileWithDaemon(compilerClassName, compilerArgs, environment) 

    if (daemonExitCode != null) { 
     return daemonExitCode 
    } 
    else { 
     log.warn("Could not connect to kotlin daemon. Using fallback strategy.") 
    } 
} 

val isGradleDaemonUsed = System.getProperty("org.gradle.daemon")?.let(String::toBoolean) 
return if (executionStrategy == IN_PROCESS_EXECUTION_STRATEGY || isGradleDaemonUsed == false) { 
    compileInProcess(argsArray, compilerClassName, environment) 
} 
else { 
    compileOutOfProcess(argsArray, compilerClassName, environment) 
} 

Rõ ràng thiết lập các chiến lược thực hiện để "in-process" sẽ giúp bạn có được compileInProcess() không phụ thuộc vào cấu hình daemon Gradle, tuy nhiên, bạn có thể cần phải vô hiệu hóa cả hai daemon trên máy chủ CI.

Các vấn đề liên quan