Also a benefit of being on Git for contrib would mean I don't have to
pull ClojureCLR and other stuff I don't want into my clone. It would
make it less "kitchen junk drawer".
Another benefit of being on Git is people can fork, fix and send you
pull requests (which you can accept or not at your discretion). It
just encourages easy fork/branch/collaborate.
What does 1.0 mean to you? Are we there yet? Any recommendations for
the organization of the release branches, patch policy etc?
my view of Java's backward compatibility is that it is kind of a bunch
of hot air that restricts the ecosystem from being better. i vastly
prefer the fact that .net is willing to make real changes to get real
benefits.
sincerely.
$0.02
+1. I worry about the cpan/gem mention, though. We're still in the
java world w.r.t. build and packaging, which generally means using
something like ivy/maven/svn:externals/git-submodule/etc ahead of
one's build process, rather than using cpan/gem/easy_install/etc at
deployment time.
That said, I have no concrete suggestion, as we'll always separately
pull our projects' dependencies into whatever we happen to be using as
a dependency management repo (it's a bummer to not be able to run a
build if some third-party repo is down, etc).
Regarding documentation, I remember throwing around ideas in irc some
months ago about how to fold documentation from gen-class'ed libs into
a library's broader javadoc. That would be a huge boon to those using
clojure to build libraries that would be transparently usable by Java
developers.
- Chas
my view of Java's backward compatibility is that it is kind of a bunch
of hot air that restricts the ecosystem from being better. i vastly
prefer the fact that .net is willing to make real changes to get real
benefits.
sincerely.
$0.02
Yes, please, I don't want to be forced to work around automated
downloaders. e.g. Like OpenWrt's build system that wants to download
huge amounts of code if you don't watch it instead of just failing so
you can tell it to look *over there* where I've already downloaded 90%
of it! Of course, after it happens the first time you learn to be
more careful, but I would prefer to be told what the dependencies are
so that I can get them myself, or to be asked whether to download them
than just automatically downloading them.
> Regarding documentation, I remember throwing around ideas in irc some
> months ago about how to fold documentation from gen-class'ed libs into
> a library's broader javadoc. That would be a huge boon to those using
> clojure to build libraries that would be transparently usable by Java
> developers.
About documentation: I believe this has been mentioned before, but I
haven't been able to find the thread. Some functions are documented
like this:
"assoc[iate]. When applied to a map[...]"
This makes it difficult if you're looking for some function and don't
know the exact name.
e.g.:
user=> (find-doc "quotient")
nil
user=> (find-doc "quot\\[ient")
-------------------------
clojure.core/quot
([num div])
quot[ient] of dividing numerator by denominator.
nil
Also, while looking for the thread mentioning the above, I found
another unresolved documentation-related thread:
This is about the "count" function being difficult to find if you're
trying to find the "length" or "size" of something.
--
Michael Wood <esio...@gmail.com>
Python did very well without a CPAN-alike.
Of course it had a pretty good standard library.
--
Michael Wood <esio...@gmail.com>
Am 16.04.2009 um 23:21 schrieb Michael Wood:
> Yes, please, I don't want to be forced to work around automated
> downloaders. e.g. Like OpenWrt's build system that wants to download
> huge amounts of code if you don't watch it instead of just failing so
> you can tell it to look *over there* where I've already downloaded 90%
> of it! Of course, after it happens the first time you learn to be
> more careful, but I would prefer to be told what the dependencies are
> so that I can get them myself, or to be asked whether to download them
> than just automatically downloading them.
To start collecting some Pros/Cons for the different
possibilities at there:
From my experiments with Ivy: You can just remove any
public repository from the search paths. So any download
will fail, telling you which dependencies could not be met.
In fact I run such a setup at work, where all external
dependencies are mirrored locally. So there is no network
access required.
Finally, Ivy makes it easy to setup such a mirror by
virtue of the ivy:install task.
Sincerely
Meikel
> What does 1.0 mean to you? Are we there yet? Any recommendations for
> the organization of the release branches, patch policy etc?
What I tacitly expect from a 1.0 release (or any official, numbered
release) is
- bug fixes without imposed changes in functionality for at least a year
- the promise not to introduce breaking changes in future releases
unless there is a very good reason to do so
- a clear indication of potentially breaking changes by a change in
version number
- an outline of how future changes will be handled so that I can
prepare for them in my own code management
For a 1.0 release in particular, I expect sufficient stability and
completeness for use in real-life projects.
From my own experience with today's Clojure, I'd say the stability
is there. I am less convinced about completeness, but that's mainly
because there are many things I haven't yet tried to do. Overall, the
discussions on the group don't leave the impression that there are
glaring holes anywhere. However, it is possible that many users are
relying on clojure-contrib for completeness, and if that is the case,
the status of clojure-contrib needs to be considered as well before a
1.0 release.
What I miss most for a 1.0 release is some idea of how future changes
will be handled, and what Clojure users can safely count on. For
example, every new function added to clojure.core will break code
that has chosen to use the same name for something else. While such
incompatibilities are easy to fix (with an exclusion in refer-
clojure), they are still a pain if they happen frequently. Another
point is multimethod dispatch. Various ideas have been discussed
here, and most of them, if adopted, are likely to break a lot of code
relying on the current approach.
As for bug fixes for a stable release, you pointed out that someone
would have to take care of them (mostly by backporting fixes in trunk
I guess). I don't think it will be hard to find a team of volunteers,
but it would be nice to arrange this before an official release. The
same team could also maintain a stable subset of clojure-contrib as a
kind of standard library.
Konrad.
I just wanted to give some thoughts on what I think are the main
points coming from this discussion. It seems like most agree that
"Clojure the language" is ready for a 1.0 release (and all that comes
with it). The main issues are A) choice of VCS and B) the state of
clojure-contrib. Here's my thoughts on both:
A) VCS
Python has just changed from Subversion to Hg (there is a great PEP
article that details reasons for doing so here:
http://www.python.org/dev/peps/pep-0374/). They did this because they
had a need to and at the moment Clojure doesn't have this need
(because there is only one person doing commits!). While it seems
pointless changing technology for the sake of it, I also think - if
it's an inevitable change in the future - why not just do it now?
Rich - is changing VCS something you would consider at this stage?
B) clojure-contrib
For me, the purpose of clojure-contrib is a little confusing. Is it
the Clojure standard library? well a lot of "standard" libraries are
not in clojure-contrib so I think the answer is no. Is it a special
holder repos for code that might someday be moved up into the core
language? Well, that's what I thought it was for but there is
currently stuff in there that will never be in the core language IMO.
I think we need to decide what clojure-contrib is before a 1.0 release
(or maybe it's already very clear and I have just missed something!).
In general, I think there should be only two "things" - the core
language and a set of libraries. Whether the "libraries" are managed
CPAN-style or whether they are delivered as part of a standard library
(like with Python) I don't know at this point - but having a "special
third place" for libraries that may or may not go into core seems
unnecessary to me.
Paul.
--
Iode Software Ltd, registered in England No. 6299803.
Registered Office Address: 12 Sancroft Drive, Houghton-le-Spring, Tyne
& Wear, DH5 8NE.
This message is intended only for the use of the person(s) ("the
intended recipient(s)") to whom it is addressed. It may contain
information which is privileged and confidential within the meaning of
applicable law. If you are not the intended recipient, please contact
the sender as soon as possible. The views expressed in this
communication may not necessarily be the views held by The Company.
Luc Préfontaine Armageddon was yesterday, today we have a real problem... |
As for tests, there are tests in:
http://code.google.com/p/clojure-contrib/source/browse/#svn/trunk/src/clojure/contrib/test_clojure
Anyone who wants more tests can contribute them.
Overall, I'm getting feature requests (more change!) and not a strong
drive for 1.0 stability. If you feel otherwise, please speak up.
Otherwise, my conclusion is that 1.0 may be more important for not-yet-
users wary of working from source.
- Development process stability
Currently all new work (fixes and enhancements) occurs in trunk.
There's no way to get fixes without also getting enhancements. I think
this is the major missing piece in offering stable numbered releases.
While I've cut a branch for each of the prior two releases, no one has
ever submitted a bugfix patch for either. If people are going to want
to work with a particular release version for an extended period of
time, someone (other than me) will have to produce patches of (only!)
fixes from the trunk for the release branch, and occasionally produce
point releases (1.0.x) from that branch.
I'm all for feature requests, but it's worth keeping in mind that some
feature requests make more sense at this stage than others. I'd like
to see 1.0 include the sorts of feature requests that people have made
that complete, round out, or refine the existing functionality.
For example things that have been suggested here like:
* compare should work on lists and sequences, doing lexicographic
comparison like vectors
* merge functionality of repeat and replicate into one function and
deprecate the other.
* figure out what contrib functions should belong in the core.
It seems like once those sorts of changes have been made, it's worth
stamping a 1.0 label on everything before plowing ahead with the more
visionary changes such as streams, multimethod enhancements,
distributed systems, etc.
I agree the last thing we want to do is start flame wars on Git Vs
Mercurial (for example) - that is pointless. There are many credible
comparisons between specific VCSs (the Python PEP 374 I mentioned
earlier in this thread being one of them).
The question for me is whether it's important to move to a
*distributed* VCS and not so much which one to pick. Having thought a
bit more on it, while I would like to see a move to a DVCS personally,
I don't think it's important in the context of a 1.0 release. I think
it's a completely separate issue.
One of the best things about the Python library being
batteries-included is that it's easy for newcomers to get started.
> I'd also like to see a little more focus on the perl/python/ruby
> equivalence from a newbie perspective. That is, more clarity around
> startup, script execution (including having an equivalent to python's
> "if __name__ == '__main__':" construct), class path management, etc.
> I know that this is one area where being in the JVM ecosystem makes
> our life worse rather than better, but approaching Clojure is still a
> bit daunting compared to these other languages.
This is one of the main problems with clojure-contrib for me. I think
it would be awkward to have a 1.0 release with clojure-contrib left as
is and would cause confusion for newcomers.
Unless I am mistaken there are still many open questions regarding how
clojure-contrib is integrated with clojure such as its dependency
relationship with clojure.jar for example. Surely, this sort of thing
needs ironing out before a 1.0 release?
I think various comments in the following recent thread summarises
some of the main issues well:
Paul.
I guess there's really no perfect solution here :-(
The question is :
do you prefer to have some clojure users united against subversion, or divided by Rich not having chosen their preferred DVCS (Mercurial users vs Git users, not sure whether clojure needs those kinds of nonsense internal wars in the community ....)
It's not clear how to use the stuff in clojure-contrib, which
certainly seems like the 'standard library' of useful tools that makes
clojure into something other than a lispy language using Java libraries.
Please don't under-estimate the extent to which good documentation, an
obvious and clean code base (which clojure-contrib isn't) and a
documented story for packaging and managing extensions/contributions,
gives the impression of quality, at least with respect to the kind of
'quality' that comforts and convinces arms-length users. The website
is quite good in some of those respects for clojure core.
Also +1 for moving to git and github - in my experience it motivates
contributions/contributors because it is such a low-barrier platform
for collaborative/experimentation.
Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
The ultimate measure of a man is not where he stands in moments of
comfort and convenience, but where he stands at times of challenge and
controversy.
-- Martin Luther King
We seem to be unanimous in preferring git.On Fri, Apr 17, 2009 at 4:29 PM, Laurent PETIT <lauren...@gmail.com> wrote:
I guess there's really no perfect solution here :-(
The question is :
do you prefer to have some clojure users united against subversion, or divided by Rich not having chosen their preferred DVCS (Mercurial users vs Git users, not sure whether clojure needs those kinds of nonsense internal wars in the community ....)
Rich is the main maintainer of clojure source, just let him use the DVCS he wants. And really, it's not that difficult to checkout a working copy of svn, hack on it, and do a svn diff > mypatch.diff to send him when ready (so more complex management cases may well be easier with DVCs in the contributor side, of course) ...
People (and not just book authors :) often ask - whither 1.0? [Ok,
maybe they don't use 'whither']. The fact remains, some people want a
1.0 designation, and I'm not unwilling, providing we as a community
can come to an understanding as to what that means, the process it
implies, and the work it will require (and who will do it). Here are
some of the relevant issues, IMO:
- Stability/completeness/robustness
This is mostly about - does it work? Is it relatively free of bugs? Is
it free of gaping holes in core functionality? I think Clojure is in a
pretty good place right now, but am obviously biased. This in no way
implies there isn't room for improvement.
- API stability
With the semantic changes of fully lazy sequences behind us, I think
the syntax and semantics of existing functions is largely stable.
- Development process stability
Currently all new work (fixes and enhancements) occurs in trunk.
There's no way to get fixes without also getting enhancements. I think
this is the major missing piece in offering stable numbered releases.
While I've cut a branch for each of the prior two releases, no one has
ever submitted a bugfix patch for either. If people are going to want
to work with a particular release version for an extended period of
time, someone (other than me) will have to produce patches of (only!)
fixes from the trunk for the release branch, and occasionally produce
I have only used SVN myself and so don't have any preference regarding
Mercurial Vs Git Vs any-other-DVCS-out-there. As I mentioned earlier,
I think Clojure should use a *distributed* VCS one day (the sooner the
better) but - importantly - that decision isn't relevant to a 1.0
release.
>> It's not clear how to use the stuff in clojure-contrib, which
>> certainly seems like the 'standard library' of useful tools that
>> makes
>> clojure into something other than a lispy language using Java
>> libraries.
>
>
> This is a good point. Using clojure.contrib is in fact extremely easy,
> but it's hard to tell that from the point of view of a new user. I was
> a new user recently enough to remember my initial confusion about how
> to set up my development environment and how to arrange it so that
> clojure.contrib was as readily accessible as it should be.
I wasn't talking about how to get it on the classpath so much as
documentation for the individual components in clojure-contrib. IMO
those components should be broken out, and documented.
I have commercial experience developing Smalltalk applications which
has shown me that you *can* survive without extensive documentation
iff you have fantastic code navigation and exploration. I'm not
talking about find-doc et al, but some way of navigating live code. So
when I say that documentation is necessary, I admit that one
alternative would be a code navigation tool as part of the core. One
way to do this would be an ultra-lightweight server as part of core
that serves up a hyperlinked cross-ref view of the source, ala the
Smalltalk Browser. I don't think this should be relegated to the
individual IDEs.
The weakness of the Smalltalk approach as compared to javadoc (say) is
that it's easy to cop out and regard functional-level documentation is
being sufficient, whereas you also require architectural/expository
documentation, and that really needs to be rich e.g. package level
javadoc as opposed to class/method level documentation. I think some
mechanism to do that is required.
My overall point being that there is a conflict in knowing that
documentation is absolutely required for mass-acceptance and arms-
length use and yet knowing that documentation generally won't be
written and even when it is, it needs to be integrated.
IMO javadoc is a significant reason for the success of java, and
something at least as good, and preferably live and reflective, is
required for Clojure.
I get the feeling that for the purposes of a book about the language,
1.0 is pretty much ready now, although wasn't there something about
method dispatch / hierarchies that Rich was looking at?
Antony Blakey
--------------------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
Hi, I'd like to do $THING. I know that $SOLUTION_A and $SOLUTION_B
will do it very easily and for a very reasonable price, but I don't
want to use $SOLUTION_A or $SOLUTION_B because $VAGUE_REASON and
$CONTRADICTORY_REASON. Instead, I'd like your under-informed ideas on
how to achieve my $POORLY_CONCEIVED_AMBITIONS using Linux, duct tape,
an iPod, and hours and hours of my precious time.
-- Slashdot response to an enquiry
> do you prefer to have some clojure users united against subversion,
> or divided by Rich not having chosen their preferred DVCS
> (Mercurial users vs Git users, not sure whether clojure needs those
> kinds of nonsense internal wars in the community ....)
>
> We seem to be unanimous in preferring git.
Not at all. I am a convinced Mercurial user, for example, and I don't
even have git installed on my machine (I do have svn). However, I
didn't participate in this debate because I think it is pointless.
VCS issues are as much a matter of personal preference as technical
merit. It's Rich who does all of the commits, so it's for him to choose.
Konrad.
I do not agree with John Newman that the Java standard library
should be the Clojure standard library.
> 2) One way to maintain Clojure's flexibility would be if it were
> like what the kernel is to a Linux distribution. What if every
> distribution had to use the same standard set of packages? The
> Linux ecosystem is much richer today because the kernel can develop
> somewhat independently of the applications that target it.
True, but there is still a standard set of packages (or rather
functionalities) that all but the most specialized Linux
distributions contain and that everybody expects to find in a
"normal" Linux distribution. Things like the shell, ls, rm, etc.
> One way to compensate for a lack of "batteries included" might be a
> powerful, agnostic library management solution, which allows for
> different contrib libraries, VMs, or architectures, but that
> definitely seems like a 2.0 feature.
That sounds like a lot of work, and it won't take care of one
important contribution of a standard library: standardization for
basic, well-understood tasks. It's no fun to program in an
environment where there are three competing libraries for parsing
HTML that differ only in function names and parameter order.
Konrad.
That's not the case for contrib.
If Rich is the only committer *and contributor* to core, then it's a
moot point what VCS is used for core.
Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
A Buddhist walks up to a hot-dog stand and says, "Make me one with
everything". He then pays the vendor and asks for change. The vendor
says, "Change comes from within".
> If there is just a (def *version* {:major 1 :minor 0 :release 0})
>
> my questions are:
>
> What happens after release to keep subsequent interim versions from
> having the same 'version' as a release? Should we have a :status
> attribute that is :release for releases and :interim for non?
I like how that sounds. Either that or having a :prerelease key that
maps to true in interim releases.
Additionally release candidates should have a :release-candidate key if
we end up going down that path.
-Phil
> On Apr 20, 1:48 pm, Rich Hickey <richhic...@gmail.com> wrote:
>> I imagine a (clojure-version) function returning:
>>
>> {:major 1 :minor 0 :release 0}
>
> I'd suggest calling :release something else, like :revision
> or :patch. "release" sounds like a bigger number than major/minor.
> Other than that, makes sense to me.
The term I've often seen is :bugfix for the least-significant version segment.
-Phil
I like the term "service" used in Eclipse terminology:
"the service segment indicates bug fixes"
(The numbering scheme for Eclipse uses major, minor, service and
qualifier : "the qualifier segment indicates a particular build").
(http://wiki.eclipse.org/Version_Numbering#Guidelines_on_versioning_plug-ins)
--
Laurent Petit
> If there is just a (def *version* {:major 1 :minor 0 :release 0})
>
> my questions are:
>
> What happens after release to keep subsequent interim versions from
> having the same 'version' as a release? Should we have a :status
> attribute that is :release for releases and :interim for non?
To give you more ideas, there is a convention in tools like maven/ivy
that when you're starting the hack on a branch targeting some version
M.m.r , you immediately rename the place in code where you maintain
the version number by appending the -SNAPSHOT keyword.
So every build that does not remove this -SNAPSHOT suffix can not be
mistaken with the real release.
Note that such tools are not as "structured" as you suggest and just
reserve a single field for version numbering.
I think it is a good idea to add this :status attribute. It could be
used to mark progression towards a fully featured version, as well :
{ :major 1 :minor 0 :release 0 :status :SNAPSHOT }
then
{ :major 1 :minor 0 :release 0 :status :RC1 } (release candidate 1)
then
{ :major 1 :minor 0 :release 0 :status :RC2 } (release candidate 2)
etc.
and finally
{ :major 1 :minor 0 :release 0 :status :GA1 } (Global Availibility 1)
One thing to be considered, also, would be a :qualifier attribute that
could say : "this is the version packaged with sources", "this is the
slim version", ...).
HTH,
--
Laurent
> To give you more ideas, there is a convention in tools like maven/ivy
> that when you're starting the hack on a branch targeting some version
> M.m.r , you immediately rename the place in code where you maintain
> the version number by appending the -SNAPSHOT keyword.
> So every build that does not remove this -SNAPSHOT suffix can not be
> mistaken with the real release.
>
> Note that such tools are not as "structured" as you suggest and just
> reserve a single field for version numbering.
>
> I think it is a good idea to add this :status attribute. It could be
> used to mark progression towards a fully featured version, as well :
>
> { :major 1 :minor 0 :release 0 :status :SNAPSHOT }
> then
> { :major 1 :minor 0 :release 0 :status :RC1 } (release candidate 1)
> then
> { :major 1 :minor 0 :release 0 :status :RC2 } (release candidate 2)
> etc.
> and finally
> { :major 1 :minor 0 :release 0 :status :GA1 } (Global Availibility 1)
Given the likelihood that pom's will be used by some people, with
maven or ivy, it would be good to have some scheme that maps to and
from the pom version coordinate system in a transparent fashion,
particularly in relation to this particular feature of that system.
Antony Blakey
--------------------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
Always have a vision. Why spend your life making other people’s dreams?
-- Orson Welles (1915-1985)
>
>
> On 21/04/2009, at 5:12 AM, Laurent PETIT wrote:
>
>> To give you more ideas, there is a convention in tools like maven/ivy
>> that when you're starting the hack on a branch targeting some version
>> M.m.r , you immediately rename the place in code where you maintain
>> the version number by appending the -SNAPSHOT keyword.
>> So every build that does not remove this -SNAPSHOT suffix can not be
>> mistaken with the real release.
>>
>> Note that such tools are not as "structured" as you suggest and just
>> reserve a single field for version numbering.
>>
>> I think it is a good idea to add this :status attribute. It could be
>> used to mark progression towards a fully featured version, as well :
>>
>> { :major 1 :minor 0 :release 0 :status :SNAPSHOT }
>> then
>> { :major 1 :minor 0 :release 0 :status :RC1 } (release candidate 1)
>> then
>> { :major 1 :minor 0 :release 0 :status :RC2 } (release candidate 2)
>> etc.
>> and finally
>> { :major 1 :minor 0 :release 0 :status :GA1 } (Global Availibility 1)
>
>
> Given the likelihood that pom's will be used by some people, with
> maven or ivy, it would be good to have some scheme that maps to and
> from the pom version coordinate system in a transparent fashion,
> particularly in relation to this particular feature of that system.
>
I'm unfamiliar with the POM version coordinate system - any hints?
Rich
> I'm unfamiliar with the POM version coordinate system - any hints?
My comment was in support of Laurent's proposal. I'm a relative maven
newb, but this is my take:
POMs use the concept of a coordinate, which is
<groupId>:<artifactId>:<packaging>:<version> to identify a particular
artifact e.g. library. GroupId + Artifact Id is a qualified name -
think java package name. Packaging specifies how the artifact is
packaged e.g. jar or war, but it doesn't contribute the id of the
project. Version numbers are as you expect, but can be suffixed with '-
SNAPSHOT', which effectively creates a distinct subspace of versions
ordered by creation date. By depending on a 'a.b.c-SNAPSHOT' version,
you get the latest (by date) artifact marked with 'a.b.c-SNAPSHOT'.
When you release the artifact you remove the '-SNAPSHOT'. In effect
the suffix creates two different versioning spaces, one of which is
strictly determined by the hierarchic numeric ordering, and another
that allows duplicates ordered by date within a specific
hierarchically ordered version. AFAIK, an 'a.b.c-SNAPSHOT' version
will not satisfy a request for 'a.b.c' e.g. -SNAPSHOT is not a further
qualifier.
Antony Blakey
--------------------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
The project was so plagued by politics and ego that when the engineers
requested technical oversight, our manager hired a psychologist instead.
-- Ron Avitzur
> On 21/04/2009, at 10:22 AM, Rich Hickey wrote:
>
>> I'm unfamiliar with the POM version coordinate system - any hints?
>
> My comment was in support of Laurent's proposal. I'm a relative
> maven newb, but this is my take:
>
> POMs use the concept of a coordinate, which is
> <groupId>:<artifactId>:<packaging>:<version> to identify a
> particular artifact e.g. library. GroupId + Artifact Id is a
> qualified name - think java package name. Packaging specifies how
> the artifact is packaged e.g. jar or war, but it doesn't contribute
> the id of the project. Version numbers are as you expect, but can be
> suffixed with '-SNAPSHOT', which effectively creates a distinct
> subspace of versions ordered by creation date. By depending on a
> 'a.b.c-SNAPSHOT' version, you get the latest (by date) artifact
> marked with 'a.b.c-SNAPSHOT'. When you release the artifact you
> remove the '-SNAPSHOT'. In effect the suffix creates two different
> versioning spaces, one of which is strictly determined by the
> hierarchic numeric ordering, and another that allows duplicates
> ordered by date within a specific hierarchically ordered version.
> AFAIK, an 'a.b.c-SNAPSHOT' version will not satisfy a request for
> 'a.b.c' e.g. -SNAPSHOT is not a further qualifier.
This BTW presumes a fairly simplistic dependency selection mechanism.
In a previous life I did a lot of work with dependency algebras, and a
far more powerful solution for managing configuration is to allow
artifacts to be annotated with multidimensional versioning attributes
organized by feature, using an ordered unification based configuration
resolution mechanism. Somewhat like versioned requires/provides but
with richer semantics.
My experience was such systems are too complicated for mass
deployment, and their use needs to be motivated by a significant
configuration management requirement, which is why I suggest sticking
to the far simpler maven/ivy POM model.
Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
All that is required for evil to triumph is that good men do nothing.
Mark
On Apr 20, 2009, at 7:02 PM, Antony Blakey wrote:
> On 21/04/2009, at 5:12 AM, Laurent PETIT wrote:
>
>> { :major 1 :minor 0 :release 0 :status :SNAPSHOT }
>> then
>> { :major 1 :minor 0 :release 0 :status :RC1 } (release candidate 1)
>> then
>> { :major 1 :minor 0 :release 0 :status :RC2 } (release candidate 2)
>> etc.
>> and finally
>> { :major 1 :minor 0 :release 0 :status :GA1 } (Global Availibility 1)
I'm unfamiliar with the POM version coordinate system - any hints?
Rich
2009/4/21 Daniel Jomphe <daniel...@gmail.com>:
>
> version: 1.0.0-rc1-SNAPSHOT
> yields: clojure-1.0.0-rc1-<snapshot>.jar
> (and ...-slim.jar, ...-sources.jar)
There it is. But why having "<snapshot>" in the name of the jar,
shouldn't it just be "SNAPSHOT" (as far as I remember) ?
That is:
{ :major 1 :minor 0 :incremental "0-rc1-SNAPSHOT" }
gives version: 1.0.0-rc1-SNAPSHOT
yields: clojure-1.0.0-rc1-SNAPSHOT.jar
(and ...-slim.jar, ...-sources.jar)
--
Laurent
2009/4/22 Rich Hickey <richh...@gmail.com>:
> [...]
> {:major 1, :minor 0, :incremental 0, :qualifier :rc1 :interim true}
> [...]
> Possible
> values of :qualifier include :rc, :beta etc,
> and :interim will be true for non-release builds.
I don't think :qualifier is used correctly here (at least if you want
to give it the same meaning as what was suggested previously in the
thread).
The qualifier is there to be able to produce several different outputs
(e.g. jars in our case) from the same version number.
A version is fully qualified with :major + :minor + :incremental + :interim
An output made from the version is fully qualified with :major +
:minor + :incremental + :interim + :qualifier.
If we look at what are the different outputs currently are for
clojure, :qualifier can have 3 values:
"" (empty string) : for producing clojure-M.m.i.jar
"slim" : for producting clojure-M.m.i-slim.jar
"sources" : for producing clojure-M.m.i-sources.jar
:qualifier will be needed in projects which depend upon clojure, to
fully qualify which jar among the 3 possibilities one want to depend
upon.
Regards,
--
Laurent
:qualifier seems totally appropriate here, sorry for the noise,
--
Laurent
2009/4/22 Laurent PETIT <lauren...@gmail.com>:
Here a patch that allows to initialize from ant and from a file
version.properties the values in *clojure-version*.
The patch only addresses the problematic of having a single place for
version attributes.
Having the ant build also use these properties for creating correctly
numbered jars is not part of the patch.
Note that I had to create a new file, src/clj/clojure/core_version.clj
, which is created by ant as a combination of template file
core_version-template.clj and the properties from version.properties.
You'll see that if you don't like the names of the keys in
version.properties, build.xml is the single place where to change them
(apart from version.properties, of course).
Also, if you don't like the name version.properties (e.g. if it should
be named project.properties or whatever for easing maven users), then
you just have to change its occurence in build.xml too.
If you like it, it can file an issue to google code and attach the patch,
Regards,
--
Laurent
Well, I tried to keep close to the idea of having the version numbers
"built-in", similarly to what was commited where it was also not read
from a "simpler file" at load time.
> What about clojure.jar containing a properties file it reads at load time?
Why not, indeed ? The file would have to placed in the classpath, e.g.
in directory src/jvm/clojure/lang or src/clj/clojure.
> Could the same file be read by the various builds?
For ant, yes.
For maven2, it's more complex.
Indeed, I have read past the entire reference of the pom, searched
through the ml, and it seems that it's not possible at all to have
maven2 read properties file but its own which are not suitable for our
purpose.
So I that even if we don't generate a clojure source file by reading
version.properties at load time from the classpath, it will be
difficult to avoid having to generate the maven2 pom.xml file from a
pom-template.xml ...
Not that it would be difficult, it's just a matter of adding a
init-mvn task in the ant build.xml, and make all mvn related ant tasks
depend on it.
Concerning what Howard suggested, having the maven2 pom.xml file be
the reference where the version information is placed, I can't say I
like this idea very much.
That's because maven2 pom.xml is not as structured as you have
structured the current version information (maven2 just has a single
"version" element where you place whatever you want, it's not
decomposed into major, minor, ... so it will be more difficult to do
the pattern matching :-).
And also, maven2 pom.xml is not the master build file, it's ant, so it
sounds weird to have ant go parse maven2.xml file to extract the
versioning information.
My 0,02€,
--
Laurent
Christophe
--
Professional: http://cgrand.net/ (fr)
On Clojure: http://clj-me.blogspot.com/ (en)