

![]() | Start a set with this search |
![]() | Include this search in one of my sets |
![]() | Exclude this search from one of my sets |
![]() | Permalink to these results Paste this link in email or IM: |
| Atom feed for tracking future search results Paste this URL into your reader: |
69 messages in org.codehaus.groovy.devRe: [groovy-dev] Building Groovy| From | Sent On | Attachments |
|---|---|---|
| Russel Winder | Oct 6, 2008 4:36 am | |
| Mingfai | Oct 6, 2008 4:47 am | |
| Hans Dockter | Oct 6, 2008 4:50 am | |
| Hans Dockter | Oct 6, 2008 4:55 am | |
| Jochen Theodorou | Oct 6, 2008 4:56 am | |
| Guillaume Laforge | Oct 6, 2008 7:17 am | |
| Hans Dockter | Oct 6, 2008 7:51 am | |
| Russel Winder | Oct 6, 2008 7:59 am | |
| Guillaume Laforge | Oct 6, 2008 8:19 am | |
| Guillaume Laforge | Oct 6, 2008 8:25 am | |
| Mingfai | Oct 6, 2008 8:28 am | |
| Guillaume Laforge | Oct 6, 2008 8:36 am | |
| Hans Dockter | Oct 6, 2008 1:46 pm | |
| Guillaume Laforge | Oct 6, 2008 1:54 pm | |
| Hans Dockter | Oct 6, 2008 1:54 pm | |
| Jochen Theodorou | Oct 6, 2008 2:03 pm | |
| Guillaume Laforge | Oct 6, 2008 2:09 pm | |
| Paul Duffy | Oct 6, 2008 7:06 pm | |
| Luke Daley | Oct 6, 2008 8:47 pm | |
| Guillaume Laforge | Oct 6, 2008 9:44 pm | |
| Russel Winder | Oct 6, 2008 11:25 pm | |
| Russel Winder | Oct 6, 2008 11:54 pm | |
| Russel Winder | Oct 7, 2008 12:03 am | |
| Jason Dillon | Oct 7, 2008 12:23 am | |
| Russel Winder | Oct 7, 2008 12:24 am | |
| Guillaume Laforge | Oct 7, 2008 12:30 am | |
| Hans Dockter | Oct 7, 2008 12:35 am | |
| Jason Dillon | Oct 7, 2008 12:35 am | |
| Hans Dockter | Oct 7, 2008 12:36 am | |
| Jason Dillon | Oct 7, 2008 12:41 am | |
| Guillaume Laforge | Oct 7, 2008 12:54 am | |
| Jason Dillon | Oct 7, 2008 1:40 am | |
| Guillaume Laforge | Oct 7, 2008 1:50 am | |
| Jason Dillon | Oct 7, 2008 1:55 am | |
| Guillaume Laforge | Oct 7, 2008 2:25 am | |
| Guillaume Laforge | Oct 7, 2008 2:35 am | |
| Jason Dillon | Oct 7, 2008 3:09 am | |
| Guillaume Laforge | Oct 7, 2008 3:12 am | |
| Russel Winder | Oct 7, 2008 3:17 am | |
| Jason Dillon | Oct 7, 2008 3:24 am | |
| Paul King | Oct 7, 2008 4:04 am | |
| ma...@dockter.biz | Oct 7, 2008 4:19 am | |
| ma...@dockter.biz | Oct 7, 2008 4:25 am | |
| Jason Dillon | Oct 7, 2008 4:36 am | |
| Jason Dillon | Oct 7, 2008 4:39 am | |
| Jochen Theodorou | Oct 7, 2008 5:20 am | |
| Jason Dillon | Oct 7, 2008 8:19 am | |
| Jochen Theodorou | Oct 7, 2008 9:51 am | |
| Jason Dillon | Oct 7, 2008 10:49 am | |
| Jochen Theodorou | Oct 7, 2008 12:03 pm | |
| Hans Dockter | Oct 7, 2008 2:34 pm | |
| Luke Daley | Oct 7, 2008 3:52 pm | |
| Jason Dillon | Oct 8, 2008 1:28 am | |
| Jason Dillon | Oct 8, 2008 1:35 am | |
| Hans Dockter | Oct 8, 2008 3:11 am | |
| Hans Dockter | Oct 8, 2008 3:49 am | |
| Hans Dockter | Oct 8, 2008 4:30 am | |
| Hans Dockter | Oct 8, 2008 4:40 am | |
| Jason Dillon | Oct 8, 2008 4:52 am | |
| Jason Dillon | Oct 8, 2008 5:21 am | |
| Jochen Theodorou | Oct 8, 2008 6:23 am | |
| Jochen Theodorou | Oct 8, 2008 6:47 am | |
| Jochen Theodorou | Oct 8, 2008 6:59 am | |
| Hans Dockter | Oct 8, 2008 8:33 am | |
| Hans Dockter | Oct 8, 2008 8:43 am | |
| Paul Duffy | Oct 9, 2008 8:58 am | |
| Paul King | Oct 9, 2008 1:15 pm | |
| Danno Ferrin | Oct 9, 2008 1:27 pm | |
| Paul King | Oct 10, 2008 2:31 am |

