2013-05-31 28 views
32

Tôi có một tập tin rất đơn giản build.gradle với nội dung sau:Run nhiệm vụ trước khi biên dịch sử dụng Android Gradle Plugin

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.1' 
    } 
} 

apply plugin: 'android' 

android { 
    buildToolsVersion "17.0.0" 
    compileSdkVersion 17 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 
    } 
} 

task generateSources { 
    doFirst { 
     def script = "python GenerateSources.py".execute() 
     script.in.eachLine {line -> println line} 
     script.err.eachLine {line -> println "ERROR: " + line} 
     script.waitFor() 
    } 
} 

Những gì tôi muốn là chạy generateSources nhiệm vụ trước khi biên dịch java được bắt đầu. Tôi tìm thấy một số giải pháp làm thế nào để làm điều đó, như compileJava.dependsOn("generateSources"), nhưng tiếc là họ đưa ra một lỗi:

A problem occurred evaluating root project 'Android'. 
> Could not find property 'compileJava' on root project 'Android'. 

Tôi không biết Gradle và không thể hiểu những gì xảy ra với mã này. Vì vậy, tôi muốn biết làm thế nào tôi có thể sửa lỗi này.

+0

Tôi nghĩ trong chủ đề này, bạn sẽ tìm thấy giải pháp [assembleRelease nhiệm vụ phụ thuộc - Yêu cầu mật khẩu keystore] [1] [1]: http://stackoverflow.com/questions/17144878/ assemblerelease-task-dependency-ask-for-keystore-password – skyrylyuk

Trả lời

22

Cách thích hợp để chạy một nhiệm vụ trước khi Java biên soạn trên Android là tạo một tác vụ biên dịch cho mỗi biến thể phụ thuộc vào nhiệm vụ của bạn.

afterEvaluate { 
    android.applicationVariants.all { variant -> 
    variant.javaCompiler.dependsOn(generateSources) 
    } 
} 
+0

Bạn đang gọi công việc tùy chỉnh của mình ở đâu? –

+1

'generateSources' là tác vụ tùy chỉnh. Và các nhiệm vụ 'javaCompiler' trở nên phụ thuộc vào' generateSources'. – Michael

+0

Tôi gặp lỗi: ** Không thể tìm thấy thuộc tính 'android' trên dự án gốc ** –

27

Rõ ràng, plugin android không thêm tác vụ compileJava (như plugin java sẽ). Bạn có thể kiểm tra xem các tác vụ nào có sẵn với gradle tasks --all và chọn tác vụ phù hợp với khai báo phụ thuộc (nếu không chính xác) của bạn.

EDIT:

Rõ ràng, các plugin android trì hoãn tạo ra các nhiệm vụ theo cách như vậy mà họ không thể được truy cập háo hức như bình thường. Một cách để khắc phục vấn đề này là để trì hoãn việc truy cập cho đến khi kết thúc giai đoạn cấu hình:

gradle.projectsEvaluated { 
    compileJava.dependsOn(generateSources) 
} 

Cơ hội được rằng có một cách thành ngữ hơn để giải quyết trường hợp sử dụng của bạn, nhưng nhanh chóng duyệt Android plugin docs Tôi couldn' t tìm thấy một.

+0

Tôi đã cố gắng làm điều đó, nhưng nó cũng không hoạt động. – Michael

+0

Điều gì không hiệu quả và thông báo lỗi chính xác là gì? –

+2

Vấn đề là giống như trước: 'Không thể tìm thấy thuộc tính 'compileDebug' trên dự án gốc 'Android'.' – Michael

10

Bạn có thể xem thực hiện tác vụ trong tác vụ chạy thiết bị đầu cuối ví dụ gradle assemble. Hãy thử cái này, nó được bắt đầu thực tế trước mọi thứ.

gradle.projectsEvaluated { 
    preBuild.dependsOn(generateSources) 
} 

Sửa, điều này có thể không hoạt động trong Android Studio, như Android Gradle DSL không có một phương pháp projectsEvaluated.

+0

Cái gì? Tôi gặp lỗi: ** Không thể tìm thấy thuộc tính 'preBuild' trên dự án gốc ** –

+0

Vì vậy, có lẽ nó không tồn tại trên các phiên bản mới hơn của Gradle – zest

+0

Đã bao giờ tồn tại trong Android Studio chưa? Hay bạn thường nói về Gradle ... –

2

Hãy thử điều này:

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.1' 
    } 
} 

apply plugin: 'android' 

android { 
    buildToolsVersion "17.0.0" 
    compileSdkVersion 17 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 
    } 
} 

task generateSources { 
    def script = "python GenerateSources.py".execute() 
    script.in.eachLine {line -> println line} 
    script.err.eachLine {line -> println "ERROR: " + line} 
    script.waitFor() 
} 

project.afterEvaluate { 
    preBuild.dependsOn generateSources 
} 

clean.dependsOn generateSources 
clean.mustRunAfter generateSources 

Hai dòng cuối cùng là tùy chọn - họ sẽ gọi "generateSources" nhiệm vụ khi thực hiện một gradle sạch

+0

Tôi gặp lỗi: ** Không thể tìm thấy thuộc tính 'preBuild' trên dự án ': app' ** –

1

Đối với những người có dự án nhiều dự án và cần chạy nhiệm vụ cho mỗi dự án trước khi chúng được xây dựng (nhưng cũng nên ok nếu bạn chỉ có dự án ứng dụng), bạn có thể viết tác vụ trong tập lệnh cấu hình gốc xây dựng bên trong việc đóng cửa allprojects và thực hiện tác vụ ngay tại đó.

Trong dự án gốc build.gradle:

allprojects { 
    repositories { 
     // ... 
    } 
    // ... 
    task mytask { 
     doFirst { 
      println project.projectDir.name 
     } 
    } 
    mytask.execute() 
} 

Nó sẽ được thực hiện cho mỗi build biến là tốt.

Gradle 4.1

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