Hey Hans,

On 3-Jun-08, at 1:24 PM, Hans Dockter wrote:

Hi Jayson,

On Jun 3, 2008, at 8:34 PM, Jayson Minard wrote:

The thread is getting long on the quotes, I'll distill it here into my current thoughts; and now I'm better at the names so will use correct names for everything which helps:

A project and each module can detect its gradlefile or allow you to specify an alternative file just as you can with ANT build files in IntelliJ.

For a IntelliJ Run/Debug configuration you can choose the gradlefile (defaults to the module one), a Gradle task to execute before running, and the optional Gradle configuration (optional) to operate under as well.

I see. The optional gradle configuration is for the classpath, right?

the optional is due to the fact that some people will not use configurations at all in Gradle and will just invoke tasks that happen to also have an implied configuration of the same name. So they must at least specify the task, or at least a configuration, and at most the task + configuration. We need one of those to determine the right classpath for running the application, tests or whatever the run/debug configuration in IntelliJ is trying to do.



The gradle task is for some additional things to do? Another way we enhance IntelliJ. Cool.


The Gradle task is there to match the ANT and Maven plugins which allow you to build when hitting the "Run" or "Debug" actions in the IDE. You tell it what it needs to do to get things ready for execution and in our case that is selecting the right Gradle task if any (yes, "none" is valid if you are running from something that you don't build or want to build).



When coding, we will set the IntelliJ module dependencies to match the Gradle testRuntime configuration + test task by default, but allow the user to change that behavior to one of the following:

- choose an alternate Gradle configuration and/or task to sync the dependencies wi

OK

- match the current IntelliJ Run/Debug configuration that is selected

Changing the current Run/Debug configuration would trigger a recompile?

It won't recompile until you actual invoke Run or Debug and only if you tell it to do so. It will instead set the classpaths to the new values, IntelliJ will then respond by adjusting its background intelligent parsing/compilation that it uses to display errors and such. It is probably best to build as well, but not always neccessary at that time. I'll see how it plays out and know more once we do it. So more on this after I get that far :)





and possibly if the use cases support it:

- merge a list of Gradle configuration and/or tasks to sync dependencies with (i.e. create a mixture of random selections so that they can edit and work nicely without errors in the editor)

I think don't understand this. Error in the editor means: faulty content assist and red curly lines because of compile problems?


Yes. That is what it means. IntelliJ has to understand the code to work well (refactoring, error highlighting, and more) so you want the right classpath when editing not just compiling/running.



The last option will be allowed for internally, but not necessarily exposed unless we find use cases that need it. I.e. have a list of configurations+tasks to use rather than a single one internally.

What do you mean with internally?


internally = the code would support a list of configurations or tasks rather than just one even if we never expose that option to the user; just in case. I'm not sure about that being a friendly user feature and it being confusing or not, so preparing in case it is so that I don't come back and say "Ohhhh, if I had known you wanted that I would have done a lot differently, now you have to wait 2 months for me to make that change." I'd rather have 2 days be the response window.


That provides a lot of flexibility without going overboard early and allows more complex projects that aren't just default looking Java/Groovy projects.

IntelliJ will be more powerful when using Gradle as it will now have the ability to tune its dependency list situationally just as Gradle does which it cannot currently do.

I would like to make sure Gradle gets a one-up on the other guys since it deserves the attention and a better plugin can help that. Eclipse is next on the list and we'll see what can be done there as it can be a rough environment for modules and dependencies and this is another way it can be tuned up as well.

This sounds very good. I can't wait to use this plugin myself :)


Me either. I am committing a large project to use Gradle and we need the plugins so the team doesn't kill me for that decision, so have plenty of reasons here to get it moving!

--j

- Hans


--j

On 3-Jun-08, at 8:52 AM, Hans Dockter wrote:

Hi Jayson,

On Jun 3, 2008, at 5:09 PM, Jayson Minard wrote:

Hans,

On 3-Jun-08, at 1:14 AM, Hans Dockter wrote:

Hi Jason,

On Jun 3, 2008, at 8:42 AM, Jayson Minard wrote:

Hans,

Ok, I setup IntelliJ to debug through Gradle so that I can inspect some of the internals a bit more. A thought came to mind...

Since IntelliJ does not natively support multiple build configurations with differing classpaths.

So we need to think about options here, such as:

- allow the user to quickly select the build configuration and have the classpath always reflect that current configuration - map the build configuration in each run configuration and have the current run configuration drive the current classpath (i.e. you select a Gradle task to run before invoking a runtime configuration just as you would Ant or Maven and we set the classpath to match that task)

Such a mapping is already there. The DependecyManager has two methods:

dependencies {
 resolve(configName) // returns the classpath for a configuration
resolveTask(taskName) // returns the classpath for a task (via the conf2Tasks mapping)
 println conf2Tasks // prints the conf2Tasks mapping
}

If you look in the DependencyManager interface at the method comments you will get some more information.


But does the IntelliJ Runtime configurations line up to a same- named Gradle configuration? If we do not always use testRuntime, we would base it off the task they select to have run when starting a runtime configuration.

I guess I have misunderstood the original statement (map the build configuration in each ...).

To understand:

A run configuration is a concept introduced by the Gradle IntelliJ Plugin? Invoking a runtime configuration means letting it change the IntelliJ files of the project/module?

I still don't understand: 'you select a Gradle task to run before invoking a runtime configuration just as you would Ant or Maven and we set the classpath to match that task'

Just to mention it. A Gradle dependency configuration is distinct from a Gradle task, although sometimes they have the same name. A Gradle task might be mapped to a dependency configuration (e.g. compile task) but not necessarily (e.g. clean task).




- allow user to select a list of tasks to have classpaths pulled from as a group so they can pick and chose from who knows what they'll be adding to their Gradle file (i.e. a JDK 1.5 config vs. a JDK 1.6)

Right

Task or Dependency Configuration?



or some other way to move around between classpaths that can be determined from a Gradle task.

Task or Dependency Configuration?


Have you got use cases in mind where switching the configuration classpath is relevant for the IDE integration?

An example is to ensure your support for JDK 1.5 vs. JDK 1.6 is valid and you have different library sets that you work against for each. I could therefore have a few compile configurations and a few test configurations that have slightly different dependencies.


A very simple approach would be to use testRuntime as the classpath configuration for Java/Groovy projects. This is basically the same the Maven Eclipse plugin does for eclipse and I'd guess the Maven IntelliJ plugin is doing the same.


That is the starting point for sure. I'm wondering it we shouldn't allow for the user to choose as well, and then have a nice default. I'm assuming that existing plugins aren't perfect and thinking it through to see where we can avoid annoying the developers using the plugin.

I was asking because I was curios and I had overread the example you have given in your original mail (JDK1.5/1.6). What we are doing here is to use Gradle to extend IntelliJ. This would even have a purpose if we never, ever execute a Gradle build for this project. Cool.

- Hans


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

  http://xircles.codehaus.org/manage_email



--
Hans Dockter
Gradle Project lead
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