There has been a lot of recent activity around the <solution> task. Most people seem
to be using this to ensure that their builds proceed in
the correct sequence. Just for interest, I'd like to share an idea I had when I first
started using NAnt. For large projects, it still seems
to be a better solution than <solution>.
In the compilation commands (e.g. <csc> for C#) one must list the references that the
code makes to other assemblies. It strikes me that if
NAnt were to allow one to embed a <nant> tag inside each tag indicating an individual
reference, then this would create an elegant system of
cascading builds. In essence, "here is an assembly that you will need in order to
build the target, and here is the build file to build that
assembly." Since .NET explicitly disallows circular references between assemblies,
this would produce a system in which NAnt could walk a
tree of build files, rebuilding the system in the correct sequence every time. It
would be scalable (the size of the system and the number
of dependencies would not matter).
The problem I see with the <solution> system is that it assumes that the organization
of source files into projects (<solution>s) when the
software was built is an organization that will permanent. In my experience, the way
that source files are built and deployed often ceases
to make any sense after the (business) project is over, so one is left with a bunch of
solution files that don't bear much resemblance to
the way that the software is logically organized.
The only problem I can see with this idea is that one would have to change the use of
the generic <includes> tag under <references> to
something more particular, such as <reference>. However, I still think it would be
worth the loss of a little orthogonality:
<csc target="${target.type}" output="${project.output}" debug="${debug}"
rootnamespace="${rootNamespace}" win32icon="App.ico">
<sources>
<includes name="AssemblyInfo.cs" />
...
<includes name="TextPrintDocument.cs" />
</sources>
<resources>
<includes name="WindowsCrystalReportViewer.resx" />
<includes name="WindowsPrintingPasswordDialog.resx" />
<includes name="WindowsPrintPreviewDialogExtended.resx" />
</resources>
<references>
<reference name="System.dll" />
<reference name="System.Data.dll" />
<reference name="System.Drawing.dll" />
<reference name="System.Windows.Forms.dll" />
<reference name="System.Xml.dll" />
<reference name="${dir.lib}/AgamaLibrary.dll">
<nant buildfile="../AgamaLibrary/AgamaLibrary.build" target="build"/>
</reference>
<reference name="${dir.lib}/CrystalDecisions.Shared.dll" />
<reference name="${dir.lib}/CrystalDecisions.ReportSource.dll" />
<reference name="${dir.lib}/CrystalDecisions.CrystalReports.Engine.dll" />
<reference name="${dir.lib}/CrystalDecisions.Windows.Forms.dll" />
<reference name="${dir.output}/Interop.Office.dll">
<call target="Office-build"/>
</reference>
<reference name="${dir.output}/Interop.Outlook.dll">
<call target="Outlook-build"/>
</reference>
</references>
</csc>
As you can see, one could use the same mechanism to call other targets within the same
build file in order to build interop assemblies and
things like that. Although this offers no functional advantage, it does organize the
build file more logically, in effect documenting why
the other targets exist.
Does anyone else think that this would be a worthy enhancement to NAnt?
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive? Does it
help you create better code? SHARE THE LOVE, and help us help
YOU! Click Here: http://sourceforge.net/donate/
_______________________________________________
Nant-users mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/nant-users