2012-04-25 39 views
11

Mam kilka plików, które wymagają wymiany tokena .. zamiast domyślnego pojedynczego @, używają one podwójnego @ 's ... Potrzebuję rzeczy takich jak: @@ replacementeme @@ .. zastąpiony.Gradle - zmiana Token Początek/Koniec przy użyciu ReplaceTokens

ReplaceTokens filtr Ant pozwala na ustawienie go przy BeginToken/EndToken .. Chociaż nie jestem pewien, w jaki sposób skonfigurować go w moim przykładzie:

copy{ 
    into something 
    from somethingelse 
    filter(ReplaceTokens, tokens: []) 
} 

Jak mogę zmienić powyższy kod zastąpić prawidłowo pracować z podwójnym tokenem @@ zamiast pojedynczych?

Odpowiedz

11

Łatwo zmienić ograniczniki - po prostu dodaj nazwane parametry beginToken i endToken do wywołania metody filter. Jednak Ant's ReplaceTokens obsługuje tylko ograniczniki pojedynczego znaku. Szybkie wyszukiwanie w sieci nie spowodowało pojawienia się Ant FilterReader, która obsługuje dowolne separatory wieloliterowe po wyjęciu z pudełka. Alternatywą jest samodzielne zakodowanie tego kodu poprzez implementację FilterReader lub za pomocą metody bezpłatnej filter.

+2

Nice .. Przegapiłem brak wsparcia dla ograniczników nie znakowych, prawdopodobnie dlatego mój kod nie działa. – vicsz

10

Byłem w podobnej (nie dokładnej) sytuacji. Musiał przetworzyć zasoby testowe, które były w formacie maven. tj. format "$ {}".

Po przejściu na gradle zadanie processTestResources nie zastąpiło wartości w $ {}. Dzieje się tak z tego samego powodu, dla którego używa się pojedynczego znaku "@". Znalazłem hack, aby osiągnąć to, co chciałem.

configure(tasks.processTestResources) { 
    include '**/*.properties' 
    filter(ReplaceTokens, 
      tokens: ['$':'={'], beginToken : '=', endToken : '{') 
    filter(ReplaceTokens, 
      tokens: [project.properties], beginToken : '{', endToken : '}') 
} 
+1

Całkowicie hack-y i całkowicie działa! Używam sformatowanych tokenów **/\ * @ TOKEN @ \ */**, aby były poprawne w dowolnym miejscu w CSS/JS, a następujące elementy sprawdzają się: 'filter (org.apache.tools.ant. filters.ReplaceTokens, tokeny: ['*': '@'], beginToken: '/', endToken: '@') ' ' filtr (org.apache.tools.ant.filters.ReplaceTokens, tokeny: [' * ':' @ '], beginToken:' @ ', endToken:'/') ' – Tyler

0

Oto kolejne rozwiązanie. Użyj zadania kopiowania antywirusowego zamiast zadania kopiowania Gradle.

task copyWithMultiCharTokenMark << { 
    ant.copy(todir: 'copy_into_dir') { 
     fileset(dir: 'copy_from_dir') 
     filterset(begintoken:'@@', endtoken:'@@') { 
      filter(token:'replaceme', value:'Am I replaced?') 
     } 
    } 
} 

Znalazłem tę drogę podczas wyszukiwania obejścia problemu z kodowaniem plików z zadaniem kopiowania.

5

innych odpowiedzi wydają się być stare i donoszą, że nie można korzystać z multi-żeton postaci ograniczników. Ale okazało się, że już tak nie jest z Gradle 2.14.1

copy{ 
    into something 
    from somethingelse 
    filter(ReplaceTokens, tokens: [map], beginToken : '@@', endToken : '@@') 
    // or, maven prop stle: 
    // filter(ReplaceTokens, tokens: [map], beginToken : '${', endToken : '}') 

} 
+0

Potwierdzona praca dla mnie też. Dzięki. – coding

+0

To powinna być zaakceptowana odpowiedź, ponieważ jakakolwiek wersja wprowadziła zmianę, która dopuszczała delimetry inne niż pojedyncze znaki! – tom01

Powiązane problemy