2013-06-12 43 views
8

OK, tôi đã xem video trên YouTube bằng Xavier Ducrohet trên Android build system mới. Tôi thậm chí đã chuyển sang sử dụng Android Studio và hài lòng với nó. Bây giờ tôi cần phải tùy chỉnh các quy tắc xây dựng để làm những việc theo cách tôi muốn và một trong số đó tự động đặt codeVersioncodeName trong tệp kê khai.Android Studio Lập trình Gradle

Xavier hiển thị khi bắt đầu làm thế nào để làm điều này trong một trong slide của mình:

def getVersionCode() { 
    def code = ... 
    return code 
} 

android { 
    defaultConfig { 
     versionCode getVersionCode() 
    } 
} 

Vì vậy, có thể có một ai đó loại như vậy để chỉ cho tôi nguồn lực tốt cho điền vào các dấu chấm?

Để cụ thể hơn, tôi muốn chạy tập lệnh như git describe --dirty | sed -e 's/^v//' để xác định versionNamegit tag | grep -c ^v để nhận được versionCode.

Cảm ơn

Cập nhật

Tôi đã thử những điều sau gradle.build kịch bản nhưng không thành công. Nó xây dựng tốt nhưng tên phiên bản trong trang Thông tin ứng dụng của các ứng dụng đã cài đặt của tôi không thay đổi.

task getVersionName(type:Exec) { 
    commandLine '../scripts/version-name.sh' 

    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    //extension method stopTomcat.output() can be used to obtain the output: 
    ext.output = { 
    return standardOutput.toString() 
    } 
} 

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile project(':Common') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 16 

     versionName getVersionName() 
    } 
} 

Nếu tôi thay thế các cấu hình versionName getVersionName() với versionName 'Some Text' sau đó nó hoạt động và tên xây dựng trở thành Some Text trong Thông tin App. Vậy tại sao hàm getVersionName của tôi không hoạt động?

Cập nhật 2

Vẫn không làm việc - nhưng hầu như!

Shell script:

#/bin/bash 

NAME=`git describe --dirty | sed -e 's/^v//'` 
COMMITS=`echo ${NAME} | sed -e 's/[0-9\.]*//'` 

if [ "x${COMMITS}x" = "xx" ] ; then 

    VERSION="${NAME}" 

else 

    BRANCH=" (`git branch | grep "^\*" | sed -e 's/^..//'`)" 
    VERSION="${NAME}${BRANCH}" 

fi 

logger "Build version: ${VERSION}" 

echo ${VERSION} 

này hoạt động, và dòng nhật ký khẳng định rằng kịch bản được gọi là nhiều lần khi thực hiện dự án. Nhưng tên phiên bản vẫn đang trống. Tôi nghi ngờ rằng đó là bên Gradle của những thứ mà vẫn không nhận được stdout.

task getVersionCode(type: Exec) { 
    exec { commandLine '../scripts/version-code.sh' } 

    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    ext.output = { 
     return standardOutput.toString() 
    } 
} 

task getVersionName(type: Exec) { 
    exec { commandLine '../scripts/grMobile/scripts/version-name.sh' } 

    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    ext.output = { 
     return standardOutput.toString() 
    } 
} 

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile project(':Common') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 16 

     versionCode getVersionCode() 
     versionName getVersionName.output() 
    } 
} 
+0

Có thể bạn sẽ phải bao bọc nó trong một kịch bản trình bao và sau đó bắt đầu ra. Tham khảo tại đây: http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html –

+0

@Dhrubajyoti Rất cám ơn vì đề xuất này. Tôi đã thử nó, xem ở trên nhưng vẫn còn một cái gì đó về Gradle kịch bản mà tôi không nhận được. – Dobbo

Trả lời

2

Sau khi khám phá xung quanh, cuối cùng tôi đã tìm được giải pháp cho việc này.

Groovy, ngôn ngữ của tệp build.gradle, cho phép các lệnh dễ dàng chạy. Đây là giải pháp:

def buildCode 
    = file("../scripts/version-code.sh") 
     .toString().execute().text.trim().toInteger() 
def buildName 
    = file("../scripts/version-name.sh") 
      toString().execute().text.trim() 

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile files('libs/android-support-v4.jar') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 12 
     targetSdkVersion 16 

     versionCode buildCode 
     versionName buildName 
    } 
} 

tệp() nên được sử dụng để tham chiếu tất cả tệp trong Gradle.

"<some-command".execute() sẽ chạy lệnh và .text cung cấp cho bạn quyền truy cập đơn giản vào stdout. Tôi tìm thấy tôi cần chạy trim() để xóa bỏ dấu sau. Tôi cho rằng tôi có thể đã sử dụng echo -n ${VERSION} trong kịch bản của mình, nhưng tôi nghĩ phương thức trim() là tốt hơn vì nó cho phép tập lệnh được chạy từ dòng lệnh.

Tập lệnh xây dựng chỉ đếm số thẻ phát hành từ git. Như tôi thẻ phát hành của tôi trong các hình thức: 'v' <major-no> '.' <minor-no> [ '.' <bug-fix> ] nó chỉ có thể các thẻ bắt đầu bằng một chữ thường 'v' tiếp theo bất kỳ chữ số:

#/bin/bash 

git tag | grep -c ^v[0-9] 

Trước khi bạn xây dựng với cấu hình này bạn đừng quên tạo ít nhất một thẻ phát hành. Tôi gắn thẻ ngay tại thời điểm bắt đầu dự án theo cách sau:

$ git tag -m "Start of development" v0.0 
0

Bạn đã bỏ lỡ các nhận xét mẫu. versionName getVersionName.output() sẽ hoạt động.

CHỈNH SỬA: Thay đổi mã tác vụ của bạn thành các mục sau.

task getVersionName(type:Exec) { 
    exec { commandLine '../scripts/version-name.sh' } 

    ... 
} 

Tôi cũng mới học xong, có vẻ như họ có một số lỗi hoặc tài liệu còn thiếu. Vì mã bạn đã thử là chính xác từ mẫu, có sẵn trong tài liệu.

+0

Cảm ơn @Dhrubajyoti, phiên bảnName bây giờ đã được thay thế để sửa lỗi này dường như đang hoạt động. Tuy nhiên, văn bản được thay thế trống. Có gì sai với kịch bản của tôi không. Thay thế dòng lệnh bằng "pwd" cũng tạo ra một tên phiên bản trống. – Dobbo

+0

@Dobbo Vui lòng kiểm tra EDIT –

+0

Cảm ơn sự giúp đỡ của bạn cho đến nay. Tôi phải thực sự gần ngay bây giờ. Nhưng tôi vẫn không nhận được đầu ra. Tôi sẽ biết ơn nếu bạn nhìn vào "Bản cập nhật 2" và cho tôi biết bạn nghĩ gì là sai. – Dobbo

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