2016-07-06 48 views
0

我從gradle構建中打包了我的構建文物。這是一個Android Studio項目。通過傳遞參數重命名gradle中的文件

我有成功創建一個包含兩個罐子的zip文件的任務。假設該zip文件被稱爲'my.zip'。

我有以下gradle這個任務:

task renameArtifacts (type: Copy) { 
    from ('build/') 
    include 'my.zip' 
    destinationDir file('build/') 
    doLast { 
     println "my-${versionString}.zip" 
     rename('build/my.zip', "build/my-${versionString}.zip") 
    } 
} 

我正與gradle -PversionString="123" :sdk:renameArtifacts

調用它我在doLast關閉一個println,可以看到我的串插工作正常,因爲它輸出my-123.zip

但是,'my.zip'未重命名爲'my-123.zip'。它仍然爲'my.zip',實際上會生成一個大小爲零字節的文件,並且不再可以作爲zip文件打開。

我很明顯會出錯,但是在哪裏?

完全gradle這個文件:

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     minSdkVersion 14 
     targetSdkVersion 14 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:support-v4:22.2.0' 
    compile files('libs/urbanairship-lib-3.1.0.jar') 
    compile files('libs/jackson-annotations-2.2.2.jar') 
    compile files('libs/jackson-core-2.2.2.jar') 
    compile files('libs/jackson-databind-2.2.2.jar') 
} 

task updateVersionNumber() << { 
    ant.replace(file: 'src/main/java/com/my/Version.java', token: '{{VERSION}}', value: versionString) 
} 

task javadoc(type: Javadoc) { 
    source = android.sourceSets.main.java.srcDirs 
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) 
    destinationDir = file("build/javadoc") 
    failOnError false 
} 

task createJavaDocJar(type: Jar) { 
    from ('build/javadoc') 
    destinationDir file('build') 
    baseName = 'my_doc' 
} 
createJavaDocJar.dependsOn(javadoc) 

task packageMyJarAndDependencies(type: Jar) { 
    from (zipTree('libs/jackson-annotations-2.2.2.jar')) { 
     exclude 'META-INF/maven/' 
     exclude 'META-INF/services/' 
    } 
    from (zipTree('libs/jackson-core-2.2.2.jar')) { 
     exclude 'META-INF/maven/' 
     exclude 'META-INF/services/' 
    } 
    from (zipTree('libs/jackson-databind-2.2.2.jar')) { 
     exclude 'META-INF/maven/' 
     exclude 'META-INF/services/' 
    } 
    from (zipTree('libs/urbanairship-lib-3.1.0.jar')) 
    from (zipTree('build/intermediates/bundles/release/classes.jar')) 
} 

task createFinalJar(type: Copy) { 
    from('build/libs/') 
    into('build') 
    include('sdk.jar') 
    rename('sdk.jar', 'my.jar') 
} 
createFinalJar.dependsOn(clean, build, packageMyJarAndDependencies) 
packageMyJarAndDependencies.mustRunAfter build 
build.mustRunAfter clean 

task zipArtifacts(type: Zip) { 
    from ('build/') 
    from ('build/libs') 
    include 'my_doc.jar' 
    include 'my.jar' 
    baseName = 'my_lib' 
    destinationDir file('build') 
} 
zipArtifacts.dependsOn(createFinalJar, createJavaDocJar) 

task renameArtifacts (type: Copy) { 
    from ('build/') 
    into('build') 
    include 'my_lib.zip' 
    doLast { 
     println "my_lib-${versionString}.zip" 
     rename "my_lib.zip", "my_lib-${versionString}.zip" 
    } 
} 
renameArtifacts.dependsOn(zipArtifacts) 
+0

試試這個:任務myjar這一(類型:罐) 文物{ 檔案myjar這一 }要注意,你所創建的自定義檔案作爲構建的一部分,不會自動分配到任何配置是很重要的。你必須明確地做這個任務。 – PN10

+0

我不明白。我只是想重命名文件 – barry

+0

請發佈您的build.gradle文件 – PN10

回答

1

renameCopyProcessingSpec的方法,即配置在操作執行一些的重命名的任務。如果將其包裝在doLast中,則複製已經發生,並且不會執行重命名。此外,重命名只接收文件名,而不是相對或絕對文件路徑。這應該工作:

project.ext.versionString = versionString 
task renameArtifacts (type: Copy) { 
    from ('build/') 
    include 'my.zip' 
    destinationDir file('build/') 
    rename 'my.zip', "my-${project.versionString}.zip" 
} 

編輯:$ versionString不能在任務中訪問。如何使用額外的項目屬性是建議的方式(見here)。

+0

好吧,理解。但是我嘗試doLast方法的原因是否則我得到「無法找到屬性'versionString'在任務':sdk:renameArtifacts'」。我在命令行上傳遞了versionString,如:gradle -PversionString =「123」:sdk:renameArtifacts – barry

+0

那麼我如何訪問傳入的versionString參數呢? – barry

+0

查看編輯答案。 – majk