ClickOnce Publish to Web with MSBuild
With ClickOnce you may publish to a web or file share location. This MSDN article tells you how to do it from Visual Studio, but doing it from VS is very limiting what you will end up wanting to do is publish using MsBuild from the command prompt. This posting is not a comprehensive ‘how-to’ but has some useful tips, simple but painful lessons learnt through trial and error.
Project File Changes
Open up your Project.csproj in a text editor (I always use notepad++). Set these properties, add them if they are not there already….they should be near the top of the file and probably not together.
<IsWebBootstrapper>true</IsWebBootstrapper> <InstallFrom>Web</InstallFrom> <PublishDir>C:\Dev\Release\$(BuildEnvironment)\</PublishDir>
As far as I can tell this can either be Web or Unc
This one is really important, if you do not set this to true the publish will work fine but you will have problems installing. If you see an error that looks something like this
SOURCES Deployment url : file:///C:/Documents%20and%20Settings/Administrator.HP275/Local%20Settings/Temporary%20Internet%20Files/Content.IE5/QTJPP0ZG/MyApp.Shell.application ERROR SUMMARY Below is a summary of the errors, details of these errors are listed later in the log. * Activation of C:\Documents and Settings\Administrator.HP275\Local Settings\Temporary Internet Files\Content.IE5\QTJPP0ZG\MyApp.Shell.application resulted in exception. Following failure messages were detected: + Downloading file:///C:/Documents and Settings/Administrator.HP275/Local Settings/Temporary Internet Files/Content.IE5/QTJPP0ZG/MyApp.Shell.application did not succeed.
the likely cause of the problem is the IsWebBootstrapper value is false. Note that VS kindly changes this value for you sometimes…so be careful! The clue that this is the cause is of course the fact that the installer is trying to find the file from a local path.
This is still a unc path, preferably to the dir of the virtual directory in IIS. However if the machine you are publishing from does not have write access to that location on the network, you can publish to a local location then copy the files to the secure machine.
I like to create a separate batch file for each environment that I need to publish to, e.g. QA, Training, Production etc.
The reason is, SOME of the MsBuild variables that need to be set must be passed in (as far as I can tell) from the command prompt to MsBuild.
So this is what my batch files look like (check out my posting on MsBuild and multiple environments for details on the extra properties).
msbuild /t:Publish /p:Configuration=Release /p:BuildEnvironment=QA /p:ApplicationVersion=18.104.22.168 /p:UpdateUrl=http://MachineNameOrIP/Release/QA/ /p:InstallUrl=http://MachineNameOrIP/Release/QA/
InstallUrl and UpdateUrl are both properties which apparently need to be passed in as parameters which is why I put them in the batch file.
The ApplicationVersion I still do manually because I haven’t tried setting up the automated solution yet.
To publish from a web address you will need to setup a virtual directory in IIS.
The main ‘Gotcha’ I encountered was setting the execute permissions to Scripts and executables. It must be Scripts only! This post help me figure out what the hell was going wrong when I had the wrong setting.
If you are publish to the web then you most likely want/need a publish page, check out my other posting on creating the publish.html file as part of your build (this file gets created when you publish from VS but you stop getting it as soon as you publish directly from MsBuild)
Happy publishing 🙂