Git, the D package manager

Russel Winder via Digitalmars-d digitalmars-d at puremagic.com
Fri Feb 6 03:04:45 PST 2015


On Thu, 2015-02-05 at 18:01 +0100, Sönke Ludwig via Digitalmars-d wrote:
> 
[…]
>  I'm now just left wondering what it is that is "fundamentally 
> flawed". Everything mentioned so far is either
> bugs or missing functionality, or rather just mostly missing 
> convenience.

The core problem is the use of a JSON file to express the definition 
of the project. This sort of specification is fine for dependency but 
not sufficient for build.

Make is a fine external DSL for dependencies, but everything else 
relies on the action language, generally Bash. GNU Make adds macros 
and a whole slew of things to try and make things better, all of them 
adding more imperative aspects.

Autotools is a wonderful M4 edifice, but not a solution to the 
problems of project management Make despite many years of people 
actually succeeding in doing it.

CMake has a DSL for describing build, not so good on the project 
description side, but in the end the language is ugly, underpowered 
and reliant on Make.

SCons is not perfect, but it beats Make and CMake by creating an 
internal DSL on Python. Waf takes aspects of this further and makes 
Autotools look a bit ill. There is a natural balance 

Go delegates to a DVCS all dependency issues, everything build-wise is 
totally by convention. It works but the hassle people are finding with 
repeatable builds leads to conventions as per gopkg.in.

Ant, hummm… started out as a platform independent version on Make, 
used XML for build specification and claimed to be declarative. 
Looking at Ant scripts these days, the hoops people go through to 
construct imperative programs in XML are amazing. The only alternative 
is to write a new task, which lots of people have to do.

Maven tried to go the project specification, and partly succeeded. 
Artefact repository approach a huge win. Specification in XML, yuk. 
Attempt at totally convention based build only partly worked. Lots of 
people have to write plugins to get the process they need for their 
goals.

Gradle fixed the transitive dependency tracking problems of Maven and 
has Groovy specifications. Yes there is a lot of purely declarative 
convention-based stuff, quite right too, but the ability to trivially 
add the extra bit of imperative in the build specification, stops the 
mess of Maven, Ant, CMake, Make.

SBT tries to use Scala as a project and build specification language. 
For simple projects, a few declarative lines are all that is needed. 
However for anything complicated you end up going outside the 
convention-only, but like Gradle and unlike Maven you can do this. 
SBTs major problem is Scala compile time for non-trivial project 
specification. Hence the need for a build daemon, a route Gradle has 
had to go as well due to infrastructure start-up time.

I could turn this into a better essay, but the above gives the main 
threads of the argument: project specification can be declarative, 
build specification is best as declarative as possible, convention-
based, but not totally declarative.

(I now I should mention tup here but I still haven't used it enough to 
know anything real about it.)

> Things may not (yet) be ideal, but fundamentally DUB is nothing more 
> than a tool built on a defined abstract package description format 
> (vs. a procedural build description). If you (or anyone else for 
> that matter)
> want to say that using a descriptive format is fundamentally flawed 
> then
> I'd be grateful for some additional substantiation. Otherwise there 
> is nothing "fundamental" in the system that I know of.

The fundamental problem here is that project specification and build 
specification is not either declarative or imperative.  From 1977 
onwards we have a trail of evidence that shows it is part declarative 
(as much as possible), but part imperative (as little as possible, but 
necessary for non-trivial projects).

Sticking with JSON as the only specification notation for Dub will 
inevitably lead people to have to hack or find another tool. The 
solution would be to either:

– Treat the JSON specification for dependency management only and use 
something else for build description so as not to be constrained by 
the only convention. 

– switch to an internal DSL so as to have mostly declarative but 
imperative as needed description of project, dependency and build 
process.


-- 
Russel.
=============================================================================
Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder at ekiga.net
41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel at winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20150206/a54c37da/attachment-0001.sig>


More information about the Digitalmars-d mailing list