On Friday, 16 February 2018 at 22:48:55 UTC, H. S. Teoh wrote:
On Fri, Feb 16, 2018 at 07:31:37PM +0000, Dmitry Olshansky via
Digitalmars-d wrote:
On Friday, 16 February 2018 at 18:16:12 UTC, H. S. Teoh wrote:
[...]
> If a dependent node requires network access, it forces
> network access every time the DAG is updated. This is slow,
> and also unreliable: the shape of the DAG could, in theory,
> change arbitrarily at any time outside the control of the
> user.
Oh, come on. Immutable artifacts make this matter trivial -
the first step is resolution, where you figure out what things
you already have by looking at metadata only, followed by
download the world (or part you do not have). Since specific
versions never change, nothing to worry about. Java folks had
this for ages with Maven and its ilk.
This assumes that the upstream server (1) consistently serves
the same data for the same version -- which in principle will
be the case, but unforeseen problems could break this
assumption;
Trivially enforced on public hubs such maven central.
(2) stores all versions forever, which is unlikely
to be always true.
Is in fact true. After all github stores the whole git repo why
would storing all distinct versions be too much.
In any case, dependence on network access for every invocation
of a build is unacceptable to me.
Well, it is not in the scheme outlined. Only the clean build is.
[...]
Also most if not all build systems will inevitably integrate
all of
the below in some way:
- compiler (internal as library or external as a build server)
- source code dependency resolution
- package dependency resolution
- package download or build
- execution of arbitrary tasks in form of plugins or external
tools
Me personally in love with plugins and general purpose
language available to define tasks. Scala’s SBT may have many
faults but plugins and extensibility make it awesome.
Personally, I find that the most useful build systems are those
that make no assumptions about how your products are built.
No thanks, I’d prefer convention then unique snowflake build
scripts if there us a choice. Sometimes you have to do go beyound
ghe basics but not too often.
SCons is a good example of this: for example, currently I have
a website completely built from ground-up by SCons, which
includes tasks like generating datasets, 3D models, using a PHP
filter to generate HTML, running a raytracer to generate
images, post-processing generated images, creating a dataset
from revision history and rendering graphs, running LaTeX to
generate PDF documentation, etc., and installing the products
of all of the foregoing into a staging directory that then gets
rsync'd to the remote
All of that can be done by any of modern tools with full language
+ DSL at your disposal, eg Gradle or SBT. In a sense SCons is the
same but without resolving packages.
Basically none of these steps involve the traditional
invocation of a compiler or built-in source code dependency
resolution. SCons has a very nice API for defining my own
dependency resolver for custom data formats that can leverage
all of the built-in scanning / depending resolving algorithms
that come with SCons.
I would not even consider any build system incapable of this
level of customization.
T