2014-06-15 14 views
6

Mam prosty skrypt kompilacji Gradle do kompilowania i pakowania (podobnie do wtyczki aplikacji) mojej aplikacji Java. Jedyne, czego nie osiągam, to zastąpienie bieżącego numeru wersji w prostym pliku .properties.Projekt Gradle java zastępuje pojedynczą linię w pliku podczas kompilacji

Utworzono plik "src/main/resources/app-info.properties" z pojedynczą linią "application.version = @ version @". Nie Chcę zastąpić ten ciąg wersji za każdym razem, gdy plik jest kopiowany do folderu kompilacji (wydaje się, że dzieje się to podczas zadania kompilacji).

Próbowałem już prostego rozwiązania z mrówkami ReplaceTokens. Ten zastąpił wersję, ale także złamał moje pliki .png w zasobach ..

Czy istnieje proste rozwiązanie, aby po prostu zamienić tokeny w jednym pliku podczas budowania zadania (lub jakiekolwiek inne zadanie obsługuje kopiowanie do folderu kompilacji)?

Dziękuję za pomoc! Ben

====== Edycja oparta na komentarz z Opal =====

oparciu o podpowiedź Dodałem następujące:

import org.apache.tools.ant.filters.ReplaceTokens 
// ... 
build { 
    from('src/main/resources') { 
     include '*.properties' 
     filter(ReplaceTokens, tokens: [version : project.version]) 
    } 
} 

Które generuje ten błąd:

Could not find method from() for arguments [src/main/resources, [email protected]] on root project

Wygląda na to, że mam złe zadanie?

====== Edycja za kompletność dodanie roztworu na podstawie Opals sugerują =====

Dzięki stary, po to roztwór roboczy!

processResources { 
    from('src/main/resources') { 
     include '*.properties' 
     filter(ReplaceTokens, tokens: [version : project.version]) 
    } 
} 

Odpowiedz

7

Książki i blogi, w tym odpowiedź od Opala, wszystkie polecają użycie żywej mieszaniny exclude/include, from() i filter(). I oczywiście, tak ja na mojej pierwszej próbie zastąpienia tekstu {{app javascript library}} w pliku do ścieżki biblioteki JavaScript którym zależało na prostym otoczeniu nieruchomości projekt index.html.

Problem, który mnie uderzył, polegał na tym, że moje zadanie "wojenne" stworzyło powielone pliki index.html w archiwum wojennym i pozbycie się problemu, korzystając z opisanego wcześniej schematu, spowodowało jeden wielki nieczytelny hack.

Potem znalazłem bardzo prosty rozwiązanie do przodu.Poniższy przykład pochodzi z mojego własnego skryptu kompilacji i musisz go trochę dostosować do swoich potrzeb:

war { 
    eachFile { copyDetails -> 
     if (copyDetails.path == 'index.html') { 
      filter { line -> 
       line.replace('{{app javascript library}}', "lib/someLib.js") 
      } 
     } 
    } 
} 
3

Wklej przykładowy kod. To, co musisz zrobić, to: to plik do wymiany i wykluczyć inne pliki z wymiany. Here to przykład użycia. Wyszukaj ReplaceTokens, a zobaczysz, o czym mówię.

Musisz dodać filtrowanie do zadania processResources. Przykładowy kod:

processResources { 

    def profile = project.properties['profile'] 

    def replace_tokens = profile ? filter_tokens[profile] : filter_tokens['default'] 

    exclude '**/log4j-test.xml' 

    from('src/main/resources') { 
     exclude '**/*.ttf' 
     filter(ReplaceTokens, tokens: replace_tokens) 
    } 

    from('src/main/resources') { 
     include '**/*.ttf' 
    } 
} 

Przede ttf (binarne) pliki są wykluczone z filtrowania ale kopiowane. replace_tokens to filtr pobrany z mapy zdefiniowanej w innej części skryptu.

+0

Niestety, obecnie nie ma przykładowego kodu, ponieważ nie mam rozwiązania, aby zastąpić linię. Zgodnie z opisem chcę tylko zamienić niektóre tokeny w pliku zasobów, który ** jest ** już skopiowany przez wtyczkę Java (pomyśl o zadaniu kompilacji). Więc myślisz, że metoda kopiowania pomoże tutaj? – Ben