DelftShell Build Logica.

Hieronder staat de build logica beschreven van DelftShell. Wees vrij om wijzigen etc aan te brengen zodat dit document kan worden opgenomen in referentie materiaal. Hieronder staat een voorstel voor een nieuw build proces en ook hier zijn suggesties om het simpeler of sneller te maken natuurlijk nodig.

Martijn

Voor het builden van DelftShell inclusief plugins wordt nu gebruikt gemaakt van een aantal shared libraries en post-build events. Dit document probeert zo helder mogelijk het proces van builden en creëren van een 'loader' te beschrijven.

delft-tools\lib(1)
delft-tools\apps\DelftShell\modules\DelftShell.Loader\bin\Debug
delft-tools\apps\DelftShell\modules\DelftShell.Loader\bin\plugins(5)
delft-tools\apps\DelftShell\lib(2)
delft-tools\apps\DelftShellPlugins
delft-tools\apps\DelftShellPlugins\NetCdf
delft-tools\apps\DelftShellPlugins\NetCdf\lib(3)
delft-tools\apps\DelftShellPlugins\NetCdf\modules\
delft-tools\apps\DelftShellPlugins\NetCdf\modules\NetCDF\bin\Debug(4)

De lib directories (1,2,3) zijn er voor om 3rd party dlls te herbergen. NB: waarom lib (2)?

Allereerst worden onafhankelijke dlls (Bijvoorbeeld GeoApi.dll) gebuild met eventueel PostSharp post-build actie. Deze dll worden gereferenced door ander projecten.
De meer interessante projecten zijn de plugins en de loader.

1 Build plugins
1.1 Build plugin
1.2 Run postbuild events voor deze plugin
1.2.1 Run PostSharpPostBuild.cmd (\\bin\PostSharpPostBuild.cmd)
1.2.1.1 TODO: specify what this .cmd does

1.2.2 Run plugin PostBuild.cmd (\\bin\PluginPostBuild.cmd)
1.2.2.1 Creëer directory voor plugin in de loader\bin\plugins
1.2.2.2 Copieer alle dlls uit bin directory van plugin(4) naar bin\plugin directory binnen de loader(5).
1.2.2.3 Copieer alle dll.config files uit bin directory van plugin naar bin\plugin directory binnen de loader.
1.2.2.4 Verwijder bepaalde dlls als ze bestaan.(de lijst van welke is lang en staat in de .cmd file).
1.2.3 Doe plugin specifieke logica. Bijvoorbeeld: plugins.SharpMapGis kopieert alle bestanden uit de root lib (2) naar de plugin dir (5) binnen de loader en kopieert daarna nog van alles.

2 Build loader
2.1 Build de loader
2.2 Run postbuild events van de loader
2.2.1 Verwijder Nhibernate.dlls als deze er zijn.
2.2.2 Verwijder NetTopologySuite.dlls als deze er zijn.
2.2.3 Copieer een paar dllls uit de hoofd lib dir naar de build directory.

Problemen huidige structuur:
1 Verschillende build acties voor verschillende plugins. Kopieeer acties voor specifieke plugin slecht gedocumenteerd.
2 PostSharpPostBuild doet veel (onnodige?) kopieeracties.
3 3 lib directories! (1 voor plugins 1 voor shared kan ik begrijpen) waarvan men moet bijhouden wat waar wordt gebruikt.

Voorstel nieuwe structuur:

KISS.
Doel maak het simpeler en reduceer het aantal kopieer acties.

Veranderingen:
1 Plugin kopieert zichzelf naar bin van de loader (zonder subdir) en kijkt of afhankelijke dlls ook moeten worden gekopieerd (if !Exists copy op de hele bin van de plugin). Een grote bak met alle dlls dus.En geen specificatie van file-names in postbuild event.
2 PostSharp kan misschien sneller (zonder kopieer acties)
3 Geen extra acties binnen build loader.
4 Verwijder overbodige lib directory (2)
5 Split projecten zodat er minder vaak gebuild hoeft te worden

1 Build plugin
1.1 Build plugin
1.2 Run postbuild voor plugin
1.2.1 Run PostSharpPostBuild
1.2.2 Kopieer inhoud van bin directory van plugin naar bin van de loader. Doe dit alleen voor non-existing files.

2 Build loader
2.1 Run Postbuild events van de loader

  • No labels

