Gotcha with Publish Profiles for Websites
Microsoft recently released ASP.NET and Web Tools 2012.2. You can read
about it
here.
One of the things I was particularly excited about was the fact that
web site projects (not web application projects) were getting the
same publishing tooling as web application projects. Cue everyone asking
why am I still using Web Site Projects rather than Web Application
projects... A post for another day...
I have been trying to get MSBuild to play nice with the publish
profiles. I used the tooling to create a new publish profile. The tool
creates two files inside the website:
- website.publishproj - this is basically an msbuild file
- App_Data\PublishProfiles\%PROFILENAME%.pubxml - this is a
settings file that stores properties.
I then tried to build the project file, by running the following in the
command line:
Here is a brief explanation of the flags I have used:
- DeployOnBuild: tells msbuild to do a deploy
- PublishProfile: Name of the publish profile I created earlier
- VisualStudioVersion: This is required when building a project file rather than solution, see here.
- Logger: Whilst debugging I needed logging, so this gives me that.
When I ran this, I was getting the following error:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets(4253,5): error : The value for PublishProfile is set to 'QA.pubxml', expected to find the file at 'E:\Dev\trunk\website__profiles\QA.pubxml' but it could not be found.
Clearly MSBuild is looking in the wrong place for the qa.pubxml file. It
seems to be looking in a folder called "__profiles" rather than
"App_Data\publishprofiles\QA.pubxml". I debugged this and eventually
found an issue with the Microsoft.Web.Publishing.targets file. It turns
out that if you specify an extension (.pubxml) on your profile name,
MSBuild will look in the wrong folder. I reran the MSBuild command
below:
It started working perfectly.
Details on the issue
The following section exists in the Microsoft.Web.Publishing.target
file:
As you can see here (in the second PropertyGroup) the property
WebPublishProfileFile will only get set correctly to the App_Data
path if PublishProfileName != '' **AND **WebPublishProfileFile
''. **If we look at the first **PropertyGroup now, we can see that
PublishProfileName **only gets set if **_PublishProfileExtension
'' **AND **_PublishProfileDirectory == ''. ** During my
debugging, I could see that **_PublishProfileExtension was set to
".pubxml" so the condition would fail. I removed the ".pubxml" from the
PublishProfile MSBuild property as shown above and it started
working.