I’ve recently been trialling and contributing (work is still going on in a branch) on a small scale to a great little OSS project called DotNetMigrations. The GitHub site tells the full story, but essentially it allows you to write schema changes to your databases incrementally as you develop and automatically apply only the migrations you are missing if you are using an out-of-date database.
I’ve been working on making it very easy to integrate with existing projects by upgrading its NuGet installation. This is still a work in progress but the idea is that you can do the following:
1. Add DotNetMigrations to an application (web or windows/console etc.) using NuGet
2. A reference is added to DNM from your project, and the db.exe tool (that can be used to generate/run migrations standalone) is installed to your solution’s package folder
3. The required configuration (currently in appSettings keys) is added to the host application, this indicates the location of the migration scripts and the naming strategy
From that point on, as long as you sit in a command line that is inside the host application and reference the db.exe tool using a relative path, DNM will use your host application’s connectionStrings, completely integrating it.
For example you can then do commands like:
../../packages/DotNetMigrations-x.x.x/tools/db.exe generate "My first migration"
(to create a migration – you then open the generated file in any editor and add your schema change SQL)
../../packages/DotNetMigrations-x.x.x/tools/db.exe migrate myconnectionstringname
(to update the database pointed to by the connection string myconnectionstringname to the latest migration level)
Some future possibilities:
- Including these calls as Powershell commands so that they can be run from within the NuGet Package Console, and to avoid having to use a separate command line and use awkward relative paths
- Adding “auto migrate” logic to an application’s start-up code (optional) that will host the DNM core and upgrade databases on start-up to the required level
- Along the same lines, should we be allowing people to package migrations as application resources?
Any thoughts or suggestions?
It’s a start, but this seems to be the technique to use for multi-instance installers built using WiX:
1. Have bootstrapper (script? app?) programatically create a transform based on passed in instance name.
2. Transform should store some info in a custom table and set the GUID of the product to something unique. Set default installation directory too?
3. Install needs to save GUID of product/instance to somewhere in the registry so that instances can be listed and selected in (1).
What a palaver. Prior to RTM you could use VS.NET 2008 and 2010 web application projects alongside each other with no issues (after having 2010 upgrade them). With RTM, you get horrible issues with the line:
<Import Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudio v10.0WebApplicationsMicrosoft.WebApplication.targets" />
Added to the bottom of your .csproj files. After much soul searching I’ve found a solution with a bit of MSBuild cleverness. Turns out you can conditioanlly include MSBuild targets depending on the version of Visual Studio being used.
So, for each web application project in your solution:
- a) Have VS.NET 2010 upgrade your projects to the newer version.
- b) Replace the above line with:
<Import Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudio v9.0WebApplicationsMicrosoft.WebApplication.targets"
Condition="'$(Solutions.VSVersion)' == '9.0'" /> <Import Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudio v10.0WebApplicationsMicrosoft.WebApplication.targets"
Condition="'$(Solutions.VSVersion)' == '10.0'" />
- c) Blank out <FileUpgradeFlags></FileUpgradeFlags> which VS.NET 2010 has probably put “4.0” in, this will trip 2008 up otherwise.
- d) Blank out <UpgradeBackupLocation></UpgradeBackupLocation> in the same manner.
As long as you can then live with working with a seperate solution file for VS.NET 2010, you should be away and can stop annoying anyone else working on your files!
I’m researching different methods of persisting, updating and managing configuration in .NET, as I’ve become a bit tired of rolling my own static “Config” class.
Having used the newer Settings architecture (as opposed to the old fashioned non-typed AppSettings) on a small scale site, I’ve been interested in how it might be possible to extend these over a distributed system.
Turns out you can, the system is pluggable.
Over the next few weeks I’ll be exploring how this might benefit an application – especially in the area of not having to restart when writing to app.config files!
Very interesting article (fewer and farther between unfortunately these days) from Jeff Atwood about some of their experiences with building Stack Overflow and sending out mails and having them actually arrive! Quite pertinent as I’m currently working in a similar area.
Essentially, firstly send mail from your client to: firstname.lastname@example.org and get a free report on basically what you’re missing from your setup. You can do this over and over again to get a picture for how you’re progressing.
Obviously the article goes into detail, but in summary:
1. Make sure the computer sending the email has a Reverse PTR record
2. Configure DomainKeys Identified Mail in your DNS and code
3. Set up a SenderID record in your DNS
Basically they are all a combination of adding the correct TXT and PTR records to your domain names, as well as generating a public/private key pair, signing your mails with the private one and making the public part available via DNS.
They use a commercial piece of software called Mailbee.NET to do the signing work, but this is possible using good old SmtpClient with something like this: http://tinisles.blogspot.com/2009/09/sending-dkim-email-from-c.html.
Not production code by any stretch of the imagination, and some of the work he does to build a CN and do the actual signing could be done using the built-in BCL classes but you get the picture. I’ll post again when I have this working.
Quite an interesting article on this, if extremely biased towards RoR.
A few salient points:
- RoR is entirely command line based, ASP MVC is obviously more tied to Visual Studio (although I would debate that as you could do everything by command line, ms build and notepad)
- Very similar in all basic respects.
- No analysis of more important and “edgy” factors such as model binding (ASP MVC is very good at this) and validation frameworks.
- I’m still jealous in some respects of RoR DB migrations – I wonder if there is a .NET based port of this going anywhere? I should lend a hand if so.
- Routing is a tie, both good.
- Pretty much parity beyond that (at least as far as the article is concerned).
More for my own reference really, but this might be useful to others – certainly been driving me mad enough over the last few weeks!
I’ve got an iTouch 64Gb and have previously been synching it with iTunes 8.x without issue, but on upgrade to 9, all of my “most played”, “most recently added” etc playlists suddenly show random tracks (on the handset only).
This is down to the issues described at: http://discussions.info.apple.com/thread.jspa?threadID=2227108&tstart=1.
Basically, to cut a long story short, you need to add this option to each playlist with a “limit” set:
Re-sync and voila, life is sane again. That said the performance and literary of niggly bugs with iTunes (as well as the heavy handed updater) is getting on my nerves. Roll on Windows Mobile 7!
The best thing (Stackoverflow related aside) that Joel Spolsky has written in a long time, a really accessible tutorial to Mercurial (espeically for Subversion users).
EDIT: This is the essence of the workflow.
I’m trying to come up with a standard and reliable way to trigger a core dump from within the logging/exception handling of a C# executable. The above article indicates that this should be possible, but it sounds as if making this work across platforms would be a fairly large nightmare.
If anyone has done anything similar to this, I’d be interested to see how you went about it, and if possible maybe we could share/release some code to make this easier.
Here’s a Channel 9 interview with Anders Hejlsberg, the creator and head designer of C# as a language (as well as Delphi back in the day).
Interesting in that it examines some of the improvements in C# 4.0, as well as features that are being bandied around for even further out.
Also contains the best description of contra-variance and co-variance that I’ve seen so far.