On Monday, 13 January 2014 at 19:18:17 UTC, Russel Winder wrote:
On Mon, 2014-01-13 at 15:05 +0000, Dejan Lekic wrote:
[…]
I simply define version in my main module (module which
contains the main() function). I am planning to submit a DIP
about something that is related to this. - I think we really
need a way to specify version of package, and maybe even
version of a module (similar to how the new Java module system
works - see project Jigsaw). D does not offer this. I humbly
believe it should be part of the language as it could be used
also for building versions of dynamic libraries.
For the version number to be available to SCons it cannot be
embedded in
the D source code. (Unless I am missing some really useful
trick. :-)
Anyway, back to the topic.
Say my main() function is in the org.dlang.myapp module.
If I want to have information about version of the artifact,
my myapp.d starts with the following two lines of D code:
module org.dlang.myapp;
version = 1_3_21_4; // major_minor_micro_qualifier
Python uses a tuple:
(<major>, <minor>, <bugfix>, <annotation>)
which seems to work very well: it needs very little
reprocessing to be
used in most contexts.
Naturally, build tool looks for the version line when I need
it.
template DeclareVersion(T...)
{
static if (T.length == 4)
{
alias Version = T;
}
else
{
static assert(false, "Version declaration must be of the
form Version!(major, minor, bugfix, annotation)");
}
}
enum Version
{
major = 0,
minor = 1,
bugfix = 2,
annotation = 3,
}
//main.d
alias AppVersion = DeclareVersion!("1", "3", "21", "4");
import std.stdio;
void main()
{
writeln(AppVersion[Version.major]);
}
Kind of neat, it's even accessible at compile time and gets
compiled into the source.