9 Comments

  1. Unknown User (don)

    1. Copying all into loader/bin/ - won't make things faster, but certainly much less simple, what can really help is adding check in PluginPostBuild.cmd: foreach dll in plugin TargetDir, if dll exists in loader/bin - do nothing, otherwise copy dll to loader/bin/<plugin-name>/.

    Having plugins in a separate directories is absolute a must, otherwise

    • it will be a big recycle bin which will grow in the future like current version, please don't do it
    • disabling plugin won't be that simple, dependencies will be uncler (loader will contain gdal.dll, org.dll, Nhibernate.dll, delft_flow_openmi.dll, OpenMI.Oatc.Sdk.dll and many other things. Plus some model dlls may actually use different version of FORTRAN - they must be in a separate folders, this is a requirement.
    • using different version of the libraries in different plugins won't be possible (e.g. upgrade from old file format to a new one - load old version of DataAccess).

    When current structure appeared - KISS, YAGNI, etc. principles were used as well (wink), but also

    ... "Everything should be made as simple as possible, but not simpler". Kent Beck defines four traits of simplicity: passes all tests, reveals intentions, no duplication, and smallest codebase. In other words, "simple" software should do what it is supposed to do, but no more, and it should do it with the least amount of code possible, while still being easy to understand...

    If we put all in one directory - we will violate "... while still being easy to understand." principle.

    Note that all dlls in <plugin>/lib/ are supposed to be used only by one plugin, in this case they should be copied only once to the target loader/bin/<plugin> directory. Otherwise they can be moved to the top-level lib/ and then from there they should be also copied only once. So I won't expect any speed-ups there. Digg more (smile).

    2. improve PostSharp: sounds like a good option, I added copy action since there were conflicts between PostSharp and VS, maybe it is already fixed.

    Also we should probably remove PostSharp interception of fields - this probably also makes compilation slower, plus run-time as well.

    3. Geen extra acties binnen build loader - also sounds fine, except 1 time copy of all dlls from top-level lib. Loader bin/Debug currently contains only DelftShell and (1) libraries shared by any other component like DelftShell, DelftTools or any plugin and everything there is loaded during system start-up.

    Any other copy/delete actions there must be gone.

    4. DelftShell/lib - can be removed, it won't change anything. lib is there from old version where it contained many things, now they're move to plugins. DelftShell is just another component, like any plugin project (README.txt):

    <component>................... plugin, framework, top-level gui, etc.
       +---data/
       +---doc/
       +---lib/
       +---modules/
             +----Project1/
             +----Project2/
             +----Project3/
       +---tests/
             +----Project1.Tests/
             +----Project2.Tests/
             +----Project3.IntegrationTests/
    

    5. yep, dependencies should be reduced, we should analyze dependencies and decouple things a little (not too much). For example DelftTools.DataObjects depends on GeoAPI.dll which doesn't change much, but also on NTS and NTS.Extensions - that's not necessary, if we will use GeometryFactory - this dependency can be removed. There are probably other examples as well. Actions:

    • analyze top-level libraries and check dependencies between them, check what can be decoupled.
    • decouple all plug-ins from each-other (use IoC, DI instead)
    • introduce Windsor.Castle to resolve dependencies at run-time

    Current order of project builds is (from NDepend):

    DelftTools.Utils
    DelftTools.Units
    DelftTools.Core
    DelftTools.Gui
    DelftTools.Gui.Swf.Controls
    DelftTools.DataObjects.Functions
    GeoAPI
    GeoAPI.Extensions
    NetTopologySuite
    DelftTools.DataObjects
    DelftShell.Core
    DelftShell.Gui
    DelftShell.Loader
    DelftShell.Plugins.CommonTools
    DelftShell.Plugins.Data.NHibernate
    DelftModelApi.Net
    DelftModelServer
    NetTopologySuite.Extensions
    DelftShell.Plugins.DelftModels.FlowModel
    DelftShell.Plugins.NetCDF
    SharpMap
    SharpMap.Extensions
    SharpMap.UI
    DelftShell.Plugins.SharpMapGis
    DelftShell.Plugins.NetworkEditor
    DelftShell.Plugins.DeveloperTools
    DelftShell.Plugins.ImportExport
    DelftShell.Plugins.UdUnits
    DelftShell.Plugins.ProjectExplorer
    

    Now I'm doing a small test building DelftTools.DataObjects.Functions.Test and getting the output below (takes 4sec which is good enouth?), some things there maybe can be reduced, e.g. gui (warning) why does it run sgen.exe???:

    _
    ------ Build started: Project: DelftTools.Utils, Configuration: Debug Any CPU ------
    DelftTools.Utils -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.Utils\bin\Debug\DelftTools.Utils.dll
    ------ Build started: Project: DelftTools.Units, Configuration: Debug Any CPU ------
    DelftTools.Units -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.Units\bin\Debug\DelftTools.Units.dll
    ------ Build started: Project: GeoAPI, Configuration: Debug Any CPU ------
    GeoAPI -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\GeoAPI\bin\Debug\GeoAPI.dll
    ------ Build started: Project: DelftTools.DataObjects.Functions, Configuration: Debug Any CPU ------
    DelftTools.DataObjects.Functions -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.DataObjects.Function\bin\Debug\DelftTools.DataObjects.Functions.dll
    ------ Build started: Project: GeoAPI.Extensions, Configuration: Debug Any CPU ------
    GeoAPI.Extensions -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\GeoAPI.Extensions\bin\Debug\GeoAPI.Extensions.dll
    ------ Build started: Project: NetTopologySuite, Configuration: Debug Any CPU ------
    NetTopologySuite -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\NetTopologySuite\bin\Debug\NetTopologySuite.dll
    ------ Build started: Project: DelftTools.Core, Configuration: Debug Any CPU ------
    DelftTools.Core -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.Core\bin\Debug\DelftTools.Core.dll
    ------ Build started: Project: DelftTools.DataObjects, Configuration: Debug Any CPU ------
    DelftTools.DataObjects -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.DataObjects\bin\Debug\DelftTools.DataObjects.dll
    ------ Build started: Project: DelftTools.Gui, Configuration: Debug Any CPU ------
    C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sgen.exe /assembly(big grin):\src\DelftTools\apps\DelftTools\modules\DelftTools.Gui\obj\Debug\DelftTools.Gui.dll /proxytypes /reference(big grin):\src\DelftTools\apps\DelftTools\modules\DelftTools.Core\bin\Debug\DelftTools.Core.dll /reference(big grin):\src\DelftTools\apps\DelftTools\modules\DelftTools.DataObjects\bin\Debug\DelftTools.DataObjects.dll /reference(big grin):\src\DelftTools\apps\DelftTools\modules\DelftTools.Utils\bin\Debug\DelftTools.Utils.dll /reference:..\..\..\..\lib\log4net.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /compiler:/keyfile:DelftTools.snk
    DelftTools.Gui -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.Gui\bin\Debug\DelftTools.Gui.dll
    ------ Build started: Project: DelftTools.Gui.Swf.Controls, Configuration: Debug Any CPU ------
    DelftTools.Gui.Swf.Controls -> D:\src\DelftTools\apps\DelftTools\modules\DelftTools.Gui.Swf.Controls\bin\Debug\DelftTools.Gui.Swf.Controls.dll
    ------ Build started: Project: NetTopologySuite.Extensions, Configuration: Debug Any CPU ------
    NetTopologySuite.Extensions -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\NetTopologySuite.Extensions\bin\Debug\NetTopologySuite.Extensions.dll
    ------ Build started: Project: SharpMap, Configuration: Debug Any CPU ------
    SharpMap -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\SharpMap\bin\Debug\SharpMap.dll
    ------ Build started: Project: SharpMap.Extensions, Configuration: Debug Any CPU ------
    SharpMap.Extensions -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\SharpMap.Extensions\bin\Debug\SharpMap.Extensions.dll
    ------ Build started: Project: SharpMap.UI, Configuration: Debug Any CPU ------
    SharpMap.UI -> D:\src\DelftTools\apps\DelftShellPlugins\SharpMapGis\modules\SharpMap.UI\bin\Debug\SharpMap.UI.dll
    ------ Build started: Project: DelftTools.TestUtils, Configuration: Debug Any CPU ------
    DelftTools.TestUtils -> D:\src\DelftTools\apps\DelftTools\tests\DelftTools.TestUtils\bin\Debug\DelftTools.TestUtils.dll
    ------ Build started: Project: DelftTools.DataObjects.Functions.Tests, Configuration: Debug Any CPU ------
    DelftTools.DataObjects.Functions.Tests -> D:\src\DelftTools\apps\DelftTools\tests\DelftTools.DataObjects.Functions.Tests\bin\Debug\DelftTools.DataObjects.Functions.Tests.dll
    ========== Build: 16 succeeded or up-to-date, 0 failed, 0 skipped ==========
    _

  2. Unknown User (don)

    Assemblies Dependencies

    Assembly

    Depends on...*

    Is referenced by...*

    DelftTools.Utils v1.0.0.0

    mscorlib v2.0.0.0 ; PostSharp.Laos v1.0.0.0 ; System v2.0.0.0 ; System.Xml v2.0.0.0 ;log4net v1.2.10.0 ; System.Data v2.0.0.0 ; System.Core v3.5.0.0 ; PostSharp.Public v1.0.0.0; NDepend.Helpers.FileDirectoryPath v1.0.0.0 ; ICSharpCode.SharpZipLib v0.85.1.271 ;

    DelftShell.Gui v1.0.0.0 ; DelftShell.Core v1.1.0.0 ; DelftTools.Core v1.0.0.0 ;DelftTools.DataObjects v1.0.0.0 ; DelftTools.Gui v1.0.0.0 ; DelftTools.DataObjects.Functions v1.0.0.0 ; DelftTools.Units v1.0.0.0 ; DelftTools.Gui.Swf.Controls v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; DelftShell.Plugins.CommonTools v1.0.0.0 ; DelftShell.Plugins.Data.NHibernate v1.0.0.0 ;DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; DelftShell.Plugins.NetCDF v1.0.0.0 ;SharpMap.Extensions v0.9.3385.26911 ; SharpMap.UI v0.9.3385.26925 ;DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.ImportExport v1.0.0.0 ;DelftShell.Plugins.ProjectExplorer v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ; NetTopologySuite.Extensions v1.0.0.0 ; SharpMap v0.9.3385.26896 ;

    DelftTools.Units v1.0.0.0

    mscorlib v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ;

    DelftShell.Core v1.1.0.0 ; DelftTools.Core v1.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ;DelftTools.DataObjects.Functions v1.0.0.0 ; DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;DelftShell.Plugins.UdUnits v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    DelftTools.Core v1.0.0.0

    DelftTools.Utils v1.0.0.0 ; mscorlib v2.0.0.0 ; System v2.0.0.0 ; DelftTools.Units v1.0.0.0 ;System.Drawing v2.0.0.0 ; log4net v1.2.10.0 ; PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    DelftShell.Gui v1.0.0.0 ; DelftShell.Core v1.1.0.0 ; DelftTools.Gui v1.0.0.0 ;DelftShell.Plugins.CommonTools v1.0.0.0 ; DelftShell.Plugins.Data.NHibernate v1.0.0.0 ;DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; DelftShell.Plugins.NetCDF v1.0.0.0 ;DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.ImportExport v1.0.0.0 ;DelftShell.Plugins.ProjectExplorer v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    DelftTools.Gui v1.0.0.0

    System v2.0.0.0 ; mscorlib v2.0.0.0 ; System.Drawing v2.0.0.0 ; DelftTools.Core v1.0.0.0 ;log4net v1.2.10.0 ; DelftTools.Utils v1.0.0.0 ; System.Xml v2.0.0.0 ;

    DelftShell.Gui v1.0.0.0 ; DelftShell.Loader v1.0.0.0 ; DelftTools.Gui.Swf.Controls v1.0.0.0 ;DelftShell.Plugins.CommonTools v1.0.0.0 ; DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.ImportExport v1.0.0.0 ;DelftShell.Plugins.ProjectExplorer v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    DelftTools.Gui.Swf.Controls v1.0.0.0

    DelftTools.Utils v1.0.0.0 ; mscorlib v2.0.0.0 ; DelftTools.Gui v1.0.0.0 ; TeeChart v3.5.3225.32184 ; System.Windows.Forms v2.0.0.0 ; System v2.0.0.0 ; System.Drawing v2.0.0.0 ; System.Design v2.0.0.0 ; log4net v1.2.10.0 ; System.Data v2.0.0.0 ;DevComponents.DotNetBar v7.7.0.0 ; DevExpress.XtraEditors.v8.2 v8.2.4.0 ;DevExpress.XtraGrid.v8.2 v8.2.4.0 ; DevExpress.Data.v8.2 v8.2.4.0 ; DevExpress.Utils.v8.2 v8.2.4.0 ; PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    DelftShell.Gui v1.0.0.0 ; DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;DelftShell.Plugins.ProjectExplorer v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ; SharpMap v0.9.3385.26896 ;

    DelftTools.DataObjects.Functions v1.0.0.0

    System v2.0.0.0 ; mscorlib v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ; log4net v1.2.10.0 ;DelftTools.Units v1.0.0.0 ; System.Core v3.5.0.0 ; PostSharp.Public v1.0.0.0 ;PostSharp.Laos v1.0.0.0 ;

    DelftTools.DataObjects v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ;DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; DelftShell.Plugins.NetCDF v1.0.0.0 ;SharpMap.Extensions v0.9.3385.26911 ; SharpMap.UI v0.9.3385.26925 ;DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ; NetTopologySuite.Extensions v1.0.0.0 ; SharpMap v0.9.3385.26896 ;

    GeoAPI v1.1.0.0

    mscorlib v2.0.0.0 ;

    DelftTools.DataObjects v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ;DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; SharpMap.Extensions v0.9.3385.26911 ;SharpMap.UI v0.9.3385.26925 ; DelftShell.Plugins.DeveloperTools v1.0.0.0 ;DelftShell.Plugins.SharpMapGis v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ;NetTopologySuite.Extensions v1.0.0.0 ; SharpMap v0.9.3385.26896 ; NetTopologySuite v1.7.3.26867 ;

    GeoAPI.Extensions v1.0.0.0

    DelftTools.DataObjects.Functions v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; mscorlib v2.0.0.0 ;GeoAPI v1.1.0.0 ;

    DelftTools.DataObjects v1.0.0.0 ; DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;DelftShell.Plugins.NetCDF v1.0.0.0 ; SharpMap.Extensions v0.9.3385.26911 ; SharpMap.UI v0.9.3385.26925 ; DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ; NetTopologySuite.Extensions v1.0.0.0 ;SharpMap v0.9.3385.26896 ;

    NetTopologySuite v1.7.3.26867

    mscorlib v2.0.0.0 ; GeoAPI v1.1.0.0 ; System v2.0.0.0 ; System.Data v2.0.0.0 ; System.Xml v2.0.0.0 ;

    DelftTools.DataObjects v1.0.0.0 ; DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;SharpMap.Extensions v0.9.3385.26911 ; SharpMap.UI v0.9.3385.26925 ;DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ; NetTopologySuite.Extensions v1.0.0.0 ; SharpMap v0.9.3385.26896 ;

    DelftTools.DataObjects v1.0.0.0

    mscorlib v2.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; System.Xml v2.0.0.0 ; System v2.0.0.0 ; GeoAPI v1.1.0.0 ; DelftTools.DataObjects.Functions v1.0.0.0 ;System.Drawing v2.0.0.0 ; DelftTools.Units v1.0.0.0 ; NetTopologySuite v1.7.3.26867 ;System.Core v3.5.0.0 ; PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    DelftShell.Gui v1.0.0.0 ; DelftShell.Plugins.CommonTools v1.0.0.0 ;DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; DelftShell.Plugins.DeveloperTools v1.0.0.0 ;DelftShell.Plugins.SharpMapGis v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    DelftShell.Core v1.1.0.0

    mscorlib v2.0.0.0 ; DelftTools.Core v1.0.0.0 ; System v2.0.0.0 ; log4net v1.2.10.0 ;DelftTools.Units v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; System.Configuration v2.0.0.0 ;

    DelftShell.Gui v1.0.0.0 ;

    DelftShell.Gui v1.0.0.0

    DelftTools.Gui v1.0.0.0 ; mscorlib v2.0.0.0 ; System.Windows.Forms v2.0.0.0 ;DevComponents.DotNetBar v7.7.0.0 ; System.Data v2.0.0.0 ; log4net v1.2.10.0 ;Netron.NetronLight v2.5.2884.25079 ; System v2.0.0.0 ; DelftTools.Core v1.0.0.0 ;System.Drawing v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ; System.Xml v2.0.0.0 ;DelftTools.Gui.Swf.Controls v1.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ;System.Configuration v2.0.0.0 ; DelftShell.Core v1.1.0.0 ; System.Core v3.5.0.0 ;PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    DelftShell.Loader v1.0.0.0 ;

    DelftShell.Loader v1.0.0.0

    mscorlib v2.0.0.0 ; log4net v1.2.10.0 ; DelftShell.Gui v1.0.0.0 ; DelftTools.Gui v1.0.0.0 ;System.Windows.Forms v2.0.0.0 ; System v2.0.0.0 ;

    -

    DelftShell.Plugins.CommonTools v1.0.0.0

    mscorlib v2.0.0.0 ; DelftTools.Gui v1.0.0.0 ; DelftTools.Core v1.0.0.0 ;System.Windows.Forms v2.0.0.0 ; System.Drawing v2.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ; System v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ;

    -

    DelftShell.Plugins.Data.NHibernate v1.0.0.0

    mscorlib v2.0.0.0 ; NHibernate v2.1.0.1002 ; DelftTools.Core v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; System v2.0.0.0 ; log4net v1.2.10.0 ; System.Drawing v2.0.0.0 ; System.Data v2.0.0.0 ; PostSharp.Public v1.0.0.0 ;

    -

    DelftModelApi.Net v1.0.0.0

    mscorlib v2.0.0.0 ; log4net v1.2.10.0 ; System.Xml v2.0.0.0 ;

    DelftModelServer v1.0.0.0 ; DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;

    DelftModelServer v1.0.0.0

    mscorlib v2.0.0.0 ; DelftModelApi.Net v1.0.0.0 ; log4net v1.2.10.0 ; System v2.0.0.0 ;System.Runtime.Remoting v2.0.0.0 ;

    DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ;

    NetTopologySuite.Extensions v1.0.0.0

    DelftTools.DataObjects.Functions v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; mscorlib v2.0.0.0 ; NHibernate v2.1.0.1002 ; GeoAPI v1.1.0.0 ; NetTopologySuite v1.7.3.26867 ; System.Data v2.0.0.0 ; PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;System v2.0.0.0 ;

    DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; DelftShell.Plugins.NetCDF v1.0.0.0 ;SharpMap.Extensions v0.9.3385.26911 ; DelftShell.Plugins.DeveloperTools v1.0.0.0 ;DelftShell.Plugins.SharpMapGis v1.0.0.0 ; SharpMap v0.9.3385.26896 ;

    DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0

    mscorlib v2.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ; DelftTools.Core v1.0.0.0 ;DelftTools.Gui v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; DelftTools.DataObjects.Functions v1.0.0.0 ; System.Windows.Forms v2.0.0.0 ; System.Drawing v2.0.0.0 ; log4net v1.2.10.0 ;DelftModelServer v1.0.0.0 ; DelftModelApi.Net v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ;System v2.0.0.0 ; System.Core v3.5.0.0 ; NetTopologySuite v1.7.3.26867 ; GeoAPI v1.1.0.0 ;NetTopologySuite.Extensions v1.0.0.0 ; DelftTools.Units v1.0.0.0 ;DelftTools.Gui.Swf.Controls v1.0.0.0 ; PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    DelftShell.Plugins.DeveloperTools v1.0.0.0 ;

    DelftShell.Plugins.NetCDF v1.0.0.0

    mscorlib v2.0.0.0 ; DelftTools.Core v1.0.0.0 ; DelftTools.DataObjects.Functions v1.0.0.0 ;DelftTools.Utils v1.0.0.0 ; log4net v1.2.10.0 ; netcdf-4.0 v0.0.0.0 ;IKVM.OpenJDK.ClassLibrary v0.36.0.11 ; System.Drawing v2.0.0.0 ;NetTopologySuite.Extensions v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; System.Core v3.5.0.0 ;System v2.0.0.0 ;

    DelftShell.Plugins.SharpMapGis v1.0.0.0 ;

    SharpMap v0.9.3385.26896

    mscorlib v2.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; System.Data v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ; System.Web v2.0.0.0 ; NetTopologySuite v1.7.3.26867 ; GeoAPI v1.1.0.0 ;System.Xml v2.0.0.0 ; System v2.0.0.0 ; log4net v1.2.10.0 ; System.Drawing v2.0.0.0 ;ProjNET v1.1.2854.24700 ; PostSharp.Public v1.0.0.0 ; NetTopologySuite.Extensions v1.0.0.0; DelftTools.DataObjects.Functions v1.0.0.0 ; DelftTools.Gui.Swf.Controls v1.0.0.0 ;System.Windows.Forms v2.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    SharpMap.Extensions v0.9.3385.26911 ; SharpMap.UI v0.9.3385.26925 ;DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ;DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    SharpMap.Extensions v0.9.3385.26911

    mscorlib v2.0.0.0 ; SharpMap v0.9.3385.26896 ; DelftTools.Utils v1.0.0.0 ;DelftTools.DataObjects.Functions v1.0.0.0 ; System.Data v2.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; GeoAPI v1.1.0.0 ; System.Drawing v2.0.0.0 ; log4net v1.2.10.0 ; gdal_csharp v1.0.2965.23935 ; NetTopologySuite v1.7.3.26867 ; ogr_csharp v1.0.2965.23935 ; Nini v1.1.0.0 ; System v2.0.0.0 ; System.Core v3.5.0.0 ; NetTopologySuite.Extensions v1.0.0.0 ;PostSharp.Public v1.0.0.0 ;

    DelftShell.Plugins.SharpMapGis v1.0.0.0 ;

    SharpMap.UI v0.9.3385.26925

    mscorlib v2.0.0.0 ; System.Windows.Forms v2.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; System v2.0.0.0 ; GeoAPI v1.1.0.0 ; SharpMap v0.9.3385.26896 ; System.Drawing v2.0.0.0 ; log4net v1.2.10.0 ; DelftTools.Utils v1.0.0.0 ; Irrlicht.NET v0.8.1.0 ;DelftTools.DataObjects.Functions v1.0.0.0 ; System.Web v2.0.0.0 ; PostSharp.Public v1.0.0.0 ; System.Data v2.0.0.0 ; NetTopologySuite v1.7.3.26867 ; PostSharp.Laos v1.0.0.0 ;

    DelftShell.Plugins.SharpMapGis v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    DelftShell.Plugins.SharpMapGis v1.0.0.0

    DelftTools.Gui v1.0.0.0 ; mscorlib v2.0.0.0 ; System.Windows.Forms v2.0.0.0 ;DelftTools.Core v1.0.0.0 ; SharpMap v0.9.3385.26896 ; System v2.0.0.0 ; NHibernate v2.1.0.1002 ; SharpMap.UI v0.9.3385.26925 ; log4net v1.2.10.0 ; GeoAPI v1.1.0.0 ;System.Drawing v2.0.0.0 ; DelftTools.Gui.Swf.Controls v1.0.0.0 ;DelftTools.DataObjects.Functions v1.0.0.0 ; NetTopologySuite.Extensions v1.0.0.0 ;GeoAPI.Extensions v1.0.0.0 ; DelftTools.Utils v1.0.0.0 ; SharpVectorBindings v0.3.1.27844 ;System.Data v2.0.0.0 ; SharpMap.Extensions v0.9.3385.26911 ; DelftShell.Plugins.NetCDF v1.0.0.0 ; NetTopologySuite v1.7.3.26867 ; System.Core v3.5.0.0 ; PostSharp.Public v1.0.0.0; SharpVectorCss v0.3.1.27844 ; System.Xml v2.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ;

    DelftShell.Plugins.DeveloperTools v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ;

    DelftShell.Plugins.NetworkEditor v1.0.0.0

    DelftTools.Gui v1.0.0.0 ; mscorlib v2.0.0.0 ; SharpMap v0.9.3385.26896 ;System.Windows.Forms v2.0.0.0 ; TeeChart v3.5.3225.32184 ; DelftTools.Gui.Swf.Controls v1.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ; SharpMap.UI v0.9.3385.26925 ; DelftTools.Core v1.0.0.0 ; DelftShell.Plugins.SharpMapGis v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ; GeoAPI v1.1.0.0 ; System.Drawing v2.0.0.0 ; System v2.0.0.0 ; NetTopologySuite v1.7.3.26867 ;log4net v1.2.10.0 ; DelftTools.Utils v1.0.0.0 ; System.Data v2.0.0.0 ; PostSharp.Public v1.0.0.0 ; DelftTools.DataObjects.Functions v1.0.0.0 ; DevExpress.XtraEditors.v8.2 v8.2.4.0; DelftTools.Units v1.0.0.0 ; DevExpress.XtraGrid.v8.2 v8.2.4.0 ;

    DelftShell.Plugins.DeveloperTools v1.0.0.0 ;

    DelftShell.Plugins.DeveloperTools v1.0.0.0

    DelftTools.Gui v1.0.0.0 ; DelftTools.Core v1.0.0.0 ; mscorlib v2.0.0.0 ; System.Drawing v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ; GeoAPI.Extensions v1.0.0.0 ;NetTopologySuite.Extensions v1.0.0.0 ; NetTopologySuite v1.7.3.26867 ; GeoAPI v1.1.0.0 ;DelftShell.Plugins.DelftModels.FlowModel v1.0.0.0 ; DelftTools.DataObjects v1.0.0.0 ;DelftTools.DataObjects.Functions v1.0.0.0 ; DelftShell.Plugins.NetworkEditor v1.0.0.0 ;DelftShell.Plugins.SharpMapGis v1.0.0.0 ; SharpMap v0.9.3385.26896 ;System.Windows.Forms v2.0.0.0 ; System v2.0.0.0 ;

    -

    DelftShell.Plugins.ImportExport v1.0.0.0

    DelftTools.Gui v1.0.0.0 ; mscorlib v2.0.0.0 ; DelftTools.Core v1.0.0.0 ; System.Drawing v2.0.0.0 ; DelftTools.Utils v1.0.0.0 ;

    -

    DelftShell.Plugins.UdUnits v1.0.0.0

    mscorlib v2.0.0.0 ; DelftTools.Units v1.0.0.0 ; System.Windows.Forms v2.0.0.0 ; System v2.0.0.0 ; netcdf-4.0 v0.0.0.0 ; IKVM.OpenJDK.ClassLibrary v0.36.0.11 ; System.Drawing v2.0.0.0 ;

    -

    DelftShell.Plugins.ProjectExplorer v1.0.0.0

    DelftTools.Gui v1.0.0.0 ; DelftTools.Core v1.0.0.0 ; mscorlib v2.0.0.0 ;System.Windows.Forms v2.0.0.0 ; log4net v1.2.10.0 ; DelftTools.Utils v1.0.0.0 ;System.Drawing v2.0.0.0 ; System v2.0.0.0 ; DelftTools.Gui.Swf.Controls v1.0.0.0 ;System.Core v3.5.0.0 ; PostSharp.Public v1.0.0.0 ; PostSharp.Laos v1.0.0.0 ;

    -

  3. Unknown User (don)

  4. Unknown User (don)

    Here some big part is Designer-generated code, plus NTS should be excluded

  5. Unknown User (muurman) AUTHOR

    Build times on my pc:

    Without PostSharp 2:45

    With PostSharp 1.0 via MSBuild 8 minutes
    With PostSharp 1.5 via MSBuild 7 minutes

    With PostSharp 1.0 via PostbuildEvent 7 minutes (current situation)
    With PostSharp 1.5 via PostbuildEvent not working (sad)

    Times may vary as compile is repeated. Also memory usage increases.

  6. Unknown User (muurman) AUTHOR

    Concerning PostSharp interception of fields: You could skip auto-generated backing-fields. Other fields
    should be intercepted since they can have a public property counterpart. eg:

        public class Person
        {
            private string name;
    
            public string Name
            {
                get { return name; }   
                set { name = value;}
            }
    
            private ChangeToBassie()
            {
                name = "bassie"
            }
        }
    

    Changing the private field name will result in a change in Name and should cause a propertychanged. Thus if we skip all private fields we should use public properties internally in the class as well (sad)

  7. Unknown User (don)

    Plugin
    ------

    DelftShell.Plugins.NetworkEditor

    call "$(SolutionDir)\bin\PluginPostBuild.cmd" "$(SolutionDir)" "$(TargetDir)" $(ProjectName)

    call "$(SolutionDir)\bin\PluginPostBuild.cmd" $(ProjectName) $(ConfigurationName) SharpMap
    call "$(SolutionDir)\bin\PluginPostBuild.cmd" $(ProjectName) $(ConfigurationName) SharpMap.UI
    call "$(SolutionDir)\bin\PluginPostBuild.cmd" $(ProjectName) $(ConfigurationName) SharpMap.Extensions
    call "$(SolutionDir)\bin\PluginPostBuild.cmd" $(ProjectName) $(ConfigurationName) NetTopologySuite
    call "$(SolutionDir)\bin\PluginPostBuild.cmd" $(ProjectName) $(ConfigurationName) NetTopologySuite.Extensions

    SharpMap.Extentions.Tests
    --------------------------

    call "$(SolutionDir)\bin\CopyNativeLibraries.cmd" $(ProjectName) $(ConfigurationName) SharpMap.Extensions


    call "$(SolutionDir)\bin\CopyNativeLibraries.cmd" $(ProjectName) $(ConfigurationName) SharpMap.Extensions SharpMap
    call "$(SolutionDir)\bin\CopyNativeLibraries.cmd" $(ProjectName) $(ConfigurationName) DelftShell.Plugins.FlowModel DelftShell.Plugins.FlowModel

    • to loader: copy plugin + their native libs (deploy)
    • to loader: copy unique dependent projects + their native libs of plugin (deploy)
    • to test project: copy native libraries of dependent projects to test output directory

    ====================================================================

    call "$(SolutionDir)\bin\PluginPostBuild.cmd" "$(SolutionDir)apps\DelftShell\modules\DelftShell.Loader\bin\plugins\$(ProjectName)\" "$(TargetDir)"

    Plugin111/
    modules/
    Plugin111/
    bin/
    Debug/
    Release/
    lib/
    tests/

    How to work with development
    ------------------

    • Build Loader to avoid build of test projects
    • Configuration to build with/without? test project
    • NEVER reference one Test project from another

    Reduce dependencies
    ------------------

    • DelftTools.Gui.SwfControls - move interfaces to DelftTools.Gui and use them in dependent projects
    • introduce Windsor Castle (KEEP IT SIMPLE, NOT EVERYWHERE)
  8. See part II of the document  (in the attachments) from Microsoft how they manage large solutions.

  9. Unknown User (don)

    More notes from worklog:

    Q: How to copy plugin library automatically to target dir (Loader/bin/plugins for now) together with their native libraries
    A: Incliude the following in your project file:

    <Import Project="..\..\..\..\build\DelftShell.targets" />

    <PropertyGroup>
    <IsPluginComponent>true</IsPluginComponent>
    <PluginName>NetworkEditor</PluginName>
    </PropertyGroup>

    Note: it works also for a different projects of the plugin. Native libraries are copied automatically from:

    <component>/
    modules/
    Project1/
    Project2/
    lib/
    Project1/ ------------- if such a dir is found - content will be copied to the plugins/<PluginName>
    Project2/

    Q: How to enable PostSharp:

    <PropertyGroup>
    <UsePostSharp>true</UsePostSharp>
    </PropertyGroup>

    ===== PostSharp projects:

    DelftShell\modules\DelftShell.Gui\DelftShell.Gui.csproj

    DelftTools\modules\DelftTools.Core\DelftTools.Core.csproj
    DelftTools\modules\DelftTools.DataObjects\DelftTools.DataObjects.csproj
    DelftTools\modules\DelftTools.DataObjects.Function\DelftTools.DataObjects.Functions.csproj
    DelftTools\modules\DelftTools.Gui.Swf.Controls\DelftTools.Gui.Swf.Controls.csproj
    DelftTools\tests\DelftTools.Tests\DelftTools.Tests.csproj
    DelftTools\modules\DelftTools.Utils\DelftTools.Utils.csproj

    DelftShellPlugins\DataAccess\modules\DelftShell.Plugins.Data.NHibernate\DelftShell.Plugins.Data.NHibernate.csproj
    DelftShellPlugins\DelftModels\modules\DelftShell.Plugins.DelftModels.FlowModel\DelftShell.Plugins.DelftModels.FlowModel.csproj
    DelftShellPlugins\Habitat\modules\DelftShell.Plugins.Habitat\DelftShell.Plugins.Habitat.csproj
    DelftShellPlugins\Habitat\modules\DelftShell.Plugins.Importers.Habitat\DelftShell.Plugins.Importers.Habitat.csproj
    DelftShellPlugins\MWell\modules\DelftShell.Plugins.MWell\DelftShell.Plugins.MWell.csproj
    DelftShellPlugins\SharpMapGis\modules\DelftShell.Plugins.NetworkEditor\DelftShell.Plugins.NetworkEditor.csproj
    DelftShellPlugins\OpenMI\modules\DelftShell.Plugins.OpenMI\DelftShell.Plugins.OpenMI.csproj
    DelftShellPlugins\ProjectExplorer\modules\DelftShell.Plugins.ProjectExplorer\DelftShell.Plugins.ProjectExplorer.csproj
    DelftShellPlugins\Series\modules\DelftShell.Plugins.Series\DelftShell.Plugins.Series.csproj
    DelftShellPlugins\SharpMapGis\modules\DelftShell.Plugins.SharpMapGis\DelftShell.Plugins.SharpMapGis.csproj
    DelftShellPlugins\Toolbox\modules\DelftShell.Plugins.Toolbox\DelftShell.Plugins.Toolbox.csproj
    DelftShellPlugins\Verkenner\modules\DelftShell.Plugins.Verkenner\DelftShell.Plugins.Verkenner.csproj
    DelftShellPlugins\Habitat\modules\Habitat\Habitat.csproj
    DelftShellPlugins\SharpMapGis\modules\NetTopologySuite.Extensions\NetTopologySuite.Extensions.csproj
    DelftShellPlugins\SharpMapGis\modules\SharpMap\SharpMap.csproj
    DelftShellPlugins\SharpMapGis\modules\SharpMap.Extensions\SharpMap.Extensions.csproj
    DelftShellPlugins\SharpMapGis\modules\SharpMap.UI\SharpMap.UI.csproj
    DelftShellPlugins\SharpMapGis\tests\SharpMapTestUtils\SharpMapTestUtils.csproj
    DelftShellPlugins\TestPlugin1\modules\TestPlugin1\TestPlugin1.csproj

    Q: Reduce number of PostSharp assemblies, move entities to a separate projects? There are far to many
    A: ????

    Q: Are plugin folders removed correctly from the plugins/ folder if user selects Clean on plugin project
    A: yes, they are, see DelftShell.targets, currently the whole plugin folder is removed from plugins/

    Q: When I add a new plugin, how loader will know that it should be build when I press F5
    A: make Loader depend on plugin (no references!)

    ================================================================

    TODO:

    (minus) disable output in DelftShell.targets (too many echos)
    (minus) refactor cp.exe in all dependent test projects (question) or reduce number of these projects (e.g. copy native libs only to tests/Project1.Tests/bin/Debug/)
    (minus) draw dependencies and build times
    (minus) move Xtra components to Swf.Controls? and make it plugin?
    (minus) merge DelftTools.Tests.AOP into DelftTools.Utils.Tests
    (plus) MapTestUtils are placed in a separate project so that we won't reference SharpMap everywhere, DelftTools doesn't know anything about SharpMap
    (minus) comments:
    just remove it: ==> //form.ShowDialog();
    WindowsFormsTestHelper.ShowModal(form);

    (minus) WindowsFormsTestHelper.ShowModal(form); => WindowsFormsTestHelper.Show(form);, It is modal locally and non-modal on a build server
    ShowModel implementation is a bit strange - refactor it
    (minus) remove references to NHibernate from third-party projects, use <ProjectName>.NHibernate.dll instead