On May 26, 2009, at 9:02 PM, Daniel wrote:

Oh, that was something that I was wondering about while browsing the code (and looking through the Scala Plugin patch): There's no actual reason to write plugins in Java, or is there?

At least not for custom plugins, except if there are performance issues. The Gradle core does implement all plugins in Java. The reason is that we want to have a pure Java core which can be used without Groovy. This gives us the possibility in the future to easily add build script engines for other languages (in particular Java).

- Hans



Cheers,
Daniel

On Wed, May 27, 2009 at 1:55 AM, Hans Dockter <[email protected]> wrote:

On May 25, 2009, at 3:05 PM, Helmut Denk wrote:


hi gradle-users,

i am just about to upgrade and improve my
http://www.nabble.com/common-resolver-setup-across-multiple-gradle-builds-to19570795.html
gradle-customization  and want to
share the results ... maybe get some feedback ;-)

here my gradle-build for a spring-web-mvc-project, that
uses custom-resolver-setup:


usePlugin('war')
usePlugin('groovy')
usePlugin('custom-repositories')

artifacts {
  archives war
}

dependencies {
  compile project(":www-services-common")
  compile 'javax.servlet:servlet-api:2.4'
  compile 'apache:commons-logging:1.1'
  compile 'org.springframework:spring:2.5.4'
  compile 'org.springframework:spring-webmvc:2.5.4'

  groovy 'org.codehaus.groovy:groovy-all:1.6.3'

  testCompile 'org.springframework:spring-test:2.5.4'
  testCompile 'org.gmock:gmock:0.8.0'
  testCompile 'org.hamcrest:hamcrest-core:1.1'
  testCompile 'org.hamcrest:hamcrest-library:1.1'
  testCompile 'junit:junit:3.8.1'
}


the 'usePlugin('custom-repositories')' tells gradle to use
mycompany.CustomRepositoriesPlugin, which adds Resolvers
to adapt our inhouse repository-infrastructure.

here is, what CustomRepositoriesPlugin.java does for
the classpathResolvers:


  public void apply(Project project, PluginRegistry pluginRegistry,
Map<String, ?> customValues) {
      ...
ResolverContainer classpathResolvers = project.getRepositories()
      classpathResolvers.add(localResolver);
      classpathResolvers.add(teamResolver);
      classpathResolvers.add(snapshotResolver);
      classpathResolvers.add(releasedResolver);
      classpathResolvers.add(thirdpartyResolver);
      ...
  }


here is what CustomRepositoriesPlugin.java does for
the uploadResolvers:


public void apply(Project project, PluginRegistry pluginRegistry,
Map<String, ?> customValues) {
       ...

       if (project.getTasks().findByName("uploadLibs") == null) {
               logger.info("setting up task uploadLibs ...");

               Configuration uploadConfiguration =
project.getConfigurations().findByName("archives");
               if (uploadConfiguration == null) {
throw new GradleException("Configuration 'archives' erwartet, wurde aber
nicht gefunden");
               }

               project.getTasks().add("uploadLibs", Upload.class);
               Upload uploadLibsTask = (Upload)
project.getTasks().findByName("uploadLibs");
               uploadLibsTask.setConfiguration(uploadConfiguration);

String deliverTo = (String) project.property("deliverTo"); ResolverContainer uploadResolvers = uploadLibsTask.getRepositories()
               if ("local".equals(deliverTo)) {
                   uploadResolvers.add(localResolver);
               } else if ("shared".equals(deliverTo)) {
                   uploadResolvers.add(sharedResolver);
               } else if ("snapshot".equals(deliverTo)) {
                   uploadResolvers.add(snapshotResolver);
               } else if ("released".equals(deliverTo)) {
                   uploadResolvers.add(releasedResolver);
               } else {
throw new GradleException("erlaubter Wert fuer Project-Property
'deliverTo' erwartet, aber war: " + deliverTo);
               }
       } else {
               logger.warn("task uploadLibs existiert bereits");
       }

       ...
}


as you see, i create a uploadLibs task for the project and add
a uploadResolver to it. but i am not sure, if this is a smart way
to achieve what i want ... if someone has a better idea, i am
all ears ...

Basically this is solid stuff in my opinion. Thanks for sharing this. But as soon as you want task creation based on parameter you might thing about the new Gradle 0.6 rule engine.

You could create a rule for the pattern upload<DeliverTo>

The the users can write:

gradle uploadLocal or gradle uploadShared, ...

Your rule would analyze the pattern and for unknown DeliverTool values it would do nothing and an UnknownTaskEx would be thrown.

See UG 12.7: http://gradle.org/0.6/docs/userguide/more_about_tasks.html#N10B02

Why are you writing your plugin in Java? If you would do it in Groovy it might make the code more expressive as you could use a more DSL'is way of doing things.




***

an issue, that i noticed and which was already discussed in
the mailinglist:

setScanForTestClasses does not work because i use gmock
and have some test-classes like this:


public class MyTests extends GMockTestCase {
...
}


i circumvent this by adding the following code
to the customization:


public void apply(Project project, PluginRegistry pluginRegistry,
Map<String, ?> customValues) {
       ...

       // set include/exclude-pattern für junit
       Test testTask = (Test) project.getTasks().findByName("test");
       if (testTask != null) {
               testTask.setScanForTestClasses(false);
               testTask.setStopAtFailuresOrErrors(false);
               testTask.include("**/*Test.class", "**/*Tests.class");
               testTask.exclude("**/Abstract*.class");
       }

       ...
}

This will be fixed in the soon to come 0.6.1 bug fix release.


- Hans

--
Hans Dockter
Gradle Project Manager
http://www.gradle.org





---------------------------------------------------------------------
To unsubscribe from this list, please visit:

  http://xircles.codehaus.org/manage_email




--
Hans Dockter
Gradle Project Manager
http://www.gradle.org





---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email


Reply via email to