Hi Daniel,

there is a reasonable solution for your problem. I need to do some polishing and commenting. I will post it during the next couple of hours.

- Hans

On May 26, 2009, at 4:49 PM, Daniel wrote:

Ok, I have been trying to confine all the nasty details of that Jython artifact handling thing.

But I'm stuck in Gradle. Below is an annotated version of what I have been trying to get working. I tried to confine everything to one task to not have all the details spread through the build code. If I have to structure it differently, please tell me. Also, I'm pretty sure that I have a boatload of things that could be coded neater, but I lack the knowledge to make it smooth. Also the current problem is, even if I get past the Ivy cached resolutions, Ivy uses the sourceforge resolver, and can actually download something (an error page), which then fails to work, obviously).


I also tried to solve the problem with a custom IvyResolver, but the resolver code is pretty involved, and I'm not sure where I have to plug in (on stackoverflow.com: http://stackoverflow.com/questions/908371/apache-ivy-resolving-dependencies-embedded-in-an-installer )

Thanks in advance for any help, it's deeply appreciated



task getJython << {
    try {
// TODO I don't think that this here actually works, because if the resolution
        // has failed then it will not try to resolve again?
        configurations.jython.resolve()
throw new StopExecutionException() // abort this task, since we already have the libs
    }
    catch (InvalidUserDataException e) {
        println "Jython is not installed"
    }
    // Get the version of the jython runtime
    assert configurations.jython.dependencies.size() == 1
    configurations.jython.dependencies.each { dep ->
        jythonVersion = dep.version
    }

    // download the installer
    configurations {
        jythonInstaller
    }
dependencies.jythonInstaller "jython:jython_installer:$ {jythonVersion}"
    repositories {
        add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "python_sf" // For non standard resolvers the name is required addArtifactPattern("http://downloads.sourceforge.net/ [organisation]/[artifact]-[revision].[ext]")
        }
    }
    configurations.jythonInstaller.resolve()


    // get the location of the install on the disk
    assert configurations.jythonInstaller.dependencies.size() == 1
File installerFile = configurations.jythonInstaller.files.toList()[0]

    // create temp dir to expand the installer into
tmpDir = new File(System.properties['java.io.tmpdir'], "jython-$ {System.currentTimeMillis()}")
    ant.mkdir(dir: tmpDir.path)
    //tmpDir.deleteOnExit() // cleanup after we're done

    // run the installer
    ant.java(jar: installerFile.path, fork: true) {
            arg(value: '--silent')
            arg(value: '--directory')
            arg(value: tmpDir.path)
            arg(value: '--type')
            arg(value: 'standalone')
//arg(value: '--verbose') // no effect when used called here.
        }
    // results in a jython.jar in the given location
    // create a flatDir resolver and resolve the artifact to be
    // included in the cache...
    repositories {
        flatDir(name: 'jythonTemp', dirs: tmpDir.path)

        jythonTemp.addArtifactPattern("$tmpDir/[artifact].[ext]")

    }
    configurations.jython.resolve()

    // finished, we should now have everything in place
// TODO can we clean the dependencies and repositories from the temporary introduced
    // ones somehow?
}



2009/5/26 Daniel <[email protected]>


On Tue, May 26, 2009 at 2:19 AM, Hans Dockter <[email protected]> wrote:

On May 25, 2009, at 7:54 PM, Luke Taylor wrote:

You can use the ant support, for example:

task getJython << {
ant.get(src: 'http://downloads.sourceforge.net/jython/jython_installer-2.5rc2.jar' , dest: 'jython-installer.jar')
}

Alternatively you could use the Gradle dependency management.

configurations {
       jython
}

dependencies {
       jython "jython:jython_installer:2.5rc2"
}

repositories {
       add(new org.apache.ivy.plugins.resolver.URLResolver()) {
name = "python_sf" // For non standard resolvers the name is required addArtifactPattern("http://downloads.sourceforge.net/ [organisation]/[artifact]-[revision].[ext]")
       }
}

task resolve << {
       println configurations.jython.resolve()
}

This will of course also cache the jython jar automatically.

In the future we will provide our own domain objects for repositories. ATM you have to use the native Ivy ones.

Very cool, that's what I'm actually just tinkering with.

What I'm currently toying with is the following workflow

( is this an 'init' task?)
- create dependency on jython (jython.jar and jython-lib.jar, or together?) - create an adhoc resolver for Ivy that downloads the Jython Jar if the appropriate version is not found

    - run on top of jython (delegate) from here
    - create zc.buildout (setuptools) execution point
- execute zc.buildout (dependencies) to download eggs into local cache (build dir?)
    - bind from gradle to buildout
    (zc.buildout can be under the covers (assemble the config))
- if requested explicitly, bind the script points to tasks (prefixed with taskname-), so they can be executed.


this eventually would end in a Jython plugin. If you give me some pointers, I'd actually try to tackle this.

What I have in mind eventually is to have something similar like the Buildr hack from Daniel Spiewak, to support interactive shells with the full dependency path.

I'm in coding mood, but I'm in unknown terrain. Any pointers appreciated...

[1] http://www.codecommit.com/blog/java/hacking-buildr-interactive-shell-support
[2] http://github.com/djspiewak/buildr/tree/interactive-shell



- Hans

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





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

  http://xircles.codehaus.org/manage_email











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

   http://xircles.codehaus.org/manage_email


Reply via email to