W ramach mojego projektu muszę odczytać pliki z katalogu i wykonać kilka operacji w skrypcie kompilacji. Dla każdego pliku operacja jest taka sama (odczytywanie niektórych zapytań sql i wykonywanie ich). Myślę, że to powtarzalne zadanie i lepiej jest pisać wewnątrz metody. Ponieważ jestem nowy w gradle, nie wiem, jak powinno być. Proszę pomóż.
79
Odpowiedzi:
Jedno podejście podane poniżej:
ext.myMethod = { param1, param2 -> // Method body here }
Zauważ, że zostanie to utworzone dla zakresu projektu, tj. globalnie dostępne dla projektu, które można wywołać w następujący sposób w dowolnym miejscu skryptu kompilacji, przy użyciu
myMethod(p1, p2)
którego jest odpowiednikiemproject.myMethod(p1, p2)
Metodę można również zdefiniować w różnych zakresach, na przykład w zadaniach:
task myTask { ext.myMethod = { param1, param2 -> // Method body here } doLast { myMethod(p1, p2) // This will resolve 'myMethod' defined in task } }
źródło
ext
, zakres jest ograniczony do miejsca, w którym jest zdefiniowany, tj. jeśli jest zdefiniowana w zadaniu, jest lokalna dla zadania. Działa to za pośrednictwem jednostek (takich jak projekt, zadanie itp.), Które implementują ExtensionAware . Dodaje to ExtraPropertiesExtension, który jest konfigurowany za pomocąext
dyrektywy.Jeśli zdefiniowałeś jakieś metody w jakimkolwiek innym pliku * .gradle - ext.method () udostępnia je w całym projekcie. Na przykład tutaj jest
// ext makes method callable project wide ext.getVersionName = { -> try { def branchout = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD' standardOutput = branchout } def branch = branchout.toString().trim() if (branch.equals("master")) { def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags' standardOutput = stdout } return stdout.toString().trim() } else { return branch; } } catch (ignored) { return null; } }
task showVersion << { // Use inherited method println 'VersionName: ' + getVersionName() }
Bez formatu ext.method () metoda będzie dostępna tylko w zadeklarowanym pliku * .gradle. To samo dotyczy właściwości.
źródło
Możesz zdefiniować metody w następujący sposób:
// Define an extra property ext.srcDirName = 'src/java' // Define a method def getSrcDir(project) { return project.file(srcDirName) }
Więcej szczegółów można znaleźć w dokumentacji gradle Rozdział 62. Organizowanie logiki kompilacji
źródło
Przykład z obiektem root zawierającym metody.
hg.gradle plik:
ext.hg = [ cloneOrPull: { source, dest, branch -> if (!dest.isDirectory()) hg.clone(source, dest, branch) else hg.pull(dest) hg.update(dest, branch) }, clone: { source, dest, branch -> dest.mkdirs() exec { commandLine 'hg', 'clone', '--noupdate', source, dest.absolutePath } }, pull: { dest -> exec { workingDir dest.absolutePath commandLine 'hg', 'pull' } }, ]
build.gradle
apply from: 'hg.gradle' hg.clone('path/to/repo')
źródło
W jakiś sposób może dlatego, że minęło pięć lat od OP, ale żaden z
podejścia działają dla mnie. Zamiast tego wydaje się, że prosta definicja funkcji wykonuje zadanie w moim pliku gradle:
def retrieveEnvvar(String envvar_name) { if ( System.getenv(envvar_name) == "" ) { throw new InvalidUserDataException("\n\n\nPlease specify environment variable ${envvar_name}\n") } else { return System.getenv(envvar_name) } }
I nazywam to w innym miejscu mojego skryptu bez przedrostka, tj
retrieveEnvvar("APP_PASSWORD")
Jest rok 2020, więc używam Gradle 6.1.1.
źródło
@ether_joe - najczęściej głosowana odpowiedź przez @InvisibleArrow powyżej czyni pracę jednak należy zdefiniować metodę zadzwonić zanim to nazwać - czyli wcześniej w
build.gradle
pliku.Możesz zobaczyć przykład tutaj . Użyłem tego podejścia w Gradle 6.5 i działa.
źródło