![]() | Permalink for this message Paste this link in email or IM: |
![]() | Permalink for this thread Paste this link in email or IM: |
| Atom feed for this thread Paste this URL into your reader: |
| Subject: | Re: [groovy-dev] Building Groovy | Actions... |
|---|---|---|
| From: | Jason Dillon (jaso...@gmail.com) | |
| Date: | Oct 7, 2008 8:19:19 am | |
| List: | org.codehaus.groovy.dev | |
On Oct 7, 2008, at 7:21 PM, Jochen Theodorou wrote:
FYI, just my own opinions to your opinions below :-)
What I dislike at current build systems is that you often have no separation of concerns. You write helper in your project that then will be used by the build system, because the build system is not powerful enough to express it on its own. In ant you do this by writing ant tasks. For make in a C project you wrote helper in C. In m1 it was ant tasks too, or something with Jelly. In m2 it can be a plugin written in Java. I think the m2 idea is kind of the natural evolution here. In all these cases you either mix parts of your build logic into the normal project because of helper files not used by your project... or you go further and make a plugin like in m2, which needs to be compiled and deployed. This adds a level of indirection which is praised as the wonder weapon against problems, but I personally think of this as a perversions of an easy build. It is easy when the plugins do come from the outside, but the problem that I have to make leaps and somersaults just because my build system can't properly express what I need remains. In fact I reached the goal to separate my build logic from the build so much, that using this becomes a problem in itself.
First you don't need to deploy anything to use a plugin, you can include the plugin in your reactor build and you are fine. Second, using scripting tools like GMaven (or the JRuby plugin or whatever) you can *easily* add extra functionality to your build it basically the exact same fashion as all of these Groovy DSL-based build tools can. In fact as far as getting the build to "properly express what I need remains" goes, there is no difference, simply configure the plugin and write up your groovy to do the remaining bits.
Another problem of most build systems is that you have to breach media very often. In ant you program in XML... that in itself is something I think should be considered as a media breach... but most people then go and XSLT or write custom ant tasks. You use these, because the XML becomes unreasonably big if you do not do so, or things can be expressed more easy that way. Again the build system and the way of usage is to be considered as not powerful enough here. In make you often use autoconf... a joy in itself, but probably still better than many ant builds... only that autoconf doesn't help you much with java builds. In m1, well I mentioned the usage of jelly and ant tasks already. With the ant task you have not only a media breach, but also a breach in the build system usage... m1 was thought to be independent of ant, or not? And jelly... well let us better forget that chapter. Now in m2 you have your plugins and your XML, which is again a media breach. The only way for m2 to avoid this is to minimize the XML part and hope no custom plugin is required. But the standard answer from the m2 guys to all sorts of problems seems to be to write a plugin...
Ant was *never* intended to be a scripting language... in other words you "configure" Ant, you don't "program" Ant. Sure if you need something outside the set of existing tasks you need to program a new task, or use one of the scripting tasks that are available, which brings us right back to the same point I'm making above.
Um, is using a Java-based tool to build a Groovy project a breach as well? I'm not buying this argument at all... but I understand its your opinion and I respect that. :-)
The third part of my thought is "don't look only at the easy things". Of course all build systems have certain use cases where they are very easy to use. You can use make without autoconf in some cases, you can have small and nice m1,m2 and ant builds files... but what if you have to leave the road they gave you? make isn't good at checking library version information or even if there is such a library... it simply isn't in its scope. So a layer on top was made, the configure script. make has other problems as well, but I don't want to write a book here ;) m1.. well I am not really sure what was right or wrong with it... saying it was simply broken looks so unfair... but I am sure many will see it the same. I think ant is not really bad, it just grows too much and becomes unmaintainable then. Sure you have the media breach, but at last the so generated tasks are very easy to use. In m2 they tried to make it all better by conventions and restrictions. In fact so many of them, that they loose the easy usage part like ant has it and like they still had it in m1.
M1 had lots of problems, one of them being that it, like ant, ended up allowing developers so much freedom they end up shooting themselves in the foot, or really drown themselves in the mess of configuration they cooked up. IMO this is a fundamental problem of build systems. Too much flexibility, no enforced standards and in a year you have something which no one really understands and only a few can safely maintain. I'm really only referring to larger projects, for the really simply projects any of these tools will work fine as long as nothing fancy is required.
I don't really believe that M2 convetions and/or restrictions take away from any easy usage though. Surely it does add some extra xml muck, but IMO its easier to configure a simple M2 pom to compile a project than it is to configure Ant. You don't have to know anything about plugins (or tasks) just the basic pom elements to set the groupId, artifactId, version... and where to put your source files. Fairly easy IMO... and really not all that different from Ant, where you have to know which tasks to configure and how to configure them, as well as pick some place to put your files. M2 removes the need for folks to know about plugins or configuration for simple projects, simply make a pom.xml and put your goodies into src/main/java or src/ test/java and you are done. IMO that is much easier. When things get more complicated I believe its about the same for Ant or M2 (or even M2) have to *know* more about the tool, how to configure, what to configure, etc.
Probably part 2 and three can be condensed in "ease of use". Once you leave the road, there is no longer the question for a comfortable way, but how many walls you have to climb. Of course many m2 people will argue, that if you organize your source according to their pattern and that if you use the plugins the m2 world gave you, you have no really big problems - besides bugs in the plugins. But what if there are reasons to not to follow the m2 conventions? I think it is just too easy to say that if you don't follow the conventions you have to live with the difficulties. A good build system should instead still try to support them as good as possible and not add new walls he has to climb.
And M2 does allow you a lot of flexibility, but really... if M2 is an apple and you want orange juice, good luck trying to make it happen. You can probably do it, but you are going to end up with a messy problem on your hands later, and you will probably end up hating the tool in the progress. So why bother? If you follow M2 conventions, you can end up with an easy to use, easy to maintain system, if you don't... well its a lot more work.
Now I personally dislike XML. For me XML stands for "cross machine language" meaning it is not intended to be used by the human reader.
Whats byte-code then? :-P
Also If you need a GUI or even IDE to just get things rolling then some things are wrong. I mention those because often it is said you can have a special editor with auto-completion and which validates the XML and whatever... as I said... if I need those, then something is wrong. Also once you have to program in XML something is really wrong.
This was one of the main reasons why M1 (via Jelly) sucked (not the only reason, but a big one for sure).
I think a build system can be most powerful if it is based on a programming language, allowing you to write tasks/plugins without media breach. Where you can hook into the build logic itself to bend it to do your non standard things... maybe even making a more or less new build system out of it, if you need that. So instead of avoiding logic in the build file, the build file should consist of build logic. That is completely against the ideas in maven. But most people using build files are more or less good programmers and why should this potential power not be used?
Yikes... when I had a *normal* corporate job I would almost never let folks go hack on build files for the very reason that I found that most were more or less poor programers, sloppy, only caring about their own job. So putting build logic into a file which anyone could drop random muck into would have been a catastrophe ;-) But maybe I just had bad luck finding jobs with smart people :-P
For example the question should not be how good the build system does multi project builds, instead the question should be about what I have to do to et my build system to support multi project builds in the way I want to have them! The question shouldn't be if the dependency management of ivy or maven is better, instead the question should be what I have to do to use either of them. A build system should not work against your personal taste of what tools you have to use and what layout should be used. Instead a build system should give support to make the non standard things easy too. And so on.
Everyone has their own tastes, preferences, desires, hopes, whatever. IMO its not possible to design a tool which will fit for everyone... and certainly its not possible to have one build configuration which fits everyones personal taste. Trying to create such a thing is going to be about as successful as the search for the holly grail or the fountain of youth. Might be fun to try, but at the end of the day your hands will still be empty, and probably some bad taste in someone's mouth.
And I think a programming language to program/configure the build is what is needed to get this working.
I am not sure if gradle can already achieve all these goals already or if it even intends to do so, but I think gradle is more near to this ideal than ant or maven.
In smaller groups, where folks pretty much know about all of the codebase this might work. But in larger enterprise or open-source groups this is almost certainly a recipe for disaster, as you get new folks coming in all the time, they go look at build goo and don't understand it, or worse yet don't understand it and try to change it. Developer comprehension of build tools is IMO very important, especially when they have to muck with it, and IMO a build tool where you code up everything in any way you feel like at the moment, will probably cause some problems for new folks to understand easily.
So what technical reasons to switch or not to switch can I extract from these for a build of Groovy? In fact I failed in my explanation at a very important point. That point is why? Why want I have such a flexible system? Nad my simple answer would be maintainability. If you don't need to change your build anymore, then any build system is fine, because as long as you don't have to touch the build files any build system will do. Never change a running system... But once you have to extend your build you already reached the point where your current build doesn't do the job anymore. And again it does not matter what build system it is, the build wil be more complex in the end. So the cost factor is the thing that has to be reduced. How much can I change the build without increasing the complexity of the build too much? Often people tend to not to extend the build any further, because it is already too big and nobody actually understands it anymore. It starts with a decreasing number of people who actually know what the build does and ends with people just trying and guessing. Several refactorings may help to ease the pain, but the comlexity will grow without mercy.
Bingo.
I think that ant has a bad cost factor here. It does not take much for the build to be too complex. And I think for Groovy we already reached the point where just one or two actually know what the build does. At times of m1 I understood the build more or less, but from my point of view the current build is at last as complex as the m1 build now... and I fail to understand it anymore.. to many strange fork calls are in there for me. so each change will brings us to the point where noone actually understand the build anymore... and I don't think that the current build will be sufficient for whatever we do in Groovy in the future. For example I would like to automate the upload of the files. I would like it to handle connection problems and other stuff. But I don't dare to write something for ant. So from my point of view we already reached the point where we do certain things not anymore, because it is too complicated.
I can't help but mutter a teeny tiny "I told you so" here. I was warning about the decay many months ago :-\
Regarding uploading files (and other release management stuff), I'm curious what Gradle has to offer. Found a ref to an Upload class, but the content at the link is missing:
http://www.gradle.org/api/0.4/org/gradle/api/tasks/Upload.html
And I doubt m2 will help me with all the non standard things I would like to do. So a switch to gradle seems to be the right thing for me.
What non-standard things are those? Is not simply using the groovy:execute goal in a pom going to be sufficient for most non- standard things? Can you give me an example?
--jason
--------------------------------------------------------------------- To unsubscribe from this list, please visit:







