<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Sayed Ibrahim Hashimi - MSBuild, Web Deploy (MSDeploy), ASP.NET</title>
    <link>http://sedodream.com/</link>
    <description>MSBuild, C#, Visual Studio and more</description>
    <language>en-us</language>
    <copyright>Sayed Ibrahim Hashimi</copyright>
    <lastBuildDate>Sat, 08 Jun 2013 00:42:57 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>sayed.hashimi@gmail.com</managingEditor>
    <webMaster>sayed.hashimi@gmail.com</webMaster>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=40b8a140-f4d8-4780-844e-60973db5c68a</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,40b8a140-f4d8-4780-844e-60973db5c68a.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,40b8a140-f4d8-4780-844e-60973db5c68a.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=40b8a140-f4d8-4780-844e-60973db5c68a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few weeks ago I <a href="http://sedodream.com/2013/05/13/HowToCompressAVisualStudioExtensionVSIXDuringBuild.aspx">blogged
about a Visual Studio extension</a>, <a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd">Farticus</a>,
which I’m working on with <a href="http://madskristensen.net">Mads Kristensen</a>.
In that post I described how the default compression of a .vsix (<em>the artifact
that is created for a Visual Studio Package</em>) is not as small as it could be.
It’s better to get a fully compressed VSIX because when users install the component
the download time can be significantly reduced. In that post I described how you could
use the <a href="http://www.msbuildextensionpack.com/help/4.0.5.0/html/f2118b59-554e-d745-5859-126a82b1df81.htm">Zip
task</a> from the <a href="http://msbuildextensionpack.codeplex.com/">MSBuild Extension
Pack</a> to have a fully compressed .vsix file. I will now show you how I’ve simplified
this.
</p>
        <a href="https://nuget.org/packages/VsixCompress/1.0.0.4">
          <p>
            <img alt="Icon for package VsixCompress" src="http://msbuildbook.com/images/vsix-compress.png" />
            <font size="7">VsixCompress</font>
          </p>
        </a>
        <p>
Since my previous post I’ve created a NuGet package, <a href="https://nuget.org/packages/VsixCompress/1.0.0.4">VsixCompress</a> which
simplifies this greatly. If you have an existing Visual Studio package and want to
have a fully compressed .vsix file then all you need to do is install the <a href="https://nuget.org/packages/VsixCompress/1.0.0.4">VsixCompress</a> package.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/Introducing-VsixCompress_F242/image_2.png">
            <img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Introducing-VsixCompress_F242/image_thumb.png" width="728" height="75" />
          </a>
        </p>
        <p>
 
</p>
        <p>
After you install this package the following happens.
</p>
        <ol>
          <li>
NuGet package is downloaded and installed to the packages folder</li>
          <li>
The project is edited to include an import for a new .targets file</li>
          <li>
The build process is extended to compress the .vsix file automatically</li>
        </ol>
        <p>
After installing this package once you build the generated .vsix is much smaller than
before. In the default case where you select to create a new C# VS Package the created
.vsix is 17kb. After adding VsixCompress the resulting .vsix is only 9kb. That’s almost
half the size. That’s all you need to know for local development. If you have a build
server setup then there are a couple of additional steps. Let’s go over those now.
</p>
        <h3>Build Server Support
</h3>
        <p>
I have blogged before about issues of shipping build updates in NuGet. To briefly
summarize, when leveraging <a href="http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages">NuGet
Package Restore</a> you have to be careful if any of those NuGet packages have build
updates. When using Package Restore the NuGet packages which contain the imported
.targets file(s) are restored after the build starts. What this means is that the
.targets files will never be imported (<em>or an old copy is imported in the case
the file exists from a previous build</em>). The only way to work around this is to
restore the packages before the .sln/.csproj file themselves are built. You can read
the full details at <a href="http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx">http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx</a>.
I have a NuGet package, <a href="https://nuget.org/packages/PackageRestore/">PackageRestore</a>,
which can help here. Take a look at my previous post <a href="http://sedodream.com/2013/06/06/HowToSimplifyShippingBuildUpdatesInANuGetPackage.aspx"><strong>How
to simplify shipping build updates in a NuGet package</strong></a>. Now that we’ve
discussed all the details that you need let’s discuss what my plans are going forward
with this.
</p>
        <h3>Plans going forward
</h3>
        <p>
I’m hoping to add the following features over the course of the next few weeks.
</p>
        <ul>
          <li>
            <a href="https://github.com/sayedihashimi/vsix-compress/issues/3">Automatically bump
version number when building in VS</a>
          </li>
          <li>
            <a href="https://github.com/sayedihashimi/vsix-compress/issues/1">Add an option to
accept the compression level as an MSBuild property</a>
          </li>
          <li>
            <a href="https://github.com/sayedihashimi/vsix-compress/issues/2">Add an option to
opt in/out of compressing the VSIX as an MSBuild property</a>
          </li>
        </ul>
        <p>
FYI VsixCompress is open source so you can take a look at the code, or better yet
contribute at <a href="https://github.com/sayedihashimi/vsix-compress">https://github.com/sayedihashimi/vsix-compress</a>.
</p>
        <p>
Please let me know what you think of this!
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Introducing VsixCompress–a NuGet package to compress your Visual Studio Package</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,40b8a140-f4d8-4780-844e-60973db5c68a.aspx</guid>
      <link>http://sedodream.com/2013/06/08/IntroducingVsixCompressaNuGetPackageToCompressYourVisualStudioPackage.aspx</link>
      <pubDate>Sat, 08 Jun 2013 00:42:57 GMT</pubDate>
      <description>&lt;p&gt;
A few weeks ago I &lt;a href="http://sedodream.com/2013/05/13/HowToCompressAVisualStudioExtensionVSIXDuringBuild.aspx"&gt;blogged
about a Visual Studio extension&lt;/a&gt;, &lt;a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd"&gt;Farticus&lt;/a&gt;,
which I’m working on with &lt;a href="http://madskristensen.net"&gt;Mads Kristensen&lt;/a&gt;.
In that post I described how the default compression of a .vsix (&lt;em&gt;the artifact
that is created for a Visual Studio Package&lt;/em&gt;) is not as small as it could be.
It’s better to get a fully compressed VSIX because when users install the component
the download time can be significantly reduced. In that post I described how you could
use the &lt;a href="http://www.msbuildextensionpack.com/help/4.0.5.0/html/f2118b59-554e-d745-5859-126a82b1df81.htm"&gt;Zip
task&lt;/a&gt; from the &lt;a href="http://msbuildextensionpack.codeplex.com/"&gt;MSBuild Extension
Pack&lt;/a&gt; to have a fully compressed .vsix file. I will now show you how I’ve simplified
this.
&lt;/p&gt;
&lt;a href="https://nuget.org/packages/VsixCompress/1.0.0.4"&gt; 
&lt;p&gt;
&lt;img alt="Icon for package VsixCompress" src="http://msbuildbook.com/images/vsix-compress.png"&gt;&lt;font size="7"&gt;VsixCompress&lt;/font&gt;
&lt;/p&gt;
&lt;/a&gt; 
&lt;p&gt;
Since my previous post I’ve created a NuGet package, &lt;a href="https://nuget.org/packages/VsixCompress/1.0.0.4"&gt;VsixCompress&lt;/a&gt; which
simplifies this greatly. If you have an existing Visual Studio package and want to
have a fully compressed .vsix file then all you need to do is install the &lt;a href="https://nuget.org/packages/VsixCompress/1.0.0.4"&gt;VsixCompress&lt;/a&gt; package.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/Introducing-VsixCompress_F242/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Introducing-VsixCompress_F242/image_thumb.png" width="728" height="75"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
After you install this package the following happens.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
NuGet package is downloaded and installed to the packages folder&lt;/li&gt;
&lt;li&gt;
The project is edited to include an import for a new .targets file&lt;/li&gt;
&lt;li&gt;
The build process is extended to compress the .vsix file automatically&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
After installing this package once you build the generated .vsix is much smaller than
before. In the default case where you select to create a new C# VS Package the created
.vsix is 17kb. After adding VsixCompress the resulting .vsix is only 9kb. That’s almost
half the size. That’s all you need to know for local development. If you have a build
server setup then there are a couple of additional steps. Let’s go over those now.
&lt;/p&gt;
&lt;h3&gt;Build Server Support
&lt;/h3&gt;
&lt;p&gt;
I have blogged before about issues of shipping build updates in NuGet. To briefly
summarize, when leveraging &lt;a href="http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages"&gt;NuGet
Package Restore&lt;/a&gt; you have to be careful if any of those NuGet packages have build
updates. When using Package Restore the NuGet packages which contain the imported
.targets file(s) are restored after the build starts. What this means is that the
.targets files will never be imported (&lt;em&gt;or an old copy is imported in the case
the file exists from a previous build&lt;/em&gt;). The only way to work around this is to
restore the packages before the .sln/.csproj file themselves are built. You can read
the full details at &lt;a href="http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx"&gt;http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx&lt;/a&gt;.
I have a NuGet package, &lt;a href="https://nuget.org/packages/PackageRestore/"&gt;PackageRestore&lt;/a&gt;,
which can help here. Take a look at my previous post &lt;a href="http://sedodream.com/2013/06/06/HowToSimplifyShippingBuildUpdatesInANuGetPackage.aspx"&gt;&lt;strong&gt;How
to simplify shipping build updates in a NuGet package&lt;/strong&gt;&lt;/a&gt;. Now that we’ve
discussed all the details that you need let’s discuss what my plans are going forward
with this.
&lt;/p&gt;
&lt;h3&gt;Plans going forward
&lt;/h3&gt;
&lt;p&gt;
I’m hoping to add the following features over the course of the next few weeks.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sayedihashimi/vsix-compress/issues/3"&gt;Automatically bump
version number when building in VS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sayedihashimi/vsix-compress/issues/1"&gt;Add an option to
accept the compression level as an MSBuild property&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sayedihashimi/vsix-compress/issues/2"&gt;Add an option to
opt in/out of compressing the VSIX as an MSBuild property&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
FYI VsixCompress is open source so you can take a look at the code, or better yet
contribute at &lt;a href="https://github.com/sayedihashimi/vsix-compress"&gt;https://github.com/sayedihashimi/vsix-compress&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Please let me know what you think of this!
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,40b8a140-f4d8-4780-844e-60973db5c68a.aspx</comments>
      <category>Extensibility</category>
      <category>Visual Studio</category>
      <category>VSIX</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c932b651-2652-451e-bd8d-a39dd444dd16</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c932b651-2652-451e-bd8d-a39dd444dd16.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c932b651-2652-451e-bd8d-a39dd444dd16.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c932b651-2652-451e-bd8d-a39dd444dd16</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Have you ever wanted to ship build updates in a NuGet package? If so then you may
have noticed that there are issues if you need to import a .targets file which is
contained in a NuGet package. To be brief, the issue is that by the time the .targets
file is being restored with NuGet it’s already too late because the build has already
started. So we need an easy way to invoke NuGet package restore for a given project
before the build for the solution/project starts. In this entry you will see how we
can use a generated build script to help with this.
</p>
        <p>
A few months back I discovered this issue and blogged about it at <a href="http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx">SlowCheetah
build server support updated</a>. The solution that I implemented was to create a
new build script, packageRestore.proj, which is placed in the root of the project
when the <a href="http://nuget.org/packages/SlowCheetah/">SlowCheetah NuGet package</a> is
installed. If you want to invoke the package restore from a build server then you
can just add packageRestore.proj to the list of items to build before the .sln/.csproj
file which you are intending to build. I’ve now refactored this into its own NuGet
package, <a href="https://nuget.org/packages/PackageRestore">PackageRestore</a>.
</p>
        <p>
 
</p>
        <p>
Here is how you can try it out.
</p>
        <ol>
          <li>
Create a new project</li>
          <li>
Add a few NuGet packages to the project</li>
          <li>
Enable NuGet package restore</li>
          <li>
Add the PackageRestore package (<em>the command you can use is <strong>Install-Package
PackageRestore –pre</strong></em>)</li>
          <li>
Close solution</li>
          <li>
Delete packages folder</li>
          <li>
Execute the command msbuild.exe packageRestore.proj</li>
        </ol>
        <p>
After executing the command you will see that the packages folder along with all its
content will be restored. For CI servers when you define your build script all you
do is build packageRestore.proj before you build the target .sln/.csproj file.
</p>
        <p>
If you are shipping build updates through NuGet and want to be able to enable package
restore in a similar way a <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5">SlowCheetah</a> then
when you create your NuGet package add PackageRestore as a dependency.
</p>
        <p>
 
</p>
        <p>
This is an open source project so you can view the source, and help contribute, at <a href="https://github.com/sayedihashimi/package-restore">https://github.com/sayedihashimi/package-restore</a>.
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>How to simplify shipping build updates in a NuGet package</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c932b651-2652-451e-bd8d-a39dd444dd16.aspx</guid>
      <link>http://sedodream.com/2013/06/06/HowToSimplifyShippingBuildUpdatesInANuGetPackage.aspx</link>
      <pubDate>Thu, 06 Jun 2013 05:57:37 GMT</pubDate>
      <description>&lt;p&gt;
Have you ever wanted to ship build updates in a NuGet package? If so then you may
have noticed that there are issues if you need to import a .targets file which is
contained in a NuGet package. To be brief, the issue is that by the time the .targets
file is being restored with NuGet it’s already too late because the build has already
started. So we need an easy way to invoke NuGet package restore for a given project
before the build for the solution/project starts. In this entry you will see how we
can use a generated build script to help with this.
&lt;/p&gt;
&lt;p&gt;
A few months back I discovered this issue and blogged about it at &lt;a href="http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx"&gt;SlowCheetah
build server support updated&lt;/a&gt;. The solution that I implemented was to create a
new build script, packageRestore.proj, which is placed in the root of the project
when the &lt;a href="http://nuget.org/packages/SlowCheetah/"&gt;SlowCheetah NuGet package&lt;/a&gt; is
installed. If you want to invoke the package restore from a build server then you
can just add packageRestore.proj to the list of items to build before the .sln/.csproj
file which you are intending to build. I’ve now refactored this into its own NuGet
package, &lt;a href="https://nuget.org/packages/PackageRestore"&gt;PackageRestore&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Here is how you can try it out.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Create a new project&lt;/li&gt;
&lt;li&gt;
Add a few NuGet packages to the project&lt;/li&gt;
&lt;li&gt;
Enable NuGet package restore&lt;/li&gt;
&lt;li&gt;
Add the PackageRestore package (&lt;em&gt;the command you can use is &lt;strong&gt;Install-Package
PackageRestore –pre&lt;/strong&gt;&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
Close solution&lt;/li&gt;
&lt;li&gt;
Delete packages folder&lt;/li&gt;
&lt;li&gt;
Execute the command msbuild.exe packageRestore.proj&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
After executing the command you will see that the packages folder along with all its
content will be restored. For CI servers when you define your build script all you
do is build packageRestore.proj before you build the target .sln/.csproj file.
&lt;/p&gt;
&lt;p&gt;
If you are shipping build updates through NuGet and want to be able to enable package
restore in a similar way a &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5"&gt;SlowCheetah&lt;/a&gt; then
when you create your NuGet package add PackageRestore as a dependency.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This is an open source project so you can view the source, and help contribute, at &lt;a href="https://github.com/sayedihashimi/package-restore"&gt;https://github.com/sayedihashimi/package-restore&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c932b651-2652-451e-bd8d-a39dd444dd16.aspx</comments>
      <category>MSBuild</category>
      <category>nuget</category>
      <category>PackageRestore</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c3c50094-4ca6-451e-bba6-df797785b83a</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c3c50094-4ca6-451e-bba6-df797785b83a.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c3c50094-4ca6-451e-bba6-df797785b83a.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c3c50094-4ca6-451e-bba6-df797785b83a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The easiest way to publish a Visual Studio web project from the command line is to
follow the steps below.
</p>
        <ol>
          <li>
Open VS 
</li>
          <li>
Right click on the Web project and select Publish 
</li>
          <li>
Import your .publishSettings file (or manually configure the settings) 
</li>
          <li>
Save the profile (i.e. .pubxml file) 
</li>
          <li>
From the command line publish with the command line passing in PublishProfile</li>
        </ol>
        <p>
For more details on this you can see <a href="http://msbuild myproj.csproj /p:VisualStudioVersion=11.0 /pOpen-mouthed smileeploy">ASP.NET
Command Line Deployment</a>. This is pretty simple and very easy, but it does require
that you manually create the .pubxml file. In some cases you’d just like to download
the .publishsettings file from your hosting provider and use that from the command
line. This post will show you how to do this.
</p>
        <p>
In order to achieve the goal we will need to extend the build/publish process. There
are two simple ways to do this; 1. Place a .wpp.targets file in the same directory
as the web project or 2. Pass an additional property indicating the location of the
.wpp.targets file. I’ll first go over the technique where you place the file directly
inside of the directory where the project is. After that I’ll show you how to use
this file from a well known location.
</p>
        <p>
One way to do this is to create a .wpp.targets file. This .wpp.targets file will be
imported into the build/publish process automatically. This .targets file will enable
us to pass in PublishSettingsFile as an MSBuild property. It will then read the .publishsettings
file and output the properties needed to execute the publish process.
</p>
        <h3>.wpp.targets in the project directory
</h3>
        <p>
Let’s take a look at the .targets file and then we will discuss it’s contents. Below
you will find the contents of the full file.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt; 
  
  &lt;!--
  When using this file you must supply /p:PublishSettingsFile as a parameter and /p:DeployOnBuild=true
  --&gt;  
  &lt;PropertyGroup Condition=" Exists('$(PublishSettingsFile)')"&gt;
    &lt;!-- These must be declared outside of a Target because they impact the Import Project flow --&gt;
    &lt;WebPublishMethod&gt;MSDeploy&lt;/WebPublishMethod&gt;
    &lt;DeployTarget&gt;WebPublish&lt;/DeployTarget&gt;
  
    &lt;PipelineDependsOn&gt;
      GetPublishPropertiesFromPublishSettings;
      $(PipelineDependsOn);
    &lt;/PipelineDependsOn&gt;
  &lt;/PropertyGroup&gt;

  &lt;Target Name="GetPublishPropertiesFromPublishSettings" BeforeTargets="Build" Condition=" Exists('$(PublishSettingsFile)')"&gt;
    &lt;PropertyGroup&gt;
      &lt;_BaseQuery&gt;/publishData/publishProfile[@publishMethod='MSDeploy'][1]/&lt;/_BaseQuery&gt;
      &lt;!-- This value is not in the .publishSettings file and needs to be specified, it can be overridden with a cmd line parameter --&gt;
      &lt;!-- If you are using the Remote Agent then specify this as RemoteAgent --&gt;
      &lt;MSDeployPublishMethod&gt;WMSVC&lt;/MSDeployPublishMethod&gt;
    &lt;/PropertyGroup&gt;

    &lt;ItemGroup&gt;
      &lt;_MSDeployXPath Include="WebPublishMethod"&gt;
        &lt;Query&gt;$(_BaseQuery)@publishMethod&lt;/Query&gt;
      &lt;/_MSDeployXPath&gt;

      &lt;_MSDeployXPath Include="MSDeployServiceURL"&gt;
        &lt;Query&gt;$(_BaseQuery)@publishUrl&lt;/Query&gt;
      &lt;/_MSDeployXPath&gt;

      &lt;_MSDeployXPath Include="SiteUrlToLaunchAfterPublish"&gt;
        &lt;Query&gt;$(_BaseQuery)@destinationAppUrl&lt;/Query&gt;
      &lt;/_MSDeployXPath&gt;

      &lt;_MSDeployXPath Include="DeployIisAppPath"&gt;
        &lt;Query&gt;$(_BaseQuery)@msdeploySite&lt;/Query&gt;
      &lt;/_MSDeployXPath&gt;

      &lt;_MSDeployXPath Include="UserName"&gt;
        &lt;Query&gt;$(_BaseQuery)@userName&lt;/Query&gt;
      &lt;/_MSDeployXPath&gt;

      &lt;_MSDeployXPath Include="Password"&gt;
        &lt;Query&gt;$(_BaseQuery)@userPWD&lt;/Query&gt;
      &lt;/_MSDeployXPath&gt;
    &lt;/ItemGroup&gt;

    &lt;XmlPeek XmlInputPath="$(PublishSettingsFile)"
             Query="%(_MSDeployXPath.Query)"
             Condition=" Exists('$(PublishSettingsFile)')"&gt;
      &lt;Output TaskParameter="Result" PropertyName="%(_MSDeployXPath.Identity)"/&gt;
    &lt;/XmlPeek&gt;
  &lt;/Target&gt;
&lt;/Project&gt;
</pre>
        <p>
You can place this file in the root of your project (<em>next to the .csproj/.vbproj
file</em>) with the name <em>{ProjectName}.wpp.targets</em>.
</p>
        <p>
This .targets file is pretty simple. It defines a couple properties and a single target,
GetPublishPropertiesFromPublishSettings. In order to publish your project from the
command line you would execute the command below.
</p>
        <pre class="brush: csharp;">msbuild.exe MyProject /p:VisualStudioVersion=11.0 /p:DeployOnBuild=true /p:PublishSettingsFile=&lt;path-to-.publishsettings&gt;
</pre>
        <p>
Here is some info on the properties that are being passed in.
</p>
        <blockquote>
          <p>
The VisualStudioVersion property indicates that we are using the VS 2012 targets.
More info on this at <a href="http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx">http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx</a>.
</p>
          <p>
DeployOnBuild, when true it indicates that we want to publish the project. This is
the same property that you would normally pass in.
</p>
          <p>
PublishSettingsFile, this is a new property which the .targets file recognizes. It
should be set to the path of the .publishSettings file.
</p>
        </blockquote>
        <p>
 
</p>
        <p>
The properties at the top of the .targets file (WebPublishMethod and DeployTarget)
indicate what type of publish operation is happening. The default values for those
are MSDeploy and WebPublish respectively. You shouldn’t need to change those, but
if you do you can pass them in on the command line.
</p>
        <p>
The GetPublishPropertiesFromPublishSettings target uses the <a href="http://stackoverflow.com/questions/2688239/how-to-use-xmlpeek-task">XmlPeek</a> task
to read the .publishsettings file. It then emits the properties required for publishing.
</p>
        <p>
OK this is great an all, but it still requires that an additional file (the .wpp.targets
file) be placed in the directory of project. It is possible to avoid this as well.
Let’s move to that
</p>
        <h3>.wpp.targets from a well known location
</h3>
        <p>
If you’d like to avoid having to place the .wpp.targets file in the directory of the
project you can easily do this. Place the file in a well known location and then execute
the same msbuild.exe call adding an additional property. See the full command below.
</p>
        <pre class="brush: csharp;">msbuild.exe MyProject /p:VisualStudioVersion=11.0 /p:DeployOnBuild=true /p:PublishSettingsFile=&lt;path-to-.publishsettings&gt; /p:WebPublishPipelineCustomizeTargetFile=&lt;path-to.targets-file&gt;
</pre>
        <p>
Once you do this you no longer need to create the Publish Profile in VS if you want
to publish from the command line with a .publishsettings file.
</p>
        <p>
 
</p>
        <p>
FYI you can find the complete sample at <a href="https://github.com/sayedihashimi/publish-samples/tree/master/PubWithPublishSettings">https://github.com/sayedihashimi/publish-samples/tree/master/PubWithPublishSettings</a>.
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>How to publish a VS web project with a .publishSettings file</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c3c50094-4ca6-451e-bba6-df797785b83a.aspx</guid>
      <link>http://sedodream.com/2013/06/05/HowToPublishAVSWebProjectWithAPublishSettingsFile.aspx</link>
      <pubDate>Wed, 05 Jun 2013 17:01:34 GMT</pubDate>
      <description>&lt;p&gt;
The easiest way to publish a Visual Studio web project from the command line is to
follow the steps below.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Open VS 
&lt;li&gt;
Right click on the Web project and select Publish 
&lt;li&gt;
Import your .publishSettings file (or manually configure the settings) 
&lt;li&gt;
Save the profile (i.e. .pubxml file) 
&lt;li&gt;
From the command line publish with the command line passing in PublishProfile&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
For more details on this you can see &lt;a href="http://msbuild myproj.csproj /p:VisualStudioVersion=11.0 /pOpen-mouthed smileeploy"&gt;ASP.NET
Command Line Deployment&lt;/a&gt;. This is pretty simple and very easy, but it does require
that you manually create the .pubxml file. In some cases you’d just like to download
the .publishsettings file from your hosting provider and use that from the command
line. This post will show you how to do this.
&lt;/p&gt;
&lt;p&gt;
In order to achieve the goal we will need to extend the build/publish process. There
are two simple ways to do this; 1. Place a .wpp.targets file in the same directory
as the web project or 2. Pass an additional property indicating the location of the
.wpp.targets file. I’ll first go over the technique where you place the file directly
inside of the directory where the project is. After that I’ll show you how to use
this file from a well known location.
&lt;/p&gt;
&lt;p&gt;
One way to do this is to create a .wpp.targets file. This .wpp.targets file will be
imported into the build/publish process automatically. This .targets file will enable
us to pass in PublishSettingsFile as an MSBuild property. It will then read the .publishsettings
file and output the properties needed to execute the publish process.
&lt;/p&gt;
&lt;h3&gt;.wpp.targets in the project directory
&lt;/h3&gt;
&lt;p&gt;
Let’s take a look at the .targets file and then we will discuss it’s contents. Below
you will find the contents of the full file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt; 
  
  &amp;lt;!--
  When using this file you must supply /p:PublishSettingsFile as a parameter and /p:DeployOnBuild=true
  --&amp;gt;  
  &amp;lt;PropertyGroup Condition=" Exists('$(PublishSettingsFile)')"&amp;gt;
    &amp;lt;!-- These must be declared outside of a Target because they impact the Import Project flow --&amp;gt;
    &amp;lt;WebPublishMethod&amp;gt;MSDeploy&amp;lt;/WebPublishMethod&amp;gt;
    &amp;lt;DeployTarget&amp;gt;WebPublish&amp;lt;/DeployTarget&amp;gt;
  
    &amp;lt;PipelineDependsOn&amp;gt;
      GetPublishPropertiesFromPublishSettings;
      $(PipelineDependsOn);
    &amp;lt;/PipelineDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;Target Name="GetPublishPropertiesFromPublishSettings" BeforeTargets="Build" Condition=" Exists('$(PublishSettingsFile)')"&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_BaseQuery&amp;gt;/publishData/publishProfile[@publishMethod='MSDeploy'][1]/&amp;lt;/_BaseQuery&amp;gt;
      &amp;lt;!-- This value is not in the .publishSettings file and needs to be specified, it can be overridden with a cmd line parameter --&amp;gt;
      &amp;lt;!-- If you are using the Remote Agent then specify this as RemoteAgent --&amp;gt;
      &amp;lt;MSDeployPublishMethod&amp;gt;WMSVC&amp;lt;/MSDeployPublishMethod&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_MSDeployXPath Include="WebPublishMethod"&amp;gt;
        &amp;lt;Query&amp;gt;$(_BaseQuery)@publishMethod&amp;lt;/Query&amp;gt;
      &amp;lt;/_MSDeployXPath&amp;gt;

      &amp;lt;_MSDeployXPath Include="MSDeployServiceURL"&amp;gt;
        &amp;lt;Query&amp;gt;$(_BaseQuery)@publishUrl&amp;lt;/Query&amp;gt;
      &amp;lt;/_MSDeployXPath&amp;gt;

      &amp;lt;_MSDeployXPath Include="SiteUrlToLaunchAfterPublish"&amp;gt;
        &amp;lt;Query&amp;gt;$(_BaseQuery)@destinationAppUrl&amp;lt;/Query&amp;gt;
      &amp;lt;/_MSDeployXPath&amp;gt;

      &amp;lt;_MSDeployXPath Include="DeployIisAppPath"&amp;gt;
        &amp;lt;Query&amp;gt;$(_BaseQuery)@msdeploySite&amp;lt;/Query&amp;gt;
      &amp;lt;/_MSDeployXPath&amp;gt;

      &amp;lt;_MSDeployXPath Include="UserName"&amp;gt;
        &amp;lt;Query&amp;gt;$(_BaseQuery)@userName&amp;lt;/Query&amp;gt;
      &amp;lt;/_MSDeployXPath&amp;gt;

      &amp;lt;_MSDeployXPath Include="Password"&amp;gt;
        &amp;lt;Query&amp;gt;$(_BaseQuery)@userPWD&amp;lt;/Query&amp;gt;
      &amp;lt;/_MSDeployXPath&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;

    &amp;lt;XmlPeek XmlInputPath="$(PublishSettingsFile)"
             Query="%(_MSDeployXPath.Query)"
             Condition=" Exists('$(PublishSettingsFile)')"&amp;gt;
      &amp;lt;Output TaskParameter="Result" PropertyName="%(_MSDeployXPath.Identity)"/&amp;gt;
    &amp;lt;/XmlPeek&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
You can place this file in the root of your project (&lt;em&gt;next to the .csproj/.vbproj
file&lt;/em&gt;) with the name &lt;em&gt;{ProjectName}.wpp.targets&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
This .targets file is pretty simple. It defines a couple properties and a single target,
GetPublishPropertiesFromPublishSettings. In order to publish your project from the
command line you would execute the command below.
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;msbuild.exe MyProject /p:VisualStudioVersion=11.0 /p:DeployOnBuild=true /p:PublishSettingsFile=&amp;lt;path-to-.publishsettings&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Here is some info on the properties that are being passed in.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The VisualStudioVersion property indicates that we are using the VS 2012 targets.
More info on this at &lt;a href="http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx"&gt;http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
DeployOnBuild, when true it indicates that we want to publish the project. This is
the same property that you would normally pass in.
&lt;/p&gt;
&lt;p&gt;
PublishSettingsFile, this is a new property which the .targets file recognizes. It
should be set to the path of the .publishSettings file.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The properties at the top of the .targets file (WebPublishMethod and DeployTarget)
indicate what type of publish operation is happening. The default values for those
are MSDeploy and WebPublish respectively. You shouldn’t need to change those, but
if you do you can pass them in on the command line.
&lt;/p&gt;
&lt;p&gt;
The GetPublishPropertiesFromPublishSettings target uses the &lt;a href="http://stackoverflow.com/questions/2688239/how-to-use-xmlpeek-task"&gt;XmlPeek&lt;/a&gt; task
to read the .publishsettings file. It then emits the properties required for publishing.
&lt;/p&gt;
&lt;p&gt;
OK this is great an all, but it still requires that an additional file (the .wpp.targets
file) be placed in the directory of project. It is possible to avoid this as well.
Let’s move to that
&lt;/p&gt;
&lt;h3&gt;.wpp.targets from a well known location
&lt;/h3&gt;
&lt;p&gt;
If you’d like to avoid having to place the .wpp.targets file in the directory of the
project you can easily do this. Place the file in a well known location and then execute
the same msbuild.exe call adding an additional property. See the full command below.
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;msbuild.exe MyProject /p:VisualStudioVersion=11.0 /p:DeployOnBuild=true /p:PublishSettingsFile=&amp;lt;path-to-.publishsettings&amp;gt; /p:WebPublishPipelineCustomizeTargetFile=&amp;lt;path-to.targets-file&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Once you do this you no longer need to create the Publish Profile in VS if you want
to publish from the command line with a .publishsettings file.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
FYI you can find the complete sample at &lt;a href="https://github.com/sayedihashimi/publish-samples/tree/master/PubWithPublishSettings"&gt;https://github.com/sayedihashimi/publish-samples/tree/master/PubWithPublishSettings&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c3c50094-4ca6-451e-bba6-df797785b83a.aspx</comments>
      <category>MSBuild</category>
      <category>web</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=bb5cd38b-d064-47fa-a41a-129d01ac13d7</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,bb5cd38b-d064-47fa-a41a-129d01ac13d7.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,bb5cd38b-d064-47fa-a41a-129d01ac13d7.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bb5cd38b-d064-47fa-a41a-129d01ac13d7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Have you ever wanted to use Visual Studio to manage project artifacts but wanted to
have a fully custom build process? The recommend way to do this is to build a <a href="http://msdn.microsoft.com/en-us/library/vstudio/cc512961.aspx">Custom
Visual Studio Project System</a>, but there is a much easier way for lightweight needs.
In this post I’ll show you how to take an existing project and “replace” the build
process used? For example, wouldn’t it be cool if you could develop a Chrome Extension
with VS? When you do a build it would be great to generate the .zip file to for the
Chrome Gallery in the output folder. Doing this is way easier than you might think.
</p>
        <p>
Before I go over the steps to do this let me explain the “contract” between Visual
Studio and MSBuild. The primary interactions around build in Visual Studio include
the following actions in VS. Including what VS does when the action is invoked.
</p>
        <ul>
          <li>
Build – VS invokes the DefaultTarget for the project file 
</li>
          <li>
Rebuild – VS invokes the “Rebuild” target 
</li>
          <li>
Clean – VS invokes the “Clean” target</li>
        </ul>
        <p>
For more details you can read <a href="http://msdn.microsoft.com/en-us/library/ms171468(v=vs.110).aspx">Visual
Studio Integration (MSBuild)</a>. The easiest way to completely customize the VS build
process is to do the following:
</p>
        <ol>
          <li>
Create the correct project based on the artifacts you plan on using (i.e. if you’re
going to be editing .js files then create a web project) 
</li>
          <li>
Edit the project file to not import any of the .targets files 
</li>
          <li>
Define the following targets; Build, Rebuild and Clean</li>
        </ol>
        <p>
After that when you invoke the actions inside of VS the correct action will be executed
in your project.
</p>
        <p>
Let’s look at a concrete example. I’ve been working on a Chrome extension with <a href="http://madskristensen.net/">Mads
Kristensen</a> the past few days. The entire project is available on github at <a href="https://github.com/ligershark/BestPracticesChromeExtension">https://github.com/ligershark/BestPracticesChromeExtension</a>.
When it came time to try out the extension or to publish it to the Chrome store we’d
have to manually create it, which was annoying. We were using a standard web project
to begin with. Here is how we made the workflow simple. Edited the project file to
disable the Import statements. See below.
</p>
        <pre class="brush: xml;">&lt;Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" 
    Condition="false" /&gt;
&lt;Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" 
    Condition="false and '$(VSToolsPath)' != ''" /&gt;
&lt;Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
    Condition="false" /&gt;
</pre>
        <p>
For each of these targets I added/updated the condition to ensure that the .targets
file would never be loaded. The reason why I did not simply remove these is because
in some cases VS may get confused and try to “upgrade” the project and re-insert the
Import statements.
</p>
        <p>
After that I added the following statements to the .csproj file.
</p>
        <pre class="brush: xml;">  &lt;PropertyGroup&gt;
    &lt;LigerShareChromeTargetsPath&gt;$(BuildFolder)\ligersharek.chrome.targets&lt;/LigerShareChromeTargetsPath&gt;
  &lt;/PropertyGroup&gt;
  &lt;Import Project="$(LigerShareChromeTargetsPath)" Condition="Exists($(LigerShareChromeTargetsPath))" /&gt;
</pre>
        <p>
Here I defined a new property to point to a custom .targets file and a corresponding
Import statement. Now let’s take a look at the ligershark.chrome.targets file in its
entirety.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;PropertyGroup&gt;
    &lt;UseHostCompilerIfAvailable&gt;false&lt;/UseHostCompilerIfAvailable&gt;
  &lt;/PropertyGroup&gt;
  &lt;ItemDefinitionGroup&gt;
    &lt;AppFileNameItem&gt;
      &lt;Visible&gt;false&lt;/Visible&gt;
    &lt;/AppFileNameItem&gt;
    &lt;AppFolderItem&gt;
      &lt;Visible&gt;false&lt;/Visible&gt;
    &lt;/AppFolderItem&gt;
  &lt;/ItemDefinitionGroup&gt;
  
  &lt;UsingTask AssemblyFile="$(BuildLib)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.Compression.Zip" /&gt;
  
  &lt;Target Name="Build"&gt;
    &lt;MakeDir Directories="$(OutputPath)" /&gt;
    
    &lt;ItemGroup&gt;
      &lt;_AppCandidateFilesToZip Remove="@(_AppCandidateFilesToZip)" /&gt;
      &lt;_AppCandidateFilesToZip Include="@(Content);@(None)" /&gt;
    &lt;/ItemGroup&gt;
    
    &lt;FindUnderPath Path="$(AppFolder)" Files="@(_AppCandidateFilesToZip)"&gt;
      &lt;Output TaskParameter="InPath" ItemName="_AppFilesToZip" /&gt;
    &lt;/FindUnderPath&gt;
    &lt;Message Text="App files to zip: @(_AppFilesToZip-&gt;'%(RelativeDir)%(Filename)%(Extension)')" /&gt;

    &lt;PropertyGroup&gt;
      &lt;_AppFolderFullPath&gt;%(AppFolderItem.FullPath)&lt;/_AppFolderFullPath&gt;
    &lt;/PropertyGroup&gt;

    &lt;Message Text="Creating package .zip at [%(AppFileNameItem.FullPath)]" Importance="high" /&gt;
    &lt;MSBuild.ExtensionPack.Compression.Zip 
      TaskAction="Create" 
      CompressFiles="@(_AppFilesToZip)" 
      ZipFileName="%(AppFileNameItem.FullPath)" 
      RemoveRoot="$(_AppFolderFullPath)" 
      CompressionLevel="BestCompression" /&gt;
  &lt;/Target&gt;
  
  &lt;PropertyGroup&gt;
    &lt;RebuildDependsOn&gt;
      Clean;
      Build;
    &lt;/RebuildDependsOn&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="Rebuild" DependsOnTargets="$(RebuildDependsOn)" /&gt;
  &lt;Target Name="Clean"&gt;
    &lt;!-- delete all the files in the output folder --&gt;
    &lt;ItemGroup&gt;
      &lt;_FilesToDelete Remove="@(_FilesToDelete)" /&gt;
      &lt;_FilesToDelete Include="$(OutputPath)**\*" /&gt;
    &lt;/ItemGroup&gt;
    &lt;Message Text="Deleting files: @(_FilesToDelete)" /&gt;
    &lt;Delete Files="@(_FilesToDelete)" /&gt;
  &lt;/Target&gt;
&lt;/Project&gt;
</pre>
        <p>
As you can see I defined the following targets; Build, Rebuild, and Clean. This is
what we discussed earlier as the requirements. Now when I click the Build button in
VS a .zip file containing the Chrome Extension is created in the bin\ folder. Additionally
no other step (i.e. any typical build step) is performed here. The only thing happening
is what is defined in the Build target here. Similarly when I Rebuild or Clean the
Rebuild or Clean target is invoked respectively. This is  a pretty neat way to
modify an existing project to completely replace the build process to suit your needs.
</p>
        <p>
There are a few things in the .targets file that I’d like to point out.
</p>
        <h3>UseHostCompilerIfAvailable
</h3>
        <p>
In the .targets file I have set the property declaration <em>&lt;UseHostCompilerIfAvailable&gt;false&lt;/UseHostCompilerIfAvailable&gt;</em>.
When you are working with a project in Visual Studio there is a compiler, the host
compiler, that Visual Studio has which can be used. For performance reasons in most
cases this compiler is used. In this case since we do not want any standard build
actions to be executed this performance trick is undesired. You can easily disable
this by setting this property to false.
</p>
        <p>
After this MSBuild will always be invoked when performing any build related action.
</p>
        <h3>Visible metadata for Item Lists
</h3>
        <p>
When using MSBuild you typically represent files as values within an item list. One
issue that you may encounter when modifying a project which will be loaded in VS is
that the files inside of those item lists will show up in Visual Studio. If you want
to disable this for a particular value in an item list you can add the well known
metadata <em>&lt;Visible&gt;false&lt;/Visible&gt;</em>. For example you could have
the following.
</p>
        <pre class="brush: xml;">&lt;ItemGroup&gt;
    &lt;IntermediateFile Include="cache.temp"&gt;
        &lt;Visible&gt;false&lt;/Visible&gt;
    &lt;/IntermediateFile&gt;
&lt;/ItemGroup&gt;
</pre>
        <p>
If you don’t want to add this to every value in the item list then you can set the
default value using an <a href="http://msdn.microsoft.com/en-us/library/bb629392.aspx">ItemDefinitionGroup</a>. 
For example take a look at the elements below.
</p>
        <pre class="brush: xml;">&lt;ItemDefinitionGroup&gt;
  &lt;AppFileNameItem&gt;
    &lt;Visible&gt;false&lt;/Visible&gt;
  &lt;/AppFileNameItem&gt;</pre>
        <pre class="brush: xml;">  &lt;AppFolderItem&gt;
    &lt;Visible&gt;false&lt;/Visible&gt;
  &lt;/AppFolderItem&gt;
&lt;/ItemDefinitionGroup&gt;</pre>
        <p>
After this declaration is processed if the Visible metadata is accessed for <em>AppFileNameItem</em> or <em>AppFolderItem</em> on
a value which does not declare <em>Visible</em>, then <em>false</em> is returned.
</p>
        <p>
 
</p>
        <p>
The rest of the content of the .targets file is pretty straightforward. This post
shows a basic example of how you can take an existing Visual Studio project and completely
replace the build process. 
</p>
        <p>
 
</p>
        <p>
This project is open source at <a href="https://github.com/ligershark/BestPracticesChromeExtension">https://github.com/ligershark/BestPracticesChromeExtension</a>.
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Hijacking the Visual Studio Build Process</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,bb5cd38b-d064-47fa-a41a-129d01ac13d7.aspx</guid>
      <link>http://sedodream.com/2013/06/01/HijackingTheVisualStudioBuildProcess.aspx</link>
      <pubDate>Sat, 01 Jun 2013 17:47:16 GMT</pubDate>
      <description>&lt;p&gt;
Have you ever wanted to use Visual Studio to manage project artifacts but wanted to
have a fully custom build process? The recommend way to do this is to build a &lt;a href="http://msdn.microsoft.com/en-us/library/vstudio/cc512961.aspx"&gt;Custom
Visual Studio Project System&lt;/a&gt;, but there is a much easier way for lightweight needs.
In this post I’ll show you how to take an existing project and “replace” the build
process used? For example, wouldn’t it be cool if you could develop a Chrome Extension
with VS? When you do a build it would be great to generate the .zip file to for the
Chrome Gallery in the output folder. Doing this is way easier than you might think.
&lt;/p&gt;
&lt;p&gt;
Before I go over the steps to do this let me explain the “contract” between Visual
Studio and MSBuild. The primary interactions around build in Visual Studio include
the following actions in VS. Including what VS does when the action is invoked.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Build – VS invokes the DefaultTarget for the project file 
&lt;li&gt;
Rebuild – VS invokes the “Rebuild” target 
&lt;li&gt;
Clean – VS invokes the “Clean” target&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For more details you can read &lt;a href="http://msdn.microsoft.com/en-us/library/ms171468(v=vs.110).aspx"&gt;Visual
Studio Integration (MSBuild)&lt;/a&gt;. The easiest way to completely customize the VS build
process is to do the following:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Create the correct project based on the artifacts you plan on using (i.e. if you’re
going to be editing .js files then create a web project) 
&lt;li&gt;
Edit the project file to not import any of the .targets files 
&lt;li&gt;
Define the following targets; Build, Rebuild and Clean&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
After that when you invoke the actions inside of VS the correct action will be executed
in your project.
&lt;/p&gt;
&lt;p&gt;
Let’s look at a concrete example. I’ve been working on a Chrome extension with &lt;a href="http://madskristensen.net/"&gt;Mads
Kristensen&lt;/a&gt; the past few days. The entire project is available on github at &lt;a href="https://github.com/ligershark/BestPracticesChromeExtension"&gt;https://github.com/ligershark/BestPracticesChromeExtension&lt;/a&gt;.
When it came time to try out the extension or to publish it to the Chrome store we’d
have to manually create it, which was annoying. We were using a standard web project
to begin with. Here is how we made the workflow simple. Edited the project file to
disable the Import statements. See below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" 
    Condition="false" /&amp;gt;
&amp;lt;Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" 
    Condition="false and '$(VSToolsPath)' != ''" /&amp;gt;
&amp;lt;Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
    Condition="false" /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
For each of these targets I added/updated the condition to ensure that the .targets
file would never be loaded. The reason why I did not simply remove these is because
in some cases VS may get confused and try to “upgrade” the project and re-insert the
Import statements.
&lt;/p&gt;
&lt;p&gt;
After that I added the following statements to the .csproj file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;LigerShareChromeTargetsPath&amp;gt;$(BuildFolder)\ligersharek.chrome.targets&amp;lt;/LigerShareChromeTargetsPath&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Import Project="$(LigerShareChromeTargetsPath)" Condition="Exists($(LigerShareChromeTargetsPath))" /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Here I defined a new property to point to a custom .targets file and a corresponding
Import statement. Now let’s take a look at the ligershark.chrome.targets file in its
entirety.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;UseHostCompilerIfAvailable&amp;gt;false&amp;lt;/UseHostCompilerIfAvailable&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;ItemDefinitionGroup&amp;gt;
    &amp;lt;AppFileNameItem&amp;gt;
      &amp;lt;Visible&amp;gt;false&amp;lt;/Visible&amp;gt;
    &amp;lt;/AppFileNameItem&amp;gt;
    &amp;lt;AppFolderItem&amp;gt;
      &amp;lt;Visible&amp;gt;false&amp;lt;/Visible&amp;gt;
    &amp;lt;/AppFolderItem&amp;gt;
  &amp;lt;/ItemDefinitionGroup&amp;gt;
  
  &amp;lt;UsingTask AssemblyFile="$(BuildLib)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.Compression.Zip" /&amp;gt;
  
  &amp;lt;Target Name="Build"&amp;gt;
    &amp;lt;MakeDir Directories="$(OutputPath)" /&amp;gt;
    
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_AppCandidateFilesToZip Remove="@(_AppCandidateFilesToZip)" /&amp;gt;
      &amp;lt;_AppCandidateFilesToZip Include="@(Content);@(None)" /&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    
    &amp;lt;FindUnderPath Path="$(AppFolder)" Files="@(_AppCandidateFilesToZip)"&amp;gt;
      &amp;lt;Output TaskParameter="InPath" ItemName="_AppFilesToZip" /&amp;gt;
    &amp;lt;/FindUnderPath&amp;gt;
    &amp;lt;Message Text="App files to zip: @(_AppFilesToZip-&amp;gt;'%(RelativeDir)%(Filename)%(Extension)')" /&amp;gt;

    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_AppFolderFullPath&amp;gt;%(AppFolderItem.FullPath)&amp;lt;/_AppFolderFullPath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;Message Text="Creating package .zip at [%(AppFileNameItem.FullPath)]" Importance="high" /&amp;gt;
    &amp;lt;MSBuild.ExtensionPack.Compression.Zip 
      TaskAction="Create" 
      CompressFiles="@(_AppFilesToZip)" 
      ZipFileName="%(AppFileNameItem.FullPath)" 
      RemoveRoot="$(_AppFolderFullPath)" 
      CompressionLevel="BestCompression" /&amp;gt;
  &amp;lt;/Target&amp;gt;
  
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;RebuildDependsOn&amp;gt;
      Clean;
      Build;
    &amp;lt;/RebuildDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name="Rebuild" DependsOnTargets="$(RebuildDependsOn)" /&amp;gt;
  &amp;lt;Target Name="Clean"&amp;gt;
    &amp;lt;!-- delete all the files in the output folder --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_FilesToDelete Remove="@(_FilesToDelete)" /&amp;gt;
      &amp;lt;_FilesToDelete Include="$(OutputPath)**\*" /&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;Message Text="Deleting files: @(_FilesToDelete)" /&amp;gt;
    &amp;lt;Delete Files="@(_FilesToDelete)" /&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
As you can see I defined the following targets; Build, Rebuild, and Clean. This is
what we discussed earlier as the requirements. Now when I click the Build button in
VS a .zip file containing the Chrome Extension is created in the bin\ folder. Additionally
no other step (i.e. any typical build step) is performed here. The only thing happening
is what is defined in the Build target here. Similarly when I Rebuild or Clean the
Rebuild or Clean target is invoked respectively. This is&amp;nbsp; a pretty neat way to
modify an existing project to completely replace the build process to suit your needs.
&lt;/p&gt;
&lt;p&gt;
There are a few things in the .targets file that I’d like to point out.
&lt;/p&gt;
&lt;h3&gt;UseHostCompilerIfAvailable
&lt;/h3&gt;
&lt;p&gt;
In the .targets file I have set the property declaration &lt;em&gt;&amp;lt;UseHostCompilerIfAvailable&amp;gt;false&amp;lt;/UseHostCompilerIfAvailable&amp;gt;&lt;/em&gt;.
When you are working with a project in Visual Studio there is a compiler, the host
compiler, that Visual Studio has which can be used. For performance reasons in most
cases this compiler is used. In this case since we do not want any standard build
actions to be executed this performance trick is undesired. You can easily disable
this by setting this property to false.
&lt;/p&gt;
&lt;p&gt;
After this MSBuild will always be invoked when performing any build related action.
&lt;/p&gt;
&lt;h3&gt;Visible metadata for Item Lists
&lt;/h3&gt;
&lt;p&gt;
When using MSBuild you typically represent files as values within an item list. One
issue that you may encounter when modifying a project which will be loaded in VS is
that the files inside of those item lists will show up in Visual Studio. If you want
to disable this for a particular value in an item list you can add the well known
metadata &lt;em&gt;&amp;lt;Visible&amp;gt;false&amp;lt;/Visible&amp;gt;&lt;/em&gt;. For example you could have
the following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemGroup&amp;gt;
    &amp;lt;IntermediateFile Include="cache.temp"&amp;gt;
        &amp;lt;Visible&amp;gt;false&amp;lt;/Visible&amp;gt;
    &amp;lt;/IntermediateFile&amp;gt;
&amp;lt;/ItemGroup&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
If you don’t want to add this to every value in the item list then you can set the
default value using an &lt;a href="http://msdn.microsoft.com/en-us/library/bb629392.aspx"&gt;ItemDefinitionGroup&lt;/a&gt;.&amp;nbsp;
For example take a look at the elements below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemDefinitionGroup&amp;gt;
  &amp;lt;AppFileNameItem&amp;gt;
    &amp;lt;Visible&amp;gt;false&amp;lt;/Visible&amp;gt;
  &amp;lt;/AppFileNameItem&amp;gt;&lt;/pre&gt;&lt;pre class="brush: xml;"&gt;  &amp;lt;AppFolderItem&amp;gt;
    &amp;lt;Visible&amp;gt;false&amp;lt;/Visible&amp;gt;
  &amp;lt;/AppFolderItem&amp;gt;
&amp;lt;/ItemDefinitionGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
After this declaration is processed if the Visible metadata is accessed for &lt;em&gt;AppFileNameItem&lt;/em&gt; or &lt;em&gt;AppFolderItem&lt;/em&gt; on
a value which does not declare &lt;em&gt;Visible&lt;/em&gt;, then &lt;em&gt;false&lt;/em&gt; is returned.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The rest of the content of the .targets file is pretty straightforward. This post
shows a basic example of how you can take an existing Visual Studio project and completely
replace the build process. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This project is open source at &lt;a href="https://github.com/ligershark/BestPracticesChromeExtension"&gt;https://github.com/ligershark/BestPracticesChromeExtension&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,bb5cd38b-d064-47fa-a41a-129d01ac13d7.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2012</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=7dfba5a8-8424-4b74-8d07-86588007cdb1</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,7dfba5a8-8424-4b74-8d07-86588007cdb1.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,7dfba5a8-8424-4b74-8d07-86588007cdb1.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7dfba5a8-8424-4b74-8d07-86588007cdb1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Lately I’ve been working with Mads Kristensen on a cool new Visual Studio Extension, <a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd">Farticus</a>,
and wanted to share with you guys one of the things that I learned.
</p>
        <p>
When you are developing Visual Studio extension on of the things you should keep in
mind is the download size of the extension. This is the size of the .vsix file which
you upload to the gallery. If the download size is too large typically people may
get impatient and cancel the install. Because of this it’s a good idea to try and
get your .vsix to the smallest size possible.
</p>
        <p>
The good news here is that the .vsix file is already compressed. It’s actually a .zip
file renamed to .vsix. If you want to see what’s in a .vsix just rename it to .zip
and extract it out. The bad news is that the CreateZipPackage task used by the Microsoft.VsSdk.targets
file does not perform the best compression. Fortunately there are tasks to create
Zip files that we can use. I have chosen to use the <a href="http://www.msbuildextensionpack.com/help/4.0.5.0/html/f2118b59-554e-d745-5859-126a82b1df81.htm">Zip
task</a> from the <a href="http://www.msbuildextensionpack.com/">MSBuild Extension
Pack</a>.
</p>
        <p>
Before I go over all the details let’s take a look at what the final result will be
after we compress with the MSBuild Extension Pack. See the table below for the comparison
for two different projects.
</p>
        <table cellspacing="0" cellpadding="2" width="649" border="0">
          <tbody>
            <tr>
              <td valign="top" width="165">
                <p align="center">
                  <strong>
                    <u>Project</u>
                  </strong>
                </p>
              </td>
              <td valign="top" width="124">
                <p align="center">
                  <strong>
                    <u>VSIX Size Before</u>
                  </strong>
                </p>
              </td>
              <td valign="top" width="126">
                <p align="center">
                  <strong>
                    <u>VSIX Size After</u>
                  </strong>
                </p>
              </td>
              <td valign="top" width="232">
                <p align="center">
                  <strong>
                    <u>Reduction</u>
                  </strong>
                </p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="165">
                <a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd">Farticus</a>
              </td>
              <td valign="top" width="124">
442 kb</td>
              <td valign="top" width="126">
248 kb</td>
              <td valign="top" width="232">
43 % 
</td>
            </tr>
            <tr>
              <td valign="top" width="165">
                <a href="http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6">VS
Web Essentials</a>
              </td>
              <td valign="top" width="124">
2102 kb</td>
              <td valign="top" width="126">
740 kb</td>
              <td valign="top" width="232">
65 %</td>
            </tr>
          </tbody>
        </table>
        <p>
From the table above we can see that we can gain a significant amount of additional
compression by using the MSBuild extension pack.
</p>
        <p>
Below is the content that I pated into the .csproj file. I’ll paste it in it’s entirety
and then explain.
</p>
        <pre class="brush: xml;">&lt;PropertyGroup&gt;
  &lt;EnableCompressVsix Condition=" '$(EnableCompressVsix)'=='' "&gt;true&lt;/EnableCompressVsix&gt;
  &lt;BuildLib Condition=" '$(BuildLib)'=='' "&gt;$(MSBuildProjectDirectory)\..\Build\Lib\&lt;/BuildLib&gt;

&lt;/PropertyGroup&gt;
&lt;UsingTask AssemblyFile="$(BuildLib)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.Compression.Zip"/&gt;

&lt;Target Name="CompressVsix" 
        AfterTargets="CreateVsixContainer" 
        DependsOnTargets="PrepareReplceVsixTemp" 
        Condition=" '$(EnableCompressVsix)'=='true' "&gt;
    
  &lt;!-- copy the file to the obj folder and then party on it --&gt;
  &lt;MakeDir Directories="$(_TmpVsixDir);$(_TmpVsixDir)\Extracted\"/&gt;

  &lt;Copy SourceFiles="$(TargetVsixContainer)"
        DestinationFolder="$(_TmpVsixDir)"&gt;
    &lt;Output TaskParameter="CopiedFiles" ItemName="_TmpVsixCopy"/&gt;
  &lt;/Copy&gt;
    
  &lt;!-- extract out the .zip file --&gt;
  &lt;MSBuild.ExtensionPack.Compression.Zip 
    TaskAction="Extract" 
    ExtractPath="$(_TmpVsixDir)Extracted\" 
    ZipFileName="@(_TmpVsixCopy-&gt;'%(FullPath)')"/&gt;

  &lt;ItemGroup&gt;
    &lt;_FilesToZip Remove="@(_FilesToZip)"/&gt;
    &lt;_FilesToZip Include="$(_TmpVsixDir)Extracted\**\*"/&gt;
  &lt;/ItemGroup&gt;

  &lt;MSBuild.ExtensionPack.Compression.Zip
    TaskAction="Create"
    CompressFiles="@(_FilesToZip)"
    ZipFileName="%(_TmpVsixCopy.FullPath)"
    RemoveRoot="$(_TmpVsixDir)Extracted\"
    CompressionLevel="BestCompression" /&gt;

  &lt;Delete Files ="$(TargetVsixContainer)"/&gt;
  &lt;Copy SourceFiles="%(_TmpVsixCopy.FullPath)" DestinationFiles="$(TargetVsixContainer)" /&gt;
&lt;/Target&gt;

&lt;Target Name="PrepareReplceVsixTemp" DependsOnTargets="CreateVsixContainer"&gt;
  &lt;ItemGroup&gt;
    &lt;_VsixItem Remove="@(_VsixItem)"/&gt;
    &lt;_VsixItem Include="$(TargetVsixContainer)" /&gt;

    &lt;_TmpVsixPathItem Include="$(IntermediateOutputPath)VsixTemp\%(_VsixItem.Filename)%(_VsixItem.Extension)"/&gt;
  &lt;/ItemGroup&gt;
    
  &lt;PropertyGroup&gt;
    &lt;_TmpVsixDir&gt;%(_TmpVsixPathItem.RootDir)%(_TmpVsixPathItem.Directory)&lt;/_TmpVsixDir&gt;
  &lt;/PropertyGroup&gt;

  &lt;RemoveDir Directories="$(_TmpVsixDir)"/&gt;  
&lt;/Target&gt;  
</pre>
        <p>
 
</p>
        <p>
The snippet above perform the following actions.
</p>
        <ol>
          <li>
Remove the old VsixTemp folder from any previous build if it exists 
</li>
          <li>
Copy the source .vsix to the intermediate output path (i.e. obj\debug or obj\release) 
</li>
          <li>
Extract out the contents to a folder 
</li>
          <li>
Re-zip the file using MSBuild extension pack 
</li>
          <li>
Replace the output .vsix with the compressed one</li>
        </ol>
        <p>
 
</p>
        <p>
When building now the .vsix in the output folder should be smaller than it was before.
</p>
        <p>
In my case I have copied the necessary assemblies from the MSBuild Extension pack
and placed them in the projects repository. For the Zip task you’ll need the following
files.
</p>
        <ul>
          <li>
MSBuild.ExtensionPack.dll 
</li>
          <li>
Ionic.Zip.DLL</li>
        </ul>
        <p>
In my case I’ve placed them in a folder named Build\lib\.
</p>
        <p>
You should be able to copy/paste what I have here into your VSIX projects. You’ll
need to update the path to the MSBuild extension pack assemblies if you put them in
a different location. <em>Note: I’ve only tested this with Visual Studio 2012.</em></p>
        <p>
The MSBuild elements used here is pretty straight forward. If you have any questions
on this let me know.
</p>
        <p>
 
</p>
        <p>
You can find the source for the Farticus project at <a title="https://github.com/ligershark/Farticus/" href="https://github.com/ligershark/Farticus/">https://github.com/ligershark/Farticus/</a>.
Please send us a <strong>Pull </strong>(<em>my finger</em>) <strong>Request</strong>.
</p>
        <p>
 
</p>
        <p>
Thanks,<br />
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>How to compress a Visual Studio Extension (VSIX) during build</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,7dfba5a8-8424-4b74-8d07-86588007cdb1.aspx</guid>
      <link>http://sedodream.com/2013/05/13/HowToCompressAVisualStudioExtensionVSIXDuringBuild.aspx</link>
      <pubDate>Mon, 13 May 2013 00:11:54 GMT</pubDate>
      <description>&lt;p&gt;
Lately I’ve been working with Mads Kristensen on a cool new Visual Studio Extension, &lt;a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd"&gt;Farticus&lt;/a&gt;,
and wanted to share with you guys one of the things that I learned.
&lt;/p&gt;
&lt;p&gt;
When you are developing Visual Studio extension on of the things you should keep in
mind is the download size of the extension. This is the size of the .vsix file which
you upload to the gallery. If the download size is too large typically people may
get impatient and cancel the install. Because of this it’s a good idea to try and
get your .vsix to the smallest size possible.
&lt;/p&gt;
&lt;p&gt;
The good news here is that the .vsix file is already compressed. It’s actually a .zip
file renamed to .vsix. If you want to see what’s in a .vsix just rename it to .zip
and extract it out. The bad news is that the CreateZipPackage task used by the Microsoft.VsSdk.targets
file does not perform the best compression. Fortunately there are tasks to create
Zip files that we can use. I have chosen to use the &lt;a href="http://www.msbuildextensionpack.com/help/4.0.5.0/html/f2118b59-554e-d745-5859-126a82b1df81.htm"&gt;Zip
task&lt;/a&gt; from the &lt;a href="http://www.msbuildextensionpack.com/"&gt;MSBuild Extension
Pack&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Before I go over all the details let’s take a look at what the final result will be
after we compress with the MSBuild Extension Pack. See the table below for the comparison
for two different projects.
&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="649" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;u&gt;Project&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="124"&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;u&gt;VSIX Size Before&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="126"&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;u&gt;VSIX Size After&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="232"&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;u&gt;Reduction&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
&lt;a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd"&gt;Farticus&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="124"&gt;
442 kb&lt;/td&gt;
&lt;td valign="top" width="126"&gt;
248 kb&lt;/td&gt;
&lt;td valign="top" width="232"&gt;
43 % 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
&lt;a href="http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6"&gt;VS
Web Essentials&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="124"&gt;
2102 kb&lt;/td&gt;
&lt;td valign="top" width="126"&gt;
740 kb&lt;/td&gt;
&lt;td valign="top" width="232"&gt;
65 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
From the table above we can see that we can gain a significant amount of additional
compression by using the MSBuild extension pack.
&lt;/p&gt;
&lt;p&gt;
Below is the content that I pated into the .csproj file. I’ll paste it in it’s entirety
and then explain.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;EnableCompressVsix Condition=" '$(EnableCompressVsix)'=='' "&amp;gt;true&amp;lt;/EnableCompressVsix&amp;gt;
  &amp;lt;BuildLib Condition=" '$(BuildLib)'=='' "&amp;gt;$(MSBuildProjectDirectory)\..\Build\Lib\&amp;lt;/BuildLib&amp;gt;

&amp;lt;/PropertyGroup&amp;gt;
&amp;lt;UsingTask AssemblyFile="$(BuildLib)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.Compression.Zip"/&amp;gt;

&amp;lt;Target Name="CompressVsix" 
        AfterTargets="CreateVsixContainer" 
        DependsOnTargets="PrepareReplceVsixTemp" 
        Condition=" '$(EnableCompressVsix)'=='true' "&amp;gt;
    
  &amp;lt;!-- copy the file to the obj folder and then party on it --&amp;gt;
  &amp;lt;MakeDir Directories="$(_TmpVsixDir);$(_TmpVsixDir)\Extracted\"/&amp;gt;

  &amp;lt;Copy SourceFiles="$(TargetVsixContainer)"
        DestinationFolder="$(_TmpVsixDir)"&amp;gt;
    &amp;lt;Output TaskParameter="CopiedFiles" ItemName="_TmpVsixCopy"/&amp;gt;
  &amp;lt;/Copy&amp;gt;
    
  &amp;lt;!-- extract out the .zip file --&amp;gt;
  &amp;lt;MSBuild.ExtensionPack.Compression.Zip 
    TaskAction="Extract" 
    ExtractPath="$(_TmpVsixDir)Extracted\" 
    ZipFileName="@(_TmpVsixCopy-&amp;gt;'%(FullPath)')"/&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;_FilesToZip Remove="@(_FilesToZip)"/&amp;gt;
    &amp;lt;_FilesToZip Include="$(_TmpVsixDir)Extracted\**\*"/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;MSBuild.ExtensionPack.Compression.Zip
    TaskAction="Create"
    CompressFiles="@(_FilesToZip)"
    ZipFileName="%(_TmpVsixCopy.FullPath)"
    RemoveRoot="$(_TmpVsixDir)Extracted\"
    CompressionLevel="BestCompression" /&amp;gt;

  &amp;lt;Delete Files ="$(TargetVsixContainer)"/&amp;gt;
  &amp;lt;Copy SourceFiles="%(_TmpVsixCopy.FullPath)" DestinationFiles="$(TargetVsixContainer)" /&amp;gt;
&amp;lt;/Target&amp;gt;

&amp;lt;Target Name="PrepareReplceVsixTemp" DependsOnTargets="CreateVsixContainer"&amp;gt;
  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;_VsixItem Remove="@(_VsixItem)"/&amp;gt;
    &amp;lt;_VsixItem Include="$(TargetVsixContainer)" /&amp;gt;

    &amp;lt;_TmpVsixPathItem Include="$(IntermediateOutputPath)VsixTemp\%(_VsixItem.Filename)%(_VsixItem.Extension)"/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
    
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;_TmpVsixDir&amp;gt;%(_TmpVsixPathItem.RootDir)%(_TmpVsixPathItem.Directory)&amp;lt;/_TmpVsixDir&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;RemoveDir Directories="$(_TmpVsixDir)"/&amp;gt;  
&amp;lt;/Target&amp;gt;  
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The snippet above perform the following actions.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Remove the old VsixTemp folder from any previous build if it exists 
&lt;li&gt;
Copy the source .vsix to the intermediate output path (i.e. obj\debug or obj\release) 
&lt;li&gt;
Extract out the contents to a folder 
&lt;li&gt;
Re-zip the file using MSBuild extension pack 
&lt;li&gt;
Replace the output .vsix with the compressed one&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
When building now the .vsix in the output folder should be smaller than it was before.
&lt;/p&gt;
&lt;p&gt;
In my case I have copied the necessary assemblies from the MSBuild Extension pack
and placed them in the projects repository. For the Zip task you’ll need the following
files.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
MSBuild.ExtensionPack.dll 
&lt;li&gt;
Ionic.Zip.DLL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In my case I’ve placed them in a folder named Build\lib\.
&lt;/p&gt;
&lt;p&gt;
You should be able to copy/paste what I have here into your VSIX projects. You’ll
need to update the path to the MSBuild extension pack assemblies if you put them in
a different location. &lt;em&gt;Note: I’ve only tested this with Visual Studio 2012.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The MSBuild elements used here is pretty straight forward. If you have any questions
on this let me know.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You can find the source for the Farticus project at &lt;a title="https://github.com/ligershark/Farticus/" href="https://github.com/ligershark/Farticus/"&gt;https://github.com/ligershark/Farticus/&lt;/a&gt;.
Please send us a &lt;strong&gt;Pull &lt;/strong&gt;(&lt;em&gt;my finger&lt;/em&gt;) &lt;strong&gt;Request&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Thanks,&lt;br&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,7dfba5a8-8424-4b74-8d07-86588007cdb1.aspx</comments>
      <category>Visual Studio 11</category>
      <category>vs-extension</category>
      <category>VSIX</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=19245c5f-8119-45bf-be6e-acc60ea53ed8</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=19245c5f-8119-45bf-be6e-acc60ea53ed8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’m happy to say that my <a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735678162&amp;linkCode=as2&amp;tag=sedodream-20">Supplement
to Inside the Microsoft Build Engine</a> book (<em>co-author </em><a href="https://twitter.com/wbarthol"><em>William
Bartholomew</em></a>) has now been published. In fact it’s already in stock and ready
to be shipped by <a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735678162&amp;linkCode=as2&amp;tag=sedodream-20">Amazon.com</a>. 
</p>
        <p>
This book is a small addition (<em>118 pages</em>) to the previous book, <a href="http://www.amazon.com/gp/product/0735645248/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735645248&amp;linkCode=as2&amp;tag=sedodream-20">Inside
the Microsoft Build Engine 2nd edition</a>. It has a small price too, MSRP is $12.99
but it’s selling on Amazon.com for $8.99! In this book we cover the updates to MSBuild,
Team Build and Web Publishing in Visual Studio 2012. The foreword was written by <a href="http://www.hanselman.com/">Scott
Hanselman</a>, and you can <a href="http://blogs.msdn.com/b/microsoft_press/archive/2013/05/02/scott-hanselman-ah-the-thankless-life-of-the-build-master.aspx">read
the entire foreword online</a>. 
</p>
        <p>
Check out how thin the supplement is in comparison to the 2<sup>nd</sup> edition <em>#ThinIsIn</em>.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_2.jpg">
            <img title="945231_10103483509401051_968543011_n" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="945231_10103483509401051_968543011_n" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_thumb.jpg" width="274" height="484" />
          </a>
        </p>
        <p>
 
</p>
        <p>
If you already own the 2<sup>nd</sup> edition then you’ll love this update.
</p>
        <p>
 
</p>
        <h3>Table of Contents
</h3>
        <p>
Chapter 1: What's new in MSBuild
</p>
        <ol>
          <li>
Visual Studio project compatibility between 2010 and 2012 
</li>
          <li>
Out of Process Tasks 
</li>
          <li>
NuGet 
</li>
          <li>
XML Updates with SlowCheetah 
</li>
          <li>
Cookbook</li>
        </ol>
        <h5>Chapter 2: What's new in Team Build 2012
</h5>
        <ol>
          <li>
Installation 
</li>
          <li>
Team Foundation Service 
</li>
          <li>
User interface (UI) enhancements 
</li>
          <li>
Visual Studio Test Runner 
</li>
          <li>
Pausing build definitions 
</li>
          <li>
Batching 
</li>
          <li>
Logging 
</li>
          <li>
Windows Workflow Foundation 4.5 
</li>
          <li>
Cookbook</li>
        </ol>
        <h5>Chapter 3: What's new in Web Publishing
</h5>
        <ol>
          <li>
Overview of the new Publish Web Dialog 
</li>
          <li>
Building web packages 
</li>
          <li>
Publish profiles 
</li>
          <li>
Database publishing support 
</li>
          <li>
Profile-specific web.config transforms 
</li>
          <li>
Cookbook</li>
        </ol>
        <p>
 
</p>
        <p>
The book has been available in e-book form for a few weeks. Just long enough for us
to get our first review. It was 5 stars :).
</p>
        <p>
          <a href="http://www.amazon.com/review/RVXCZ4FAXMVE5/?_encoding=UTF8&amp;ASIN=B00CDXOWJW&amp;camp=1789&amp;creative=390957&amp;linkCode=ur2&amp;nodeID=&amp;tag=sedodream-20">
            <img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/image_3.png" width="644" height="254" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Please let us know what you think of this book! 
</p>
        <p>
 
</p>
        <p>
You can download all the samples and learn more at <a href="http://msbuildbook.com/">msbuildbook.com</a>.
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Book published and now in stock!</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</guid>
      <link>http://sedodream.com/2013/05/09/BookPublishedAndNowInStock.aspx</link>
      <pubDate>Thu, 09 May 2013 05:33:20 GMT</pubDate>
      <description>&lt;p&gt;
I’m happy to say that my &lt;a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735678162&amp;amp;linkCode=as2&amp;amp;tag=sedodream-20"&gt;Supplement
to Inside the Microsoft Build Engine&lt;/a&gt; book (&lt;em&gt;co-author &lt;/em&gt;&lt;a href="https://twitter.com/wbarthol"&gt;&lt;em&gt;William
Bartholomew&lt;/em&gt;&lt;/a&gt;) has now been published. In fact it’s already in stock and ready
to be shipped by &lt;a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735678162&amp;amp;linkCode=as2&amp;amp;tag=sedodream-20"&gt;Amazon.com&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
This book is a small addition (&lt;em&gt;118 pages&lt;/em&gt;) to the previous book, &lt;a href="http://www.amazon.com/gp/product/0735645248/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735645248&amp;amp;linkCode=as2&amp;amp;tag=sedodream-20"&gt;Inside
the Microsoft Build Engine 2nd edition&lt;/a&gt;. It has a small price too, MSRP is $12.99
but it’s selling on Amazon.com for $8.99! In this book we cover the updates to MSBuild,
Team Build and Web Publishing in Visual Studio 2012. The foreword was written by &lt;a href="http://www.hanselman.com/"&gt;Scott
Hanselman&lt;/a&gt;, and you can &lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2013/05/02/scott-hanselman-ah-the-thankless-life-of-the-build-master.aspx"&gt;read
the entire foreword online&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Check out how thin the supplement is in comparison to the 2&lt;sup&gt;nd&lt;/sup&gt; edition &lt;em&gt;#ThinIsIn&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_2.jpg"&gt;&lt;img title="945231_10103483509401051_968543011_n" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="945231_10103483509401051_968543011_n" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_thumb.jpg" width="274" height="484"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
If you already own the 2&lt;sup&gt;nd&lt;/sup&gt; edition then you’ll love this update.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Table of Contents
&lt;/h3&gt;
&lt;p&gt;
Chapter 1: What's new in MSBuild
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Visual Studio project compatibility between 2010 and 2012 
&lt;li&gt;
Out of Process Tasks 
&lt;li&gt;
NuGet 
&lt;li&gt;
XML Updates with SlowCheetah 
&lt;li&gt;
Cookbook&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Chapter 2: What's new in Team Build 2012
&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
Installation 
&lt;li&gt;
Team Foundation Service 
&lt;li&gt;
User interface (UI) enhancements 
&lt;li&gt;
Visual Studio Test Runner 
&lt;li&gt;
Pausing build definitions 
&lt;li&gt;
Batching 
&lt;li&gt;
Logging 
&lt;li&gt;
Windows Workflow Foundation 4.5 
&lt;li&gt;
Cookbook&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Chapter 3: What's new in Web Publishing
&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
Overview of the new Publish Web Dialog 
&lt;li&gt;
Building web packages 
&lt;li&gt;
Publish profiles 
&lt;li&gt;
Database publishing support 
&lt;li&gt;
Profile-specific web.config transforms 
&lt;li&gt;
Cookbook&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The book has been available in e-book form for a few weeks. Just long enough for us
to get our first review. It was 5 stars :).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.amazon.com/review/RVXCZ4FAXMVE5/?_encoding=UTF8&amp;amp;ASIN=B00CDXOWJW&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;linkCode=ur2&amp;amp;nodeID=&amp;amp;tag=sedodream-20"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/image_3.png" width="644" height="254"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Please let us know what you think of this book! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You can download all the samples and learn more at &lt;a href="http://msbuildbook.com/"&gt;msbuildbook.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</comments>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Team Build</category>
      <category>web</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=045f754f-516c-437a-91a0-908b482e011d</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,045f754f-516c-437a-91a0-908b482e011d.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,045f754f-516c-437a-91a0-908b482e011d.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=045f754f-516c-437a-91a0-908b482e011d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
OK seriously this is not really my first date with Comcast as I’ve been a long time
customer, but it was the initial setup for a new account. While visiting my family
in Florida, I decided to upgrade the internet at my parents house. They were using
another ISP and the connection was very slow. This post is a story of the experience
that I had after that.
</p>
        <p>
Before I get into all the details of what really upsets me, let me say that when the
Comcast technician left my house I would have given the setup 3 stars out of five.
The reasons why I would give the 3 star rating are below. The issues here are pretty
minor, I never would have blogged/tweeted about these issues as I encounter these
types of things everyday.
</p>
        <p>
          <strong>
            <u>
              <font style="background-color: #ffff00">The tech wore his shoes while going
in and out of the house</font>
            </u>
          </strong>
        </p>
        <p>
At this house we, like many other foreigners, take our shoes of either outside or
at the entrance. The Comcast tech did not have the respect to even ask if we cared
to have shoes removed or not. He freely went in and out with his shoes on. I didn’t
care enough to mention anything to him, but I did take notice of this. I know that
several other companies have their techs/reps wear “booties” to ensure that there
is no dirt tracked into the house. I’ve also had others simply take their shoes off
after asking. Comcast should care more about the wishes of their customers to ask
what the policy is at the given house.
</p>
        <p>
          <font style="background-color: #ffff00">
            <strong>The tech moved furniture to install
the modem but never moved it back</strong>
          </font>
        </p>
        <p>
While the tech was here, there was a dresser which was blocking the outlet. When he
was installing the modem he moved the dresser and did the work necessary. When he
left he didn’t care to move the dresser back. He also did not ask me if I would like
to have him move the dresser back.
</p>
        <p>
I found this to be extremely rude. If you go to a job and move something, it needs
to be moved back to its original location before you leave. Even with this I didn’t
say anything because I knew that I could simply move the item back to its original
location. This is concerning for the older Comcast customers though. I know if it
had been my mom or dad here alone they would have had significant issues getting that
piece of furniture back in it’s original location. I am hoping that the tech which
visited my home would have taken the age of my parents into consideration and moved
the item back before leaving.
</p>
        <p>
          <font style="background-color: #ffff00">
            <strong>The tech disabled my wireless and
never re-enabled it</strong>
          </font>
        </p>
        <p>
While troubleshooting the cable modem, the tech disabled my wireless adapter on my
computer. When he returned my computer to me, he had not re-enabled it. Once again,
not a big deal for me as I can re-enable it quicker then I could complain to him about
it. The bigger issue goes back to what if it was my parents here? If the tech disabled
wireless on my dad’s notebook and returned it to him, my dad would be calling me telling
me how his computer was hosed. Not a phone call I like to receive.
</p>
        <p>
Comcast, please if you mess with someone’s settings have the decency to revert them
back to the original settings. 
</p>
        <p>
For these reasons I would have given the experience 3 stars out of 5. Sure the tech
did a few things to piss me off, but in the end they were small insignificant issues <strong>for
me</strong>. I totally understand that for others this may not be the case, and those
are the customers which Comcast needs to be more careful with.
</p>
        <h2>Comcast is victimizing non-tech folks by hijacking their machines
</h2>
        <p>
After the tech left the house, I got back on my notebook and discovered a few really
shocking things. This was the same computer the tech was using to configure the modem.
I immediately took notice that there were <strong>three new shortcuts on my desktop
for Xfinity</strong>. I inspected them and they looked like they were just internet
shortcuts. I simply deleted them. Comcast, its my desktop not yours. Don’t litter
my desktop.
</p>
        <p>
After that I started up Chrome and immediately was taken to some Xfinity page. WTF,
really you <strong><font style="background-color: #ffff00">changed my default homepage</font></strong>to
Xfinity? I understand you are trying to get some extra traffic to your site, but <strong>this
is completely unacceptable</strong>. To top it off it was not only Chrome, it was
all the browsers which I had installed on my machine. This was incredibly frustrating.
Once again, what if this was my parents (or your parents perhaps)? My dad’s homepage
is configured to take him to <a href="http://www.bbc.co.uk/persian/">BBC Persian newspaper</a>.
My dad couldn’t figure out how to do that initially, how is he supposed to fix it
after the tech left? Comcast, do you think this is OK? How would have your parents
felt after this?
</p>
        <p>
After further investigation, I also discovered that <font style="background-color: #ffff00"><strong>the
search provider for my browser was changed to Xfinity</strong></font>. OMG this is
ridiculous, what the hell else has been updated? Comcast, these are my settings on
my machine. <strong>These are personal</strong> and you have no right to change these,
especially with out any type of consent. 
</p>
        <p>
Here is the result after opening Firefox.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/SNAGHTML3caa8949.png">
            <img title="SNAGHTML3caa8949" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="SNAGHTML3caa8949" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/SNAGHTML3caa8949_thumb.png" width="1176" height="620" />
          </a>
        </p>
        <p>
Wow, you’ve got some balls to set 4 different home pages on my browser. I do agree
that this is a wonderful way to drive traffic to your site. Especially for those customers
who do not know how to change these.
</p>
        <p>
Also <font style="background-color: #ffff00"><strong>take a look in the image to see
what happened to my favorites</strong>.</font></p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_2.png">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb.png" width="297" height="473" />
          </a>
        </p>
        <p>
I don’t use favorites that much as you can see, but there are now 8 Xfinity related
favorites here. OK seriously, this getting out of hand. These are not your favorites <strong>they
are mine</strong>. Do you not understand the concept that these do not belong to you?
</p>
        <p>
I looked to see if there was an Xfinity/Comcast installer in Add Remove programs but
there wasn’t. Comcast doesn’t even have the decency to provide a way for users to
undo all the damage that they have caused <strong>without asking me</strong>. Comcast,
this is the worst first date ever!
</p>
        <p>
The biggest issue that I have with this is the fact that I was never given an opportunity
to opt out of this. And at this point I’m not even sure if I’ve successfully reverted
back to the previous state.
</p>
        <h2>I’m not the only one who cares about this
</h2>
        <p>
Immediately as I discovered these issues I tweeted about it. What else was I supposed
to do?!
</p>
        <p>
          <a href="https://twitter.com/sayedihashimi/status/316275039093796864">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_7.png" width="458" height="187" />
          </a>
          <a href="https://twitter.com/sayedihashimi/status/316275272179662848">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_8.png" width="445" height="165" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Below are some responses from those in my twitter network.
</p>
        <p>
 
</p>
        <p>
          <a href="https://twitter.com/TMcManemy/status/316277672860868608">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_11.png" width="509" height="126" />
          </a>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_13.png">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb_4.png" width="505" height="106" />
          </a>
        </p>
        <p>
          <a href="https://twitter.com/dannycabrera/status/316276307304529921">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_16.png" width="507" height="122" />
          </a>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_18.png">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb_6.png" width="509" height="104" />
          </a>
        </p>
        <p>
After a bit of searching around I also found many others who were similarly upset
with these actions. Below are a few of the better ones.
</p>
        <p>
          <a href="https://twitter.com/EliasGlasch/status/93004248580755457">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_21.png" width="470" height="192" />
          </a>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_23.png">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb_8.png" width="513" height="145" />
          </a>
        </p>
        <p>
Remember when I mentioned my parents, and that they would be lost in correcting these
actions. Look at these people on the Firefox forums <strong>crying for help</strong>.
</p>
        <p>
          <a href="http://support.mozilla.org/en-US/questions/848259">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_26.png" width="515" height="164" />
          </a>
          <a href="https://support.mozilla.org/en-US/questions/773480">
            <img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_29.png" width="513" height="182" />
          </a>
        </p>
        <p>
This could be my mom or dad, or yours. Do the Comcast execs making these decisions
all have tech savvy parents that would never run into this? I find that hard to believe.
You can find some other links I put together <a href="http://storify.com/sayedihashimi/comcast-stop-installing-crapware">here</a>.
</p>
        <p>
Wow, its very clear that these customers do not want the homepage(s) that were set
for them. I feel sorry for these guys, they sign up for a service and all of a sudden
things change and they feel helpless. These are not the only two instances of this.
Comcast, your customers are speaking why are you not listening?
</p>
        <h2>What’s next?
</h2>
        <p>
At this point you might be wondering what I’m going to do about this? Am I going to
cancel the account I setup for my parents? Cancel my own account in Seattle? Call
to get my money back? I’m not going to be doing any of that. Since I’ll only be in
Florida for this week it would be difficult to get another ISP hooked up here. More
importantly I don’t hate Comcast, most of the time I don’t mind them. I’ve had their
service for years  and this won’t change that.
</p>
        <p>
My goals here are not to get money back (<em>although I did have to pay $50 for this
“service”</em>) or anything like that. What I’d like is for<strong> Comcast to change
their policies </strong>when setting up internet/cable services for new customers. <strong>Comcast,
you must respect peoples property</strong> (both digitally and physically) more than
you do today. This behavior is unacceptable and it should not continue. Minimally
people need to be informed when a technician is making changes to ones machine, and
have the ability to opt out of it. There should also be a mechanism for a clean rollback.
I trusted your tech and did not watch over him. I know better for next time. When
installing malicious software on a machine to set the home page(s) it’s clear that
you are acting in Comcast’s best interest. <strong>You need to start putting customers
first</strong>. 
</p>
        <p>
I’m especially concerned with elderly clients. If my parents had received the same
treatment that I did, they would not be in a good spot. My dad’s homepage would have
been changed from BBC Persian to Xfinty, his wireless would have been disabled, his
dresser would have been displaced, his favorites cramped, his desktop cluttered and
he would have been performing internet with Xfinity. Because of that I’ll be sharing
this letter with the following.
</p>
        <ol>
          <li>
As many Comcast execs that I can find on twitter/email – I have personally witnessed
how impactful it is for a customer to email a VP, now its time for me to use that
technique</li>
          <li>
            <a href="http://www.bbb.org/">Better Business Bureau</a> – these types of business
practices are not OK, they need to stop</li>
          <li>
            <a href="http://ftc.gov/">Federal Trade Commission</a> – they are an advocate for
the consumer, hopefully others have informed them of this previously</li>
          <li>
            <a href="http://www.aarp.org/">AARP</a> – the older community needs to be informed
and protected here</li>
        </ol>
        <p>
If there are any Comcast guys out there you can reach me at <a href="mailto:sayed.hashimi@gmail.com">sayed.hashimi@gmail.com</a> or
on <a href="https://twitter.com/sayedihashimi">twitter</a>.
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a> | <a href="http://msbuildbook.com/">http://msbuildbook.com/</a></p>
      </body>
      <title>My first date with Comcast/Xfinity left me feeling used and dirty</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,045f754f-516c-437a-91a0-908b482e011d.aspx</guid>
      <link>http://sedodream.com/2013/03/26/MyFirstDateWithComcastXfinityLeftMeFeelingUsedAndDirty.aspx</link>
      <pubDate>Tue, 26 Mar 2013 16:07:16 GMT</pubDate>
      <description>&lt;p&gt;
OK seriously this is not really my first date with Comcast as I’ve been a long time
customer, but it was the initial setup for a new account. While visiting my family
in Florida, I decided to upgrade the internet at my parents house. They were using
another ISP and the connection was very slow. This post is a story of the experience
that I had after that.
&lt;/p&gt;
&lt;p&gt;
Before I get into all the details of what really upsets me, let me say that when the
Comcast technician left my house I would have given the setup 3 stars out of five.
The reasons why I would give the 3 star rating are below. The issues here are pretty
minor, I never would have blogged/tweeted about these issues as I encounter these
types of things everyday.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;&lt;font style="background-color: #ffff00"&gt;The tech wore his shoes while going
in and out of the house&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
At this house we, like many other foreigners, take our shoes of either outside or
at the entrance. The Comcast tech did not have the respect to even ask if we cared
to have shoes removed or not. He freely went in and out with his shoes on. I didn’t
care enough to mention anything to him, but I did take notice of this. I know that
several other companies have their techs/reps wear “booties” to ensure that there
is no dirt tracked into the house. I’ve also had others simply take their shoes off
after asking. Comcast should care more about the wishes of their customers to ask
what the policy is at the given house.
&lt;/p&gt;
&lt;p&gt;
&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;The tech moved furniture to install
the modem but never moved it back&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
While the tech was here, there was a dresser which was blocking the outlet. When he
was installing the modem he moved the dresser and did the work necessary. When he
left he didn’t care to move the dresser back. He also did not ask me if I would like
to have him move the dresser back.
&lt;/p&gt;
&lt;p&gt;
I found this to be extremely rude. If you go to a job and move something, it needs
to be moved back to its original location before you leave. Even with this I didn’t
say anything because I knew that I could simply move the item back to its original
location. This is concerning for the older Comcast customers though. I know if it
had been my mom or dad here alone they would have had significant issues getting that
piece of furniture back in it’s original location. I am hoping that the tech which
visited my home would have taken the age of my parents into consideration and moved
the item back before leaving.
&lt;/p&gt;
&lt;p&gt;
&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;The tech disabled my wireless and
never re-enabled it&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
While troubleshooting the cable modem, the tech disabled my wireless adapter on my
computer. When he returned my computer to me, he had not re-enabled it. Once again,
not a big deal for me as I can re-enable it quicker then I could complain to him about
it. The bigger issue goes back to what if it was my parents here? If the tech disabled
wireless on my dad’s notebook and returned it to him, my dad would be calling me telling
me how his computer was hosed. Not a phone call I like to receive.
&lt;/p&gt;
&lt;p&gt;
Comcast, please if you mess with someone’s settings have the decency to revert them
back to the original settings. 
&lt;/p&gt;
&lt;p&gt;
For these reasons I would have given the experience 3 stars out of 5. Sure the tech
did a few things to piss me off, but in the end they were small insignificant issues &lt;strong&gt;for
me&lt;/strong&gt;. I totally understand that for others this may not be the case, and those
are the customers which Comcast needs to be more careful with.
&lt;/p&gt;
&lt;h2&gt;Comcast is victimizing non-tech folks by hijacking their machines
&lt;/h2&gt;
&lt;p&gt;
After the tech left the house, I got back on my notebook and discovered a few really
shocking things. This was the same computer the tech was using to configure the modem.
I immediately took notice that there were &lt;strong&gt;three new shortcuts on my desktop
for Xfinity&lt;/strong&gt;. I inspected them and they looked like they were just internet
shortcuts. I simply deleted them. Comcast, its my desktop not yours. Don’t litter
my desktop.
&lt;/p&gt;
&lt;p&gt;
After that I started up Chrome and immediately was taken to some Xfinity page. WTF,
really you &lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;changed my default homepage&lt;/font&gt; &lt;/strong&gt;to
Xfinity? I understand you are trying to get some extra traffic to your site, but &lt;strong&gt;this
is completely unacceptable&lt;/strong&gt;. To top it off it was not only Chrome, it was
all the browsers which I had installed on my machine. This was incredibly frustrating.
Once again, what if this was my parents (or your parents perhaps)? My dad’s homepage
is configured to take him to &lt;a href="http://www.bbc.co.uk/persian/"&gt;BBC Persian newspaper&lt;/a&gt;.
My dad couldn’t figure out how to do that initially, how is he supposed to fix it
after the tech left? Comcast, do you think this is OK? How would have your parents
felt after this?
&lt;/p&gt;
&lt;p&gt;
After further investigation, I also discovered that &lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;the
search provider for my browser was changed to Xfinity&lt;/strong&gt;&lt;/font&gt;. OMG this is
ridiculous, what the hell else has been updated? Comcast, these are my settings on
my machine. &lt;strong&gt;These are personal&lt;/strong&gt; and you have no right to change these,
especially with out any type of consent. 
&lt;/p&gt;
&lt;p&gt;
Here is the result after opening Firefox.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/SNAGHTML3caa8949.png"&gt;&lt;img title="SNAGHTML3caa8949" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="SNAGHTML3caa8949" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/SNAGHTML3caa8949_thumb.png" width="1176" height="620" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Wow, you’ve got some balls to set 4 different home pages on my browser. I do agree
that this is a wonderful way to drive traffic to your site. Especially for those customers
who do not know how to change these.
&lt;/p&gt;
&lt;p&gt;
Also &lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;take a look in the image to see
what happened to my favorites&lt;/strong&gt;.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb.png" width="297" height="473" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I don’t use favorites that much as you can see, but there are now 8 Xfinity related
favorites here. OK seriously, this getting out of hand. These are not your favorites &lt;strong&gt;they
are mine&lt;/strong&gt;. Do you not understand the concept that these do not belong to you?
&lt;/p&gt;
&lt;p&gt;
I looked to see if there was an Xfinity/Comcast installer in Add Remove programs but
there wasn’t. Comcast doesn’t even have the decency to provide a way for users to
undo all the damage that they have caused &lt;strong&gt;without asking me&lt;/strong&gt;. Comcast,
this is the worst first date ever!
&lt;/p&gt;
&lt;p&gt;
The biggest issue that I have with this is the fact that I was never given an opportunity
to opt out of this. And at this point I’m not even sure if I’ve successfully reverted
back to the previous state.
&lt;/p&gt;
&lt;h2&gt;I’m not the only one who cares about this
&lt;/h2&gt;
&lt;p&gt;
Immediately as I discovered these issues I tweeted about it. What else was I supposed
to do?!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://twitter.com/sayedihashimi/status/316275039093796864"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_7.png" width="458" height="187" /&gt;&lt;/a&gt; &lt;a href="https://twitter.com/sayedihashimi/status/316275272179662848"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_8.png" width="445" height="165" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Below are some responses from those in my twitter network.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://twitter.com/TMcManemy/status/316277672860868608"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_11.png" width="509" height="126" /&gt;&lt;/a&gt; &lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_13.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb_4.png" width="505" height="106" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://twitter.com/dannycabrera/status/316276307304529921"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_16.png" width="507" height="122" /&gt;&lt;/a&gt; &lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_18.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb_6.png" width="509" height="104" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
After a bit of searching around I also found many others who were similarly upset
with these actions. Below are a few of the better ones.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://twitter.com/EliasGlasch/status/93004248580755457"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_21.png" width="470" height="192" /&gt;&lt;/a&gt; &lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_23.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_thumb_8.png" width="513" height="145" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Remember when I mentioned my parents, and that they would be lost in correcting these
actions. Look at these people on the Firefox forums &lt;strong&gt;crying for help&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://support.mozilla.org/en-US/questions/848259"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_26.png" width="515" height="164" /&gt;&lt;/a&gt; &lt;a href="https://support.mozilla.org/en-US/questions/773480"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/My-first-date-with-Comcast-left-me-feeli_F326/image_29.png" width="513" height="182" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
This could be my mom or dad, or yours. Do the Comcast execs making these decisions
all have tech savvy parents that would never run into this? I find that hard to believe.
You can find some other links I put together &lt;a href="http://storify.com/sayedihashimi/comcast-stop-installing-crapware"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Wow, its very clear that these customers do not want the homepage(s) that were set
for them. I feel sorry for these guys, they sign up for a service and all of a sudden
things change and they feel helpless. These are not the only two instances of this.
Comcast, your customers are speaking why are you not listening?
&lt;/p&gt;
&lt;h2&gt;What’s next?
&lt;/h2&gt;
&lt;p&gt;
At this point you might be wondering what I’m going to do about this? Am I going to
cancel the account I setup for my parents? Cancel my own account in Seattle? Call
to get my money back? I’m not going to be doing any of that. Since I’ll only be in
Florida for this week it would be difficult to get another ISP hooked up here. More
importantly I don’t hate Comcast, most of the time I don’t mind them. I’ve had their
service for years&amp;#160; and this won’t change that.
&lt;/p&gt;
&lt;p&gt;
My goals here are not to get money back (&lt;em&gt;although I did have to pay $50 for this
“service”&lt;/em&gt;) or anything like that. What I’d like is for&lt;strong&gt; Comcast to change
their policies &lt;/strong&gt;when setting up internet/cable services for new customers. &lt;strong&gt;Comcast,
you must respect peoples property&lt;/strong&gt; (both digitally and physically) more than
you do today. This behavior is unacceptable and it should not continue. Minimally
people need to be informed when a technician is making changes to ones machine, and
have the ability to opt out of it. There should also be a mechanism for a clean rollback.
I trusted your tech and did not watch over him. I know better for next time. When
installing malicious software on a machine to set the home page(s) it’s clear that
you are acting in Comcast’s best interest. &lt;strong&gt;You need to start putting customers
first&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
I’m especially concerned with elderly clients. If my parents had received the same
treatment that I did, they would not be in a good spot. My dad’s homepage would have
been changed from BBC Persian to Xfinty, his wireless would have been disabled, his
dresser would have been displaced, his favorites cramped, his desktop cluttered and
he would have been performing internet with Xfinity. Because of that I’ll be sharing
this letter with the following.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
As many Comcast execs that I can find on twitter/email – I have personally witnessed
how impactful it is for a customer to email a VP, now its time for me to use that
technique&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.bbb.org/"&gt;Better Business Bureau&lt;/a&gt; – these types of business
practices are not OK, they need to stop&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://ftc.gov/"&gt;Federal Trade Commission&lt;/a&gt; – they are an advocate for
the consumer, hopefully others have informed them of this previously&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.aarp.org/"&gt;AARP&lt;/a&gt; – the older community needs to be informed
and protected here&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
If there are any Comcast guys out there you can reach me at &lt;a href="mailto:sayed.hashimi@gmail.com"&gt;sayed.hashimi@gmail.com&lt;/a&gt; or
on &lt;a href="https://twitter.com/sayedihashimi"&gt;twitter&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt; | &lt;a href="http://msbuildbook.com/"&gt;http://msbuildbook.com/&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,045f754f-516c-437a-91a0-908b482e011d.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=7d187729-cc9c-4654-8d15-a4bc4372f91d</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,7d187729-cc9c-4654-8d15-a4bc4372f91d.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,7d187729-cc9c-4654-8d15-a4bc4372f91d.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7d187729-cc9c-4654-8d15-a4bc4372f91d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today on twitter <a href="https://twitter.com/nunofcosta">@nunofcosta</a> asked me
roughly the question “<em>How do I publish one web project from a solution that contains
many?</em>”
</p>
        <p>
The issue that he is running into is that he is building from the command line and
passing the following properties to msbuild.exe.
</p>
        <pre class="brush: xml;">    /p:DeployOnBuild=true
    /p:PublishProfile='siteone - Web Deploy'
    /p:Password=%password%
</pre>
        <p>
You can read more about how to automate publishing at <a title="http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx" href="http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx">http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx</a>.
</p>
        <p>
When you pass these properties to msbuild.exe they are known as global properties.
These properties are difficult to override and are passed to every project that is
built. Because of this if you have a solution with multiple web projects, when each
web project is built it is passed in the same set of properties. Because of this when
each project is built the publish process for that project will start and it will
expect to find a file named <strong>siteone – Web Deploy.pubxml</strong> in the folder
Properties\PublishProfiles\. If the file doesn’t exist the operation may fail.
</p>
        <blockquote>
          <p>
            <em>Note: If you are interested in using this technique for an orchestrated publish
see my comments at </em>
            <a title="http://stackoverflow.com/a/14231729/105999" href="http://stackoverflow.com/a/14231729/105999">
              <em>http://stackoverflow.com/a/14231729/105999</em>
            </a>
            <em> before
doing so.</em>
          </p>
        </blockquote>
        <p>
So how can we resolve this? 
</p>
        <p>
Let’s take a look at a sample (see links below). I have a solution, <strong>PublishOnlyOne</strong>,
with the following projects.
</p>
        <ol>
          <li>
ProjA 
</li>
          <li>
ProjB</li>
        </ol>
        <p>
ProjA has a publish profile named ‘<strong>siteone – Web Deploy</strong>’, ProjB does
not. When trying to publish this you may try the following command line.
</p>
        <pre class="brush: xml;">    msbuild.exe PublishOnlyOne.sln /p:DeployOnBuild=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password%
</pre>
        <p>
          <em>See publish-sln.cmd in the samples.</em>
        </p>
        <p>
If you do this, when its time for ProjB to build it will fail because there’s no <strong>siteone
– Web Deploy</strong> profile for that project. Because of this, we cannot pass DeployOnBuild.
Instead here is what we need to do.
</p>
        <ol>
          <li>
Edit ProjA.csproj to define another property which will conditionally set DeployOnBuild 
</li>
          <li>
From the command line pass in that property</li>
        </ol>
        <p>
 
</p>
        <p>
I edited ProjA and added the following property group before the Import statements
in the .csproj file.
</p>
        <pre class="brush: xml;">&lt;PropertyGroup&gt;
  &lt;DeployOnBuild Condition=" '$(DeployProjA)'!='' "&gt;$(DeployProjA)&lt;/DeployOnBuild&gt;
&lt;/PropertyGroup&gt;
</pre>
        <p>
 
</p>
        <p>
Here you can see that DeployOnBuild is set to whatever value DeployProjA is as long
as it’s not empty. Now the revised command is:
</p>
        <pre class="brush: xml;">    msbuild.exe PublishOnlyOne.sln /p:DeployProjA=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password%
</pre>
        <p>
Here instead of passing DeployOnBuild, I pass in DeployProjA which will then set DeployOnBuild.
Since DeployOnBuild wasn’t passed to ProjB it will not attempt to publish.
</p>
        <p>
 
</p>
        <p>
You can find the complete sample at <a title="https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne" href="https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne">https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne</a>. 
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a> | <a href="http://msbuildbook.com/">http://msbuildbook.com/</a></p>
      </body>
      <title>How to publish one web project from a solution</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,7d187729-cc9c-4654-8d15-a4bc4372f91d.aspx</guid>
      <link>http://sedodream.com/2013/03/06/HowToPublishOneWebProjectFromASolution.aspx</link>
      <pubDate>Wed, 06 Mar 2013 02:48:41 GMT</pubDate>
      <description>&lt;p&gt;
Today on twitter &lt;a href="https://twitter.com/nunofcosta"&gt;@nunofcosta&lt;/a&gt; asked me
roughly the question “&lt;em&gt;How do I publish one web project from a solution that contains
many?&lt;/em&gt;”
&lt;/p&gt;
&lt;p&gt;
The issue that he is running into is that he is building from the command line and
passing the following properties to msbuild.exe.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;    /p:DeployOnBuild=true
    /p:PublishProfile='siteone - Web Deploy'
    /p:Password=%password%
&lt;/pre&gt;
&lt;p&gt;
You can read more about how to automate publishing at &lt;a title="http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx" href="http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx"&gt;http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
When you pass these properties to msbuild.exe they are known as global properties.
These properties are difficult to override and are passed to every project that is
built. Because of this if you have a solution with multiple web projects, when each
web project is built it is passed in the same set of properties. Because of this when
each project is built the publish process for that project will start and it will
expect to find a file named &lt;strong&gt;siteone – Web Deploy.pubxml&lt;/strong&gt; in the folder
Properties\PublishProfiles\. If the file doesn’t exist the operation may fail.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Note: If you are interested in using this technique for an orchestrated publish
see my comments at &lt;/em&gt;&lt;a title="http://stackoverflow.com/a/14231729/105999" href="http://stackoverflow.com/a/14231729/105999"&gt;&lt;em&gt;http://stackoverflow.com/a/14231729/105999&lt;/em&gt;&lt;/a&gt;&lt;em&gt; before
doing so.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So how can we resolve this? 
&lt;/p&gt;
&lt;p&gt;
Let’s take a look at a sample (see links below). I have a solution, &lt;strong&gt;PublishOnlyOne&lt;/strong&gt;,
with the following projects.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
ProjA 
&lt;li&gt;
ProjB&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
ProjA has a publish profile named ‘&lt;strong&gt;siteone – Web Deploy&lt;/strong&gt;’, ProjB does
not. When trying to publish this you may try the following command line.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;    msbuild.exe PublishOnlyOne.sln /p:DeployOnBuild=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password%
&lt;/pre&gt;
&lt;p&gt;
&lt;em&gt;See publish-sln.cmd in the samples.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
If you do this, when its time for ProjB to build it will fail because there’s no &lt;strong&gt;siteone
– Web Deploy&lt;/strong&gt; profile for that project. Because of this, we cannot pass DeployOnBuild.
Instead here is what we need to do.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Edit ProjA.csproj to define another property which will conditionally set DeployOnBuild 
&lt;li&gt;
From the command line pass in that property&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I edited ProjA and added the following property group before the Import statements
in the .csproj file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;DeployOnBuild Condition=" '$(DeployProjA)'!='' "&amp;gt;$(DeployProjA)&amp;lt;/DeployOnBuild&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Here you can see that DeployOnBuild is set to whatever value DeployProjA is as long
as it’s not empty. Now the revised command is:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;    msbuild.exe PublishOnlyOne.sln /p:DeployProjA=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password%
&lt;/pre&gt;
&lt;p&gt;
Here instead of passing DeployOnBuild, I pass in DeployProjA which will then set DeployOnBuild.
Since DeployOnBuild wasn’t passed to ProjB it will not attempt to publish.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You can find the complete sample at &lt;a title="https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne" href="https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne"&gt;https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt; | &lt;a href="http://msbuildbook.com/"&gt;http://msbuildbook.com/&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,7d187729-cc9c-4654-8d15-a4bc4372f91d.aspx</comments>
      <category>MSDeploy</category>
      <category>web</category>
      <category>Web Deployment Tool</category>
      <category>Web Development</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=25ddd39e-59de-4e35-becc-de19dcc5e4ea</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,25ddd39e-59de-4e35-becc-de19dcc5e4ea.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,25ddd39e-59de-4e35-becc-de19dcc5e4ea.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=25ddd39e-59de-4e35-becc-de19dcc5e4ea</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On twitter <a href="https://twitter.com/vishcious">@vishcious</a> asked me a question
related to publishing. The question was
</p>
        <quote>
I have a web project that I am publishing to multiple locations using Visual Studio.
I have setup multiple profiles and would like to update the values for these app settings
differently for each profile. How can I achieve this? I am using parameters.xml to
define the MSDeploy parameters.
</quote>
        <p>
 
</p>
        <p>
          <em>Note: If you are publishing from VS and don’t care about packaging then you can
use profile specific transforms as a simpler way to achieve this result. The rest
of the post here assumes you specifically want MSDeploy parameters. To learn more
about profile specific transforms see my short video at </em>
          <a href="http://www.youtube.com/watch?v=HdPK8mxpKEI">
            <em>http://www.youtube.com/watch?v=HdPK8mxpKEI</em>
          </a>
          <em>
          </em>
        </p>
        <p>
If you are not familiar you can create custom MSDeploy parameters when you publish/package
your application by creating an XML file named parameters.xml in the root of the project.
A good resource on this is <a href="http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html">Vishal’s
blog post</a>. I have  created a sample (<em>links below</em>) which demonstrates
how to accomplish what the task. Below are the project artifacts that I’ve created
to setup the parameters.
</p>
        <p>
          <strong>
            <u>web.config</u>
          </strong>
        </p>
        <pre class="brush: xml;">&lt;?xml version="1.0"?&gt;
&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="email" value="default@example.com"/&gt;
    &lt;add key="url" value="example.com"/&gt;
  &lt;/appSettings&gt;
&lt;/configuration&gt;

</pre>
        <p>
          <strong>
            <u>Parameters.xml</u>
          </strong>
        </p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;parameters &gt;

  &lt;parameter name="email" description="description"&gt;
    &lt;parameterEntry kind="XmlFile" 
                    scope="\\web.config$" 
                    match="/configuration/appSettings/add[@key='email']/@value" /&gt;
  &lt;/parameter&gt;

  &lt;parameter name="url" description="description"&gt;
    &lt;parameterEntry kind="XmlFile" 
                    scope="\\web.config$" 
                    match="/configuration/appSettings/add[@key='url']/@value" /&gt;
  &lt;/parameter&gt;

&lt;/parameters&gt;
</pre>
        <p>
In the parameters.xml file I have defined two new MSDeploy parameters., email and
url. This file should be placed in the root of the project directory and it will automatically
be picked up by the web publish process. If you are familiar with this you may have
noticed that I have left off the DefaultValue attribute here. More to come on that
later. Now that we have our parameters defined let’s see what customizations need
to be made to the publish profiles (.pubxml files).
</p>
        <p>
You can override the values by populating the <em>MsDeployDeclareParameters</em> item
list. Let’s see how to do that. When you create a publish profile in Visual Studio
a .pubxml file is written to the folder Properties\PublishProfiles. These are MSBuild
files and they are consumed during the build+publish operation. You can customize
these files in order to fine tune the publish process. In my sample project I have
two publish profiles created; <strong>siteone</strong> and <strong>sitetwo</strong>.
Both of these are web profiles pointing to <a href="http://www.windowsazure.com/en-us/home/scenarios/web-sites/">Azure
Web Sites</a>. In the publish profiles with the samples you will find two sets of
elements; properties for publishing and  my parameter customizations. You can
see the content of these profiles below, I’ve left off the MSDeploy settings for brevity.
Those profiles are shown below.
</p>
        <p>
          <strong>
            <u>siteone.pubxml</u>
          </strong>
        </p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
    &lt;!-- Web deploy settings here --&gt;  

  &lt;ItemGroup&gt;
    &lt;MsDeployDeclareParameters Include="email"&gt;
      &lt;DefaultValue&gt;one@email.com&lt;/DefaultValue&gt;
    &lt;/MsDeployDeclareParameters&gt;
    &lt;MsDeployDeclareParameters Include="url"&gt;
      &lt;DefaultValue&gt;http://one.example.com/&lt;/DefaultValue&gt;
    &lt;/MsDeployDeclareParameters&gt;
  &lt;/ItemGroup&gt;
&lt;/Project&gt;</pre>
        <p>
          <strong>
            <u>sitetwo.pubxml</u>
          </strong>
        </p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;!-- Web Deploy settings here --&gt;

  &lt;ItemGroup&gt;
    &lt;MsDeployDeclareParameters Include="email"&gt;
      &lt;DefaultValue&gt;two@email.com&lt;/DefaultValue&gt;
    &lt;/MsDeployDeclareParameters&gt;
    &lt;MsDeployDeclareParameters Include="url"&gt;
      &lt;DefaultValue&gt;http://two.example.com/&lt;/DefaultValue&gt;
    &lt;/MsDeployDeclareParameters&gt;
  &lt;/ItemGroup&gt;
&lt;/Project&gt;
</pre>
        <p>
In these profiles you can see that I’ve  added a usage of MSDeployDeclareParameters
for both parameters in parameters.xml. In each case the value for the Include attribute
is the name of the parameter (<em>matches the name attribute in parameters.xml</em>).
Along with that I’ve declared a value for the DefaultValue metadata. This will contain
the value of the parameter when it is published using that profile.
</p>
        <p>
After publishing <strong>siteone</strong> the values for the app settings are below.
</p>
        <ul>
          <li>
email = <strong>one@email.com </strong></li>
          <li>
url = <strong>http://one.example.com/ </strong></li>
        </ul>
        <p>
When publishing with <strong>sitetwo </strong>the values
</p>
        <ul>
          <li>
email = <strong>two@email.com </strong></li>
          <li>
url = <strong>http://two.example.com/ </strong></li>
        </ul>
        <p>
 
</p>
        <p>
That’s it. Now let’s move on to the comment I made previously regarding the DefaultValue
attribute that I left off of the parameters.xml file.
</p>
        <p>
          <strong>
            <u>
            </u>
          </strong> 
</p>
        <p>
          <strong>
            <u>DefaultValue</u>
          </strong>
        </p>
        <p>
When you create parameters and set their values there are a few different places that
these can come from including; parameters.xml, auto generated from con strings and
custom declared parameters in MSBuild. Because of this the Web Publishing Pipeline
has a mechanism to prioritize parameters when there are duplicates. This is facilitated
by a Priority metadata value on the MSDeployDeclareParameters item list. If you want
to Declare a DefaultValue inside of the parameters.xml file you can do that, but you
have to be aware of the impact of that. When you add a DefaultValue parameter in parameters.xml
by default those values will take precedence over the items in MSDeployDeclareParameters.
Because of that you’ll have to add a Priority value. The way the Priority works is
that the item with the lowest priority value for a given parameter will win. The default
priority value for params from parameters.xml is –50 (<em>defined in Microsoft.Web.Publishing.targets</em>).
Because of that we have to add priority less than –50. For example.
</p>
        <pre class="brush: xml;">&lt;ItemGroup&gt;
  &lt;MsDeployDeclareParameters Include="email"&gt;
    &lt;DefaultValue&gt;two@email.com&lt;/DefaultValue&gt;
    &lt;Priority&gt;-100&lt;/Priority&gt;
  &lt;/MsDeployDeclareParameters&gt;
  &lt;MsDeployDeclareParameters Include="url"&gt;
    &lt;DefaultValue&gt;http://two.example.com/&lt;/DefaultValue&gt;
    &lt;Priority&gt;-100&lt;/Priority&gt;
  &lt;/MsDeployDeclareParameters&gt;
&lt;/ItemGroup&gt;
</pre>
        <p>
 
</p>
        <p>
In this case when I publish these values will override the default value from the
parameters.xml.
</p>
        <p>
 
</p>
        <p>
You can see the latest version of this at <a title="https://github.com/sayedihashimi/publish-samples/tree/master/AppSettingsPerProfile" href="https://github.com/sayedihashimi/publish-samples/tree/master/AppSettingsPerProfile">https://github.com/sayedihashimi/publish-samples/tree/master/AppSettingsPerProfile</a>.
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a> | <a href="http://msbuldbook.com">http://msbuldbook.com</a></p>
      </body>
      <title>MSDeploy: How to update app settings on publish based on the publish profile</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,25ddd39e-59de-4e35-becc-de19dcc5e4ea.aspx</guid>
      <link>http://sedodream.com/2013/03/02/MSDeployHowToUpdateAppSettingsOnPublishBasedOnThePublishProfile.aspx</link>
      <pubDate>Sat, 02 Mar 2013 03:36:00 GMT</pubDate>
      <description>&lt;p&gt;
On twitter &lt;a href="https://twitter.com/vishcious"&gt;@vishcious&lt;/a&gt; asked me a question
related to publishing. The question was
&lt;/p&gt;
&lt;quote&gt;
I have a web project that I am publishing to multiple locations using Visual Studio.
I have setup multiple profiles and would like to update the values for these app settings
differently for each profile. How can I achieve this? I am using parameters.xml to
define the MSDeploy parameters.
&lt;/quote&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Note: If you are publishing from VS and don’t care about packaging then you can
use profile specific transforms as a simpler way to achieve this result. The rest
of the post here assumes you specifically want MSDeploy parameters. To learn more
about profile specific transforms see my short video at &lt;/em&gt;&lt;a href="http://www.youtube.com/watch?v=HdPK8mxpKEI"&gt;&lt;em&gt;http://www.youtube.com/watch?v=HdPK8mxpKEI&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
If you are not familiar you can create custom MSDeploy parameters when you publish/package
your application by creating an XML file named parameters.xml in the root of the project.
A good resource on this is &lt;a href="http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html"&gt;Vishal’s
blog post&lt;/a&gt;. I have&amp;nbsp; created a sample (&lt;em&gt;links below&lt;/em&gt;) which demonstrates
how to accomplish what the task. Below are the project artifacts that I’ve created
to setup the parameters.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;web.config&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key="email" value="default@example.com"/&amp;gt;
    &amp;lt;add key="url" value="example.com"/&amp;gt;
  &amp;lt;/appSettings&amp;gt;
&amp;lt;/configuration&amp;gt;

&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Parameters.xml&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;parameters &amp;gt;

  &amp;lt;parameter name="email" description="description"&amp;gt;
    &amp;lt;parameterEntry kind="XmlFile" 
                    scope="\\web.config$" 
                    match="/configuration/appSettings/add[@key='email']/@value" /&amp;gt;
  &amp;lt;/parameter&amp;gt;

  &amp;lt;parameter name="url" description="description"&amp;gt;
    &amp;lt;parameterEntry kind="XmlFile" 
                    scope="\\web.config$" 
                    match="/configuration/appSettings/add[@key='url']/@value" /&amp;gt;
  &amp;lt;/parameter&amp;gt;

&amp;lt;/parameters&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
In the parameters.xml file I have defined two new MSDeploy parameters., email and
url. This file should be placed in the root of the project directory and it will automatically
be picked up by the web publish process. If you are familiar with this you may have
noticed that I have left off the DefaultValue attribute here. More to come on that
later. Now that we have our parameters defined let’s see what customizations need
to be made to the publish profiles (.pubxml files).
&lt;/p&gt;
&lt;p&gt;
You can override the values by populating the &lt;em&gt;MsDeployDeclareParameters&lt;/em&gt; item
list. Let’s see how to do that. When you create a publish profile in Visual Studio
a .pubxml file is written to the folder Properties\PublishProfiles. These are MSBuild
files and they are consumed during the build+publish operation. You can customize
these files in order to fine tune the publish process. In my sample project I have
two publish profiles created; &lt;strong&gt;siteone&lt;/strong&gt; and &lt;strong&gt;sitetwo&lt;/strong&gt;.
Both of these are web profiles pointing to &lt;a href="http://www.windowsazure.com/en-us/home/scenarios/web-sites/"&gt;Azure
Web Sites&lt;/a&gt;. In the publish profiles with the samples you will find two sets of
elements; properties for publishing and&amp;nbsp; my parameter customizations. You can
see the content of these profiles below, I’ve left off the MSDeploy settings for brevity.
Those profiles are shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;siteone.pubxml&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;
    &amp;lt;!-- Web deploy settings here --&amp;gt;  

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;MsDeployDeclareParameters Include="email"&amp;gt;
      &amp;lt;DefaultValue&amp;gt;one@email.com&amp;lt;/DefaultValue&amp;gt;
    &amp;lt;/MsDeployDeclareParameters&amp;gt;
    &amp;lt;MsDeployDeclareParameters Include="url"&amp;gt;
      &amp;lt;DefaultValue&amp;gt;http://one.example.com/&amp;lt;/DefaultValue&amp;gt;
    &amp;lt;/MsDeployDeclareParameters&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;sitetwo.pubxml&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;
  &amp;lt;!-- Web Deploy settings here --&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;MsDeployDeclareParameters Include="email"&amp;gt;
      &amp;lt;DefaultValue&amp;gt;two@email.com&amp;lt;/DefaultValue&amp;gt;
    &amp;lt;/MsDeployDeclareParameters&amp;gt;
    &amp;lt;MsDeployDeclareParameters Include="url"&amp;gt;
      &amp;lt;DefaultValue&amp;gt;http://two.example.com/&amp;lt;/DefaultValue&amp;gt;
    &amp;lt;/MsDeployDeclareParameters&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
&amp;lt;/Project&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
In these profiles you can see that I’ve&amp;nbsp; added a usage of MSDeployDeclareParameters
for both parameters in parameters.xml. In each case the value for the Include attribute
is the name of the parameter (&lt;em&gt;matches the name attribute in parameters.xml&lt;/em&gt;).
Along with that I’ve declared a value for the DefaultValue metadata. This will contain
the value of the parameter when it is published using that profile.
&lt;/p&gt;
&lt;p&gt;
After publishing &lt;strong&gt;siteone&lt;/strong&gt; the values for the app settings are below.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
email = &lt;strong&gt;one@email.com &lt;/strong&gt; 
&lt;li&gt;
url = &lt;strong&gt;http://one.example.com/ &lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
When publishing with &lt;strong&gt;sitetwo &lt;/strong&gt;the values
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
email = &lt;strong&gt;two@email.com &lt;/strong&gt; 
&lt;li&gt;
url = &lt;strong&gt;http://two.example.com/ &lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
That’s it. Now let’s move on to the comment I made previously regarding the DefaultValue
attribute that I left off of the parameters.xml file.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;DefaultValue&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
When you create parameters and set their values there are a few different places that
these can come from including; parameters.xml, auto generated from con strings and
custom declared parameters in MSBuild. Because of this the Web Publishing Pipeline
has a mechanism to prioritize parameters when there are duplicates. This is facilitated
by a Priority metadata value on the MSDeployDeclareParameters item list. If you want
to Declare a DefaultValue inside of the parameters.xml file you can do that, but you
have to be aware of the impact of that. When you add a DefaultValue parameter in parameters.xml
by default those values will take precedence over the items in MSDeployDeclareParameters.
Because of that you’ll have to add a Priority value. The way the Priority works is
that the item with the lowest priority value for a given parameter will win. The default
priority value for params from parameters.xml is –50 (&lt;em&gt;defined in Microsoft.Web.Publishing.targets&lt;/em&gt;).
Because of that we have to add priority less than –50. For example.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemGroup&amp;gt;
  &amp;lt;MsDeployDeclareParameters Include="email"&amp;gt;
    &amp;lt;DefaultValue&amp;gt;two@email.com&amp;lt;/DefaultValue&amp;gt;
    &amp;lt;Priority&amp;gt;-100&amp;lt;/Priority&amp;gt;
  &amp;lt;/MsDeployDeclareParameters&amp;gt;
  &amp;lt;MsDeployDeclareParameters Include="url"&amp;gt;
    &amp;lt;DefaultValue&amp;gt;http://two.example.com/&amp;lt;/DefaultValue&amp;gt;
    &amp;lt;Priority&amp;gt;-100&amp;lt;/Priority&amp;gt;
  &amp;lt;/MsDeployDeclareParameters&amp;gt;
&amp;lt;/ItemGroup&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
In this case when I publish these values will override the default value from the
parameters.xml.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You can see the latest version of this at &lt;a title="https://github.com/sayedihashimi/publish-samples/tree/master/AppSettingsPerProfile" href="https://github.com/sayedihashimi/publish-samples/tree/master/AppSettingsPerProfile"&gt;https://github.com/sayedihashimi/publish-samples/tree/master/AppSettingsPerProfile&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt; | &lt;a href="http://msbuldbook.com"&gt;http://msbuldbook.com&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,25ddd39e-59de-4e35-becc-de19dcc5e4ea.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=ee9785b0-4495-4d52-bf07-5b3172ad4010</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,ee9785b0-4495-4d52-bf07-5b3172ad4010.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,ee9785b0-4495-4d52-bf07-5b3172ad4010.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ee9785b0-4495-4d52-bf07-5b3172ad4010</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier today Scott Guthrie blogged about the release of <a href="http://weblogs.asp.net/scottgu/archive/2013/02/18/announcing-release-of-asp-net-and-web-tools-2012-2-update.aspx">ASP.NET
2012.2 and Web Tools 2012.2</a>. Between this release and the previous publish update
in October we have added some really cool publishing features. Today I created some
videos of my favorite features. Take a look below.
</p>
        <p>
 
</p>
        <h3>Quick Publishing
</h3>
        <p>
In this video I will show some productivity enhancements that we’ve made to publish
that you are going to absolutely love!
</p>
        <iframe height="360" src="http://www.youtube.com/embed/7epl4GI80aU" frameborder="0" width="480" allowfullscreen="allowfullscreen">
        </iframe>
        <h3>New publish support for web site project
</h3>
        <p>
Do you use web site projects in Visual Studio? The video below shows how we have unified
the publish support for both web application project and web site project.
</p>
        <iframe height="360" src="http://www.youtube.com/embed/Fn5FIv5bT08" frameborder="0" width="480" allowfullscreen="allowfullscreen">
        </iframe>
        <h3>Updates regarding web.config transforms
</h3>
        <p>
We have added some really cool features related to web.config transforms. To be more
specific; profile specific transforms and transform previewing. See the video below
for more details.
</p>
        <iframe height="360" src="http://www.youtube.com/embed/HdPK8mxpKEI" frameborder="0" width="480" allowfullscreen="allowfullscreen">
        </iframe>
        <p>
I hope you guys like these features as much as I do. Please let me know what you think.
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://twitter.com/sayedihashimi">@SayedIHashimi</a> | <a href="http://msbuildbook.com/">http://msbuildbook.com/</a></p>
      </body>
      <title>Videos on Web Publish updates in ASP.NET 2012.2</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,ee9785b0-4495-4d52-bf07-5b3172ad4010.aspx</guid>
      <link>http://sedodream.com/2013/02/19/VideosOnWebPublishUpdatesInASPNET20122.aspx</link>
      <pubDate>Tue, 19 Feb 2013 09:19:47 GMT</pubDate>
      <description>&lt;p&gt;
Earlier today Scott Guthrie blogged about the release of &lt;a href="http://weblogs.asp.net/scottgu/archive/2013/02/18/announcing-release-of-asp-net-and-web-tools-2012-2-update.aspx"&gt;ASP.NET
2012.2 and Web Tools 2012.2&lt;/a&gt;. Between this release and the previous publish update
in October we have added some really cool publishing features. Today I created some
videos of my favorite features. Take a look below.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Quick Publishing
&lt;/h3&gt;
&lt;p&gt;
In this video I will show some productivity enhancements that we’ve made to publish
that you are going to absolutely love!
&lt;/p&gt;
&lt;iframe height="360" src="http://www.youtube.com/embed/7epl4GI80aU" frameborder="0" width="480" allowfullscreen&gt;
&lt;/iframe&gt;
&lt;h3&gt;New publish support for web site project
&lt;/h3&gt;
&lt;p&gt;
Do you use web site projects in Visual Studio? The video below shows how we have unified
the publish support for both web application project and web site project.
&lt;/p&gt;
&lt;iframe height="360" src="http://www.youtube.com/embed/Fn5FIv5bT08" frameborder="0" width="480" allowfullscreen&gt;
&lt;/iframe&gt;
&lt;h3&gt;Updates regarding web.config transforms
&lt;/h3&gt;
&lt;p&gt;
We have added some really cool features related to web.config transforms. To be more
specific; profile specific transforms and transform previewing. See the video below
for more details.
&lt;/p&gt;
&lt;iframe height="360" src="http://www.youtube.com/embed/HdPK8mxpKEI" frameborder="0" width="480" allowfullscreen&gt;
&lt;/iframe&gt;
&lt;p&gt;
I hope you guys like these features as much as I do. Please let me know what you think.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt; | &lt;a href="http://msbuildbook.com/"&gt;http://msbuildbook.com/&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,ee9785b0-4495-4d52-bf07-5b3172ad4010.aspx</comments>
    </item>
  </channel>
</rss>