2015-08-07 3 views
1

Я пытаюсь заменить файл в моей папке ресурсов (src/main/resources) новым файлом, сгенерированным скриптом сборки Gradle. У меня возникли проблемы с этим; исключение, похоже, запоминается и предотвращает добавление моего нового файла.Заменить файл в Gradle Build

Вот краткий пример, иллюстрирующий поведение.

Структура проекта:

TestProject 
-- src/main/java 
---- entry 
------ EntryPoint.java 
---- run 
------ HelloWorldTest.java 
-- src/main/resources 
---- test.properties // FILE TO REPLACE 

test.properties содержание в SRC/основные/ресурсы:

Wrong File with extra text to make it obvious which one is being put into the jar based on size

build.gradle:

apply plugin: 'java' 

task makeProp { 
    def propDir = new File(buildDir, "props") 
    ext.propFile = new File(propDir, "test.properties") 
    outputs.file propFile 

    doLast { 
     propDir.mkdirs() 
     propFile.createNewFile() 
     propFile.withWriter('utf-8') { writer -> 
      writer.writeLine 'Right File' 
     } 
    } 
} 

jar { 
    dependsOn('makeProp') 

    if (project.hasProperty('testExclude')) { 
     sourceSets { 
      exclude('test.properties') 
     } 
    } 

    from (makeProp.propFile) { 
     into '/' 
    } 
} 

JAR содержание ./gradlew build (оба файла включены):

Archive: TestProject.jar 
    Length  Date Time Name 
-------- ---- ---- ---- 
     0 08-07-15 14:27 META-INF/ 
     25 08-07-15 14:27 META-INF/MANIFEST.MF 
     0 08-07-15 13:50 run/ 
     499 08-07-15 13:50 run/HelloWorldTest.class 
     0 08-07-15 13:50 entry/ 
    1413 08-07-15 13:50 entry/EntryPoint.class 
     95 08-07-15 14:27 test.properties 
     11 08-07-15 14:03 test.properties 
--------     ------- 
    2043     8 files 

JAR содержание ./gradlew build -PtestExclude (ни файл):

Archive: TestProject.jar 
    Length  Date Time Name 
-------- ---- ---- ---- 
     0 08-07-15 14:29 META-INF/ 
     25 08-07-15 14:29 META-INF/MANIFEST.MF 
     0 08-07-15 13:50 run/ 
     499 08-07-15 13:50 run/HelloWorldTest.class 
     0 08-07-15 13:50 entry/ 
    1413 08-07-15 13:50 entry/EntryPoint.class 
--------     ------- 
    1937     6 files 

ответ

1

Я сделал что-то очень похожее, и это то, что сработало для меня. Основная цель - убедиться, что задача выполняется до создания баннера и обработки ваших файлов. Попробуйте это.

// create a properties file add it to folder preprocessing 
    task propertiesFile << { 
     // 
     description 'Dynamically creates a properties file.' 

     // needed for the first pass 
     def folder = project.file('src/main/resources'); 
     if(!folder.exists()){ 
      folder.mkdirs() 
     } 

     //write it to a propertiess file 
     def props = project.file('src/main/resources/test.properties') 
     props.delete() 
     props << 'write this to my file!!!!' 

    } 

    processResources.dependsOn propertiesFile 
+0

Я закончил тем, что делал что-то похожее на это. Я воспринял это как ответ, с моим собственным, чтобы следовать. Я надеялся, что будет более прямое решение, чем необходимость в основном работать над их механизмом исключения, но я уверен, что должна быть какая-то рациональная причина для механизма, работающего так, как он делает, что начинающий новичок, как я, не может думать из. – Ironcache

1

Дело в том, что исключения модели для Gradle SourceSet распространяются на все включены пути и не только к определенным путям. Поэтому в вашем примере выше все файлы с именем test.properties будут исключены, независимо от их местоположения.

Что вы можете сделать, это установить по умолчанию test.properties, расположенный где-то в другом месте, и сделать копию сборки/сгенерировать соответствующую версию на основе сценария.

1

Решение, которое я пошел с в конце концов, был похож на то, что было опубликовано Пампхаус, но вместо того, чтобы удалить файл, я переименовал его имя темп, исключен, что имя временного, и переименовал его, как только я был (мне нужно было сохранить содержимое и положение файла после завершения сборки).

Модифицированный build.gradle:

apply plugin: 'java' 

def props = project.file('src/main/resources/test.properties') 
def temp = project.file('src/main/resources/temp.properties') 

task makeProp { 
    ... // Unchanged 
} 

jar { 
    dependsOn('makeProp') 

    // Move the properties file to a temp location 
    props.renameTo(temp) // This returns a boolean; can perform conditional checks. 

    // Exclude the temp file 
    if (project.hasProperty('testExclude')) { 
     sourceSets { 
      exclude('temp.properties') 
     } 
    } 

    // Insert the right prop file 
    from (makeProp.propFile) { 
     into '/' 
    } 
} 
jar << { 
    // Restore the temp file 
    temp.renameTo(props) 
}