On 02/25/2013 06:45 AM, Luke Daley wrote:
> On 22/02/2013, at 3:32 AM, Adam Murdoch <[email protected]> wrote:
>
>> On 22/02/2013, at 2:10 PM, Adam Murdoch wrote:
>>
>>> Hi,
>>>
>>> So we're starting to build out a graph of build items, with our source sets 
>>> and jvm binaries (and publications). At the moment, this is pretty basic, 
>>> where you can define some source sets and define some jvm binaries and 
>>> attach the source sets as inputs to the binaries. Or you can attach a 
>>> component as input to a publication.
>>>
>>> There are a few different types of build items that we need to model:
>>>
>>> 1. Something that already exists and does not need building. These things 
>>> are only consumed in the current project. You need to be able to define it 
>>> and configure some stuff about how to use it. For example: here is a java 
>>> source set and it includes java source from this directory and that 
>>> directory.
>>>
>>> 2. Something that is produced outside the project. Again, these things are 
>>> only consumed in the current project. You need to be able to define a 
>>> dependency on the thing and resolve it into something usable. For example: 
>>> give me a jvm binary for 'org:gradle:gradle-core:1.5+' so that I can use it 
>>> in my compile classpath, or give me the source set for project(':other') so 
>>> I can generate some aggregate javadoc from it.
>>>
>>> 3. Something that is produced by the project. You need to be able to define 
>>> it and configure some stuff about how to build it. For example, please 
>>> produce a jvm binary into this classes directory, built from these input 
>>> source sets and targeting this jvm version.
>>>
>>> 4. Something that is produced and consumed within the project. As above, 
>>> where the configuration that describes how to build it also implies how to 
>>> use it.
>>>
>>> 5. Something that is a view over some other things. For example, a 
>>> composite or a filtered source set. These things are only consumed.
>>>
>> Another question is how to represent the work that need to be done to make 
>> the build item usable. Each thing is usable in a bunch of different ways, 
>> and each of these require different work to be done. Some of these ways of 
>> using an item are cross-cutting, and some are type specific. Here are some 
>> examples:
>>
>> * In order to refer a thing, to pass it around, I don't need to do anything 
>> more than define it (ie here is a java source set called 'mainJava').
>>
>> * In order to use a java source set's compile classpath as a set of 
>> dependency definitions, I need to make sure the source set has been 
>> configured. This might mean configuring the current project, which might 
>> mean running some tasks to build some other project that is used to 
>> configure the project, which might mean configuring that other project, and 
>> so on.
>>
>> * In order to use a java source set's compile classpath as a set of files 
>> that will be built (for example, say I'm generating a classpath manifest 
>> file), I need to make sure the source set has been configured (as above) and 
>> I need to resolve any dependency definitions referenced in the classpath, 
>> which might mean configuring each project referenced by a project dependency 
>> or resolving the meta-data for a thing from a repository. I don't need to 
>> build or download the files themselves.
>>
>> * In order to zip up a java source set's source, I need to make sure the 
>> source set has been configured (as above), and I need to make sure the 
>> source has been generated (if required). I don't need to do anything with 
>> the classpath.
>>
>> * In order to compile a jave source set, I need to make source the source 
>> set has been configured, the source has been generated, the compile 
>> classpath has been resolved to files, and the classpath files built or 
>> downloaded.
>>
>> In other words, Buildable isn't going to cut it. I don't think we 
>> necessarily need to go quite as fine grained as the above, but we need 
>> something better than 'configure and build and resolve and download all the 
>> things that might be required to use this thing in any way'.
>>
>> Suggestions?
> It's becoming obvious that we need to formalise the idea of “configured”. Or 
> at least, formalise the notion of there being a configuration lifecycle. 
> Perhaps though this is not really a separate concept. That is, building (aka 
> configuring) the model is not inherently different to building files for 
> example.
>
> One idea is just to go fine grained with the types and modelling. So strongly 
> model the specification of source as a buildable thing and separately model 
> the actual physical files, having both of these things express some kind of 
> opaque dependency like Buildable. So if you just need to know when it's 
> configured, you'd use the specification's buildable. It may be hard to find 
> the concepts to break apart here sometimes though. So something like…
>
> class JavaSourceSet {
>       SourceDirectorySetSpec getSrcDirs()
>       ClasspathSpec getCompileClasspath()
> } 
>
> class SourceDirectorySetSpec implements Buildable {
>       SourceDirectorySet getBuilt()
> }
>
> The general idea being instead of introducing a protocol that allows us to 
> depend on something in a certain state, we introduce more fine grained 
> modelling.

I hope this would also include the ability for one project in a
multi-project build's configuration stage to depend on a built artifact
from another project in the multi-project build.  This would make for
something a little more general than buildSrc if you wanted to do
something like create custom tasks or plugins as projects in a
multi-project build, perhaps as an intermediate step toward getting it
ready to move out into its own project.

--Jay (popping out of lurker mode for a brief moment)

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

    http://xircles.codehaus.org/manage_email


Reply via email to