<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Daniel Cazzulino's Blog</title>
	
	<link>http://blogs.clariusconsulting.net/kzu</link>
	<description>XML? What XML?</description>
	<lastBuildDate>Mon, 17 Jun 2013 18:04:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/DanielCazzulino" /><feedburner:info uri="danielcazzulino" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><feedburner:emailServiceId>DanielCazzulino</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>How to tweet automatically when you push a new package to nuget.org</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/aRIzyW-rU4o/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/how-to-tweet-automatically-when-you-push-a-new-package-to-nuget-org/#comments</comments>
		<pubDate>Mon, 17 Jun 2013 17:59:17 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/how-to-tweet-automatically-when-you-push-a-new-package-to-nuget-org/</guid>
		<description>Wouldn’t it be nice if your followers could be notified whenever you publish a new version of a NuGet package? Currently, nuget.org offers no support for this, but with the following tricks, you can get it working without programming. The essential idea is to use the OData feed that nuget.org exposes to build an RSS [...]</description>
			<content:encoded><![CDATA[<p>Wouldn’t it be nice if your followers could be notified whenever you publish a new version of a NuGet package? Currently, nuget.org offers no support for this, but with the following tricks, you can get it working without programming.</p>
<p>The essential idea is to use the OData feed that nuget.org exposes to build an RSS feed with new items as you publish them, and have <a href="http://ifttt.com" target="_blank">IFTTT</a> do the tweeting from it.</p>
<p>The tools we’ll use to get this working are:</p>
<ol>
<li><a href="http://linqpad.net/" target="_blank">LinqPad</a>: to examine the nuget.org OData feed at <a title="https://nuget.org/api/v2" href="https://nuget.org/api/v2">https://nuget.org/api/v2</a>&#160;</li>
<li><a href="http://pipes.yahoo.com" target="_blank">Yahoo Pipes</a>: to tweak the OData feed output so that it looks like a “plain” feed</li>
<li><a href="http://ifttt.com" target="_blank">IFTTT</a>: to consume the pipe output and auto-tweet on new items</li>
</ol>
<p>&#160;</p>
<h2>Exploring NuGet OData Feed with LinqPad</h2>
<p>In order to build the query that will become your tweets’ source, we will add a new connection in LinqPad by clicking on the “Add Connection” link:</p>
<p><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://blogs.clariusconsulting.net/kzu/files/2013/06/image6.png" width="731" height="565" /></p>
<p>Make sure you pick WCF Data Services in this dialog and enter the OData Url <a href="https://nuget.org/api/v2" target="_blank">https://nuget.org/api/v2</a> in&#160; the next screen:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image7.png" width="565" height="346" /></p>
<p>After the connection is set up and selected as the active connection in a new query, you can use Linq like the following:</p>
<pre class="brush: csharp;">Packages
    .Where (p =&gt; p.Authors.Contains(&quot;kzu&quot;) || p.Authors.Contains(&quot;Daniel Cazzulino&quot;))
    .OrderByDescending(p =&gt; p.Published)
    .Select(p =&gt; new { p.Id, p.Title, p.GalleryDetailsUrl, p.Published })
    .Take(10)</pre>
<p>Which will run in LinqPad and show the results as follows:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image8.png" width="975" height="502" /></p>
<p>Note how the entire set of available properties for querying is shown under the connection on the left pane. Also, if you have the premium version of LinqPad, you’ll get very nice intellisense for all available types and operators.</p>
<p>The feed exposes all versions available for the same package, which is normal (and unavoidable, since there’s no support for Distinct here AFAIK). The ordering by Published will take care of getting the newest items first. </p>
<p>Once you’re happy with the results, you can click the Request Log tab and get the actual Url for that query:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image9.png" width="716" height="460" /></p>
<p>I first tried to use this Url directly in IFTTT, but it didn’t work. The service complied that it was not a standard feed. And it’s true, since the information for an item in OData looks like the following:</p>
<pre class="brush: csharp;">&lt;entry&gt;
  &lt;id&gt;https://nuget.org/api/v2/Packages(Id='NuDoc',Version='0.4.1306.1409')&lt;/id&gt;
  &lt;title type=&quot;text&quot;&gt;NuDoc&lt;/title&gt;
  &lt;summary type=&quot;text&quot;&gt;&lt;/summary&gt;
  &lt;updated&gt;2013-06-17T10:13:16Z&lt;/updated&gt;
  &lt;author&gt;
    &lt;name&gt;Daniel Cazzulino,  kzu,  Clarius Labs&lt;/name&gt;
  &lt;/author&gt;
  &lt;link rel=&quot;edit-media&quot; title=&quot;V2FeedPackage&quot; href=&quot;Packages(Id='NuDoc',Version='0.4.1306.1409')/$value&quot; /&gt;
  &lt;link rel=&quot;edit&quot; title=&quot;V2FeedPackage&quot; href=&quot;Packages(Id='NuDoc',Version='0.4.1306.1409')&quot; /&gt;
  &lt;category term=&quot;NuGetGallery.V2FeedPackage&quot; scheme=&quot;http://schemas.microsoft.com/ado/2007/08/dataservices/scheme&quot; /&gt;
  &lt;content type=&quot;application/zip&quot; src=&quot;https://nuget.org/api/v2/package/NuDoc/0.4.1306.1409&quot; /&gt;
  &lt;m:properties xmlns:m=&quot;http://schemas.microsoft.com/ado/2007/08/dataservices/metadata&quot; xmlns:d=&quot;http://schemas.microsoft.com/ado/2007/08/dataservices&quot;&gt;
    &lt;d:GalleryDetailsUrl&gt;https://nuget.org/packages/NuDoc/0.4.1306.1409&lt;/d:GalleryDetailsUrl&gt;
    &lt;d:Published m:type=&quot;Edm.DateTime&quot;&gt;2013-06-14T06:58:00.087&lt;/d:Published&gt;
    &lt;d:Title&gt;NuDoc: A .NET XML API Documentation Reader&lt;/d:Title&gt;
    &lt;d:Summary m:null=&quot;true&quot;&gt;&lt;/d:Summary&gt;
  &lt;/m:properties&gt;
&lt;/entry&gt;</pre>
<p>Clearly from the standard Atom properties we can’t do much: the title is actually the package Id and the links point to OData-formatted URLs whereas we’d typically like to point users to the nuget.org package page instead. The actual Url we’re interested in is inside a custom m:properties element, as d:GalleryDetailsUrl. We need to extract that info and make it part of the Atom/RSS entry itself.</p>
<h2>Tweaking Feeds with Yahoo Pipes</h2>
<p>Yahoo Pipes is a rarely used but insanely useful <a href="http://pipes.yahoo.com/">free service by Yahoo</a> that enables arbitrary web mashups without writing a single line of code. In our case, we’ll use it to fetch the OData feed, and rewrite it as standard RSS, by projecting the properties we want from OData. </p>
<p>Head over to the <a href="http://pipes.yahoo.com/">Yahoo Pipes</a> site, sign in and click the big blue <a href="http://pipes.yahoo.com/pipes/pipe.edit">Create a pipe</a> button.</p>
<p>Drop a Fetch Feed source onto the designer and paste your OData Url in the Url field of the widget:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image10.png" width="680" height="479" /></p>
<p>While widgets are selected in the designer, Yahoo Pipes will run the configured action and show a preview of the output in the Debugger pane. This is very useful to see how your output is progressing through the modules. If we expanded the first node now, we’d see a tree representation of the same Atom entry we saw above:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image11.png" width="711" height="364" /></p>
<p>Next we’ll use the Rename operator to “lift” the link and title from within m:properties. Yahoo Pipes simplifies XML manipulation by letting you forget about namespaces and their added complexity. You can reference a node by name just as it appears on the above tree. So if you want to rename the d:Title, you just reference it as item.m:properties.d:Title from the Rename module. “item” refers to the current item in the feed, and you use dots to navigate down the tree. The node label is all you need to keep navigating or retrieve a value.</p>
<p>In the module configuration we use item.m:properties.d:Title, item.m:properties.d:GalleryDetailsUrl and item.m:properties.d:Published and renames them as title, link and pubDate respectively. You just need to connect the output of the Fetch Feed to the Rename module and you’ll immediately see how it’s turning out:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image12.png" width="743" height="542" /></p>
<p>Now this is very close to what we need. In terms of the entries, we’re done! Note that the entry id properly points to a Url that is indeed unique within nuget.org for the package and version. This is good as it means we can use it as-is for the feed, since this id is used by IFTTT to determine if an entry is a new one or not (we only want to publish once when they are new). The problem, however, is that it’s based on the underlying OData implementation. It seems safer to use the package web address as a unique identifier. Also, we can get rid of all the other stuff we don’t need in IFTTT. This is not strictly necessary, and we could be done with this now, but it’s neater if we go just a bit further. </p>
<p>We’ll use another couple modules for this:&#160; the Loop operator with a nested RSS Item Builder one:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image13.png" width="932" height="694" /></p>
<p>Things to note from this screenshot:</p>
<ul>
<li>We connected the Rename module to the Loop module. This enables the dropdowns in the RSS Item Builder to populate with properties coming from the Rename module</li>
<li>We have to select the “emit all results” radio button, since we want one RSS item for each source item</li>
<li>Finally we connect the loop to the pipe output. </li>
</ul>
<p>Once we’re done and saved the pipe after giving it a name, we can run it to see how it looks:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image14.png" width="717" height="645" /></p>
<p>We will copy the “Get as RSS” link and use in the next step.</p>
<h2>Tweeting from IFTTT</h2>
<p>This is the easiest part, and <a href="http://kzu.to/QFQJYM" target="_blank">Scott has already explained the basis of IFTTT</a> better than I could. You just activate your Twitter channel, and pick if[Feed]then[Twitter]. </p>
<p>I’ve configured my IFTTT Twitter action as: just pushed new version of {{EntryTitle}} #nuget {{EntryUrl}}</p>
<p>You can see it in action in this tweet: <a href="https://twitter.com/kzu/status/345444465114234880">https://twitter.com/kzu/status/345444465114234880</a></p>
<p>&#160;</p>
<p>&#160;</p>
<p>I’ve found that having both IFTTT and Yahoo Pipes in my toolset, you can get the web to work for you, automatically and without programming <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sonrisa" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/wlEmoticon-smile.png" />.</p>
<p>&#160;</p>
<p>Enjoy!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=aRIzyW-rU4o:7T6naItLDrM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=aRIzyW-rU4o:7T6naItLDrM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=aRIzyW-rU4o:7T6naItLDrM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=aRIzyW-rU4o:7T6naItLDrM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/aRIzyW-rU4o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/how-to-tweet-automatically-when-you-push-a-new-package-to-nuget-org/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/how-to-tweet-automatically-when-you-push-a-new-package-to-nuget-org/</feedburner:origLink></item>
		<item>
		<title>NuDoc: A .NET XML API Documentation Reader</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/lDNsJSJ-OZw/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/nudoc-a-net-xml-api-documentation-reader/#comments</comments>
		<pubDate>Tue, 11 Jun 2013 20:11:21 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/nudoc-a-net-xml-api-documentation-reader/</guid>
		<description>A couple days ago I was toying with the idea of generating a static API documentation site in markdown ready for hosting in GitHub. The idea is to make it part of the project wiki, so that anyone can very easily improve the code documentation, and later on somehow allow project authors/contributors to merge back [...]</description>
			<content:encoded><![CDATA[<p>A couple days ago I was toying with the idea of generating a static API documentation site in markdown ready for hosting in GitHub. The idea is to make it part of the project wiki, so that anyone can very easily improve the code documentation, and later on somehow allow project authors/contributors to merge back the edited markdown as XML documentation in the code itself, so that the cycle is closed. </p>
<p>So I set out to spike the idea, and the first thing I encountered was that reading XML documentation was something that you either had to do by just using XML APIs in .NET, or you had to use some big piece of software that not only reads documentation but it also can generate an entire site already, in multiple formats with plugins and formatters and what-not. There was no middle ground. </p>
<p>So, instead of building my XML doc &lt;-&gt; markdown wiki synchronizer, I first had to build a simple XML documentation reading&#160; API <img src='http://blogs.clariusconsulting.net/kzu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Straight from the <a href="http://kzu.to/nudoc" target="_blank">NuDoc site</a>:</p>
<article class="markdown-body entry-content" itemprop="mainContentOfPage">
<h1> <a name="-nudoc-a-net-xml-api-documentation-reader" class="anchor" href="#-nudoc-a-net-xml-api-documentation-reader"><span class="octicon octicon-link"></span></a><a href="https://raw.github.com/clariuslabs/NuDoc/master/doc/Icon-32.png" target="_blank"><img src="https://raw.github.com/clariuslabs/NuDoc/master/doc/Icon-32.png" alt="Icon" style="max-width:100%;"></a> NuDoc: A .NET XML API Documentation Reader</h1>
<p>A standalone API to read .NET XML documentation files and optionally augment it with reflection information.</p>
<p>NuDoc provides a simple and intuitive API that reads .NET XML documentation files into an in-memory model that can be easily used to generate alternative representations or arbitrary processing. If the read operation is performed using a .NET assembly rather than an XML file, NuDoc will automatically add the reflection information to the in-memory model for the documentation elements, making it very easy to post-process them by grouping by type, namespace, etc.</p>
<p>NuDoc leverages two well-known patterns: the <a href="http://en.wikipedia.org/wiki/Visitor_pattern">Visitor</a> pattern and the <a href="http://en.wikipedia.org/wiki/Composite_pattern">Composite</a> pattern. Essentially, every member in the documentation file is represented as a separate &#8220;visitable&#8221; type. By simply writing a NuDoc <strong>Visitor</strong>-derived class, you can process only the elements you&#8217;re interested in.</p>
<p>NuDoc can read documentation files from any CIL assembly, and the source tree has explicit unit tests that do so for all major .NET platforms: .NET, WinRT/Metro, Windows Phone and Silverlight.</p>
<h1> <a name="how-to-install" class="anchor" href="#how-to-install"><span class="octicon octicon-link"></span></a>How to Install</h1>
<p>NuDoc is a single assembly with no external dependencies whatsoever and is distributed as a <a href="https://nuget.org/packages/nudoc">NuGet</a> package. It can be installed issuing the following command in the <a href="http://docs.nuget.org/docs/start-here/using-the-package-manager-console">Package Manager Console</a>:</p>
<pre><code>PM&gt; Install-Package NuDoc
</code></pre>
<h1>
<a name="sample-code" class="anchor" href="#sample-code"><span class="octicon octicon-link"></span></a>Sample code</h1>
<p>This is a sample visitor that generates markdown content from member summaries:</p>
<pre><code>    public class MarkdownVisitor : Visitor
    {
        public override void VisitMember(Member member)
        {
            Console.WriteLine();
            Console.WriteLine(new string('-', 50));
            Console.WriteLine("# " + member.Id);
            base.VisitMember(member);
        }

        public override void VisitSummary(Summary summary)
        {
            Console.WriteLine();
            Console.WriteLine("## Summary");
            base.VisitSummary(summary);
        }

        public override void VisitRemarks(Remarks remarks)
        {
            Console.WriteLine();
            Console.WriteLine("## Remarks");
            base.VisitRemarks(remarks);
        }

        public override void VisitExample(Example example)
        {
            Console.WriteLine();
            Console.WriteLine("### Example");
            base.VisitExample(example);
        }

        public override void VisitC(C code)
        {
            // Wrap inline code in ` according to Markdown syntax.
            Console.Write(" `");
            Console.Write(code.Content);
            Console.Write("` ");

            base.VisitC(code);
        }

        public override void VisitCode(Code code)
        {
            Console.WriteLine();
            Console.WriteLine();

            // Indent code with 4 spaces according to Markdown syntax.
            foreach (var line in code.Content.Split(new[] { Environment.NewLine }, StringSplitOptions.None))
            {
                Console.Write("    ");
                Console.WriteLine(line);
            }

            Console.WriteLine();
            base.VisitCode(code);
        }

        public override void VisitText(Text text)
        {
            Console.Write(text.Content);
            base.VisitText(text);
        }

        public override void VisitPara(Para para)
        {
            Console.WriteLine();
            Console.WriteLine();
            base.VisitPara(para);
            Console.WriteLine();
            Console.WriteLine();
        }

        public override void VisitSee(See see)
        {
            var cref = NormalizeLink(see.Cref);
            Console.Write(" [{0}]({1}) ", cref.Substring(2), cref);
        }

        public override void VisitSeeAlso(SeeAlso seeAlso)
        {
            var cref = NormalizeLink(seeAlso.Cref);
            Console.WriteLine("[{0}]({1})", cref.Substring(2), cref);
        }

        private string NormalizeLink(string cref)
        {
            return cref.Replace(":", "-").Replace("(", "-").Replace(")", "");
        }
    }
</code></pre>
<p>There are two logically separated hierarchies of visitable elements: the members (like the whole set read by the <strong>Reader</strong>, a type, method, property, etc.) and the documentation elements (like summary, remarks, code, etc.).</p>
<p>The following is the members hierarchy:</p>
<p><a href="https://raw.github.com/clariuslabs/NuDoc/master/doc/NuDoc.Members.png" target="_blank"><img src="https://raw.github.com/clariuslabs/NuDoc/master/doc/NuDoc.Members.png" alt="Members hierarchy" style="max-width:100%;"></a></p>
<p>And this is the supported documentation elements hierarchy:</p>
<p><a href="https://raw.github.com/clariuslabs/NuDoc/master/doc/NuDoc.Content.png" target="_blank"><img src="https://raw.github.com/clariuslabs/NuDoc/master/doc/NuDoc.Content.png" alt="Members hierarchy" style="max-width:100%;"></a></p>
<p>Note that at the visitor level, both hierarchies are treated uniformly, since they all ultimately inherit from <strong>Element</strong>. In this fashion, you can have one or multiple visitors processing different parts of the graph, such as one that processes members and generates individual folders for each, and one for documentation elements that generate the content.</p>
<p>Enjoy! Go get it now from <a href="https://nuget.org/packages/nudoc">NuGet</a> <img src='http://blogs.clariusconsulting.net/kzu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
</article>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=lDNsJSJ-OZw:Wv1WTYVy5yI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=lDNsJSJ-OZw:Wv1WTYVy5yI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=lDNsJSJ-OZw:Wv1WTYVy5yI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=lDNsJSJ-OZw:Wv1WTYVy5yI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/lDNsJSJ-OZw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/nudoc-a-net-xml-api-documentation-reader/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/nudoc-a-net-xml-api-documentation-reader/</feedburner:origLink></item>
		<item>
		<title>Automatic component registrations in Autofac</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/uwo6lnoCXH8/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/automatic-component-registrations-in-autofac/#comments</comments>
		<pubDate>Wed, 05 Jun 2013 21:34:18 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/automatic-component-registrations-in-autofac/</guid>
		<description>I just had to adapt my favorite IoC container to do some of the things MEF does out of the box, namely registering all classes that have a certain attribute (in MEF’s case, [Export]). This is very easy with Autofac. I first created the attribute that would mark my “components” for registration (aka “exports”): /// [...]</description>
			<content:encoded><![CDATA[<p>I just had to adapt my favorite IoC container to do some of the things MEF does out of the box, namely registering all classes that have a certain attribute (in MEF’s case, [Export]). </p>
<p>This is very easy with Autofac. I first created the attribute that would mark my “components” for registration (aka “exports”):</p>
<pre class="brush: csharp;">/// &lt;summary&gt;
/// Marks the decorated class as a component that will be available from
/// the service locator / component container.
/// &lt;/summary&gt;
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ComponentAttribute : Attribute
{
    /// &lt;summary&gt;
    /// Initializes a new instance of the &lt;see cref=&quot;ComponentAttribute&quot;/&gt; class,
    /// marking the decorated class as a component that will be available from
    /// the service locator / component container, registered with all
    /// implemented interfaces as well as the concrete type.
    /// &lt;/summary&gt;
    public ComponentAttribute()
    {
    }

    /// &lt;summary&gt;
    /// Initializes a new instance of the &lt;see cref=&quot;ComponentAttribute&quot;/&gt; class,
    /// marking the decorated class as a component that will be available from
    /// the service locator / component container using the specified
    /// &lt;paramref name=&quot;registerAs&quot;/&gt; type.
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;registerAs&quot;&gt;The type to use to register the decorated component.&lt;/param&gt;
    public ComponentAttribute(Type registerAs)
    {
        this.RegisterAs = registerAs;
    }

    /// &lt;summary&gt;
    /// Type to use for the component registration.
    /// &lt;/summary&gt;
    public Type RegisterAs { get; private set; }
}</pre>
<p>The next step is to provide an idiomatic way to register components that have this attribute (let’s call them just that, components) with a container builder. Autofac leverages extension methods extensively, and it already provides a couple that perform this sort of scanning for registration: RegisterAssemblyTypes and RegisterTypes. Both are similar and return a builder fluent interface that can be used to further tweak the registrations:</p>
<pre class="brush: csharp;">builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .OnActivated(...)
    .Named(....)
    ...</pre>
<p>Ideally, we should provide similar functionality for our components. We can simply leverage the built-in methods in Autofac and provide the following extension methods:</p>
<pre class="brush: csharp;">/// &lt;summary&gt;
/// Provides automatic component registration by scanning assemblies and types for
/// those that have the &lt;see cref=&quot;ComponentAttribute&quot;/&gt; annotation.
/// &lt;/summary&gt;
public static class CompositionExtensions
{
    /// &lt;summary&gt;
    /// Registers the components found in the given assemblies.
    /// &lt;/summary&gt;
    public static IRegistrationBuilder&lt;object, ScanningActivatorData, DynamicRegistrationStyle&gt; RegisterAssemblyComponents(this ContainerBuilder builder, params Assembly[] assemblies)
    {
        return RegisterComponents(builder, assemblies.SelectMany(x =&gt; x.GetExportedTypes()));
    }

    /// &lt;summary&gt;
    /// Registers the components found in the given set of types.
    /// &lt;/summary&gt;
    public static IRegistrationBuilder&lt;object, ScanningActivatorData, DynamicRegistrationStyle&gt; RegisterComponents(this ContainerBuilder builder, IEnumerable&lt;Type&gt; types)
    {
        return builder            .RegisterTypes(types.Where(t =&gt; t.GetCustomAttributes(typeof(ComponentAttribute), true).Any()).ToArray())
            .As(t =&gt; t.GetCustomAttributes(typeof(ComponentAttribute), true).OfType&lt;ComponentAttribute&gt;().First().RegisterAs ?? t);
    }

    /// &lt;summary&gt;
    /// Registers the components found in the given set of types.
    /// &lt;/summary&gt;
    public static IRegistrationBuilder&lt;object, ScanningActivatorData, DynamicRegistrationStyle&gt; RegisterComponents(this ContainerBuilder builder, params Type[] types)
    {
        return RegisterComponents(builder, (IEnumerable&lt;Type&gt;)types);
    }
}</pre>
<p>Note that we leverage the built-in RegisterTypes extension method, filtering the incoming types so that the array passed to it contains only the selected candidates, and we use the RegisterAs attribute property to determine how to register the type. With this in place, we can simply build assemblies where components are annotated like:</p>
<pre class="brush: csharp;">[Component(typeof(IAdapter))]
public class MsBuildAdapter : IAdapter
{
}</pre>
<p>And consume that easily from other components:</p>
<pre class="brush: csharp;">[Component(typeof(IAdapterManager))]
public class AdapterManager : IAdapterManager
{
   public AdapterManager(IEnumerable&lt;IAdapter&gt; adapters)
   {
   }
}</pre>
<p>Where the registration code can simply be:</p>
<pre class="brush: csharp;">var builder = new ContainerBuilder()
builder.RegisterAssemblyComponents(Assembly.GetExecutingAssembly());

var container = builder.Build();</pre>
<p>&#160;</p>
<p>You gotta love <a href="http://kzu.to/12t9Cry" target="_blank">Autofac</a> <img src='http://blogs.clariusconsulting.net/kzu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=uwo6lnoCXH8:plgcyhKfck8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=uwo6lnoCXH8:plgcyhKfck8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=uwo6lnoCXH8:plgcyhKfck8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=uwo6lnoCXH8:plgcyhKfck8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/uwo6lnoCXH8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/automatic-component-registrations-in-autofac/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/automatic-component-registrations-in-autofac/</feedburner:origLink></item>
		<item>
		<title>Increase developer productivity with NuGet packages with NuGet References</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/bzfHrfGfPYI/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/increase-developer-productivity-with-nuget-packages-with-nuget-references/#comments</comments>
		<pubDate>Wed, 05 Jun 2013 20:35:14 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/increase-developer-productivity-with-nuget-packages-with-nuget-references/</guid>
		<description>A typical solution usually has many projects, and many more NuGet packages in use: &amp;#160; How do you get a glance of what packages are installed on each project? Typically, you’d just open each of the packages.config XML files, or worse, go to the “Manage NuGet Packages…” dialog: &amp;#160; &amp;#160; Which brings up a pretty [...]</description>
			<content:encoded><![CDATA[<p>A typical solution usually has many projects, and many more NuGet packages in use:</p>
<p><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://blogs.clariusconsulting.net/kzu/files/2013/06/image.png" width="294" height="589" /></p>
<p>&#160;</p>
<p>How do you get a glance of what packages are installed on each project? Typically, you’d just open each of the packages.config XML files, or worse, go to the “Manage NuGet Packages…” dialog:</p>
<p>&#160;</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image1.png" width="346" height="316" /></p>
<p>&#160;</p>
<p>Which brings up a pretty daunting dialog:</p>
<p>&#160;</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image2.png" width="915" height="538" /></p>
<p>&#160;</p>
<p>If you wanted to uninstall a particular package, you could alternatively just type in the package manager console, but many developers aren’t as familiar with the available commands, or simply prefer to work in a more visual way. What if you could just expand the packages.config node, find the package you want to uninstall and click a context menu to do so?</p>
<p>&#160;</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image3.png" width="376" height="313" /></p>
<p>&#160;</p>
<p>That’s precisely what the NuGet References extension provides. All packages.config nodes in the solution explorer can now be expanded and all installed packages inspected. Not only can you directly update or uninstall the extension right from the solution explorer, but you can also search a given package to see which projects use it and may need updates!</p>
<p>&#160;</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image4.png" width="300" height="458" /></p>
<p>&#160;</p>
<p>You can also get information like the version and install path for a particular package by just selecting it and inspecting the properties window:</p>
<p>&#160;</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/06/image5.png" width="504" height="457" /></p>
<p>&#160;</p>
<p>You can save valuable time by just checking for updates on specific packages, or uninstalling just what you want, right from the solution explorer.</p>
<p>In the future, if there’s enough demand, the extension could even show a sub-menu of Update that lists the last few available versions so that you can upgrade/downgrade quickly to try out how things work out before committing to a specific version. </p>
<p>&#160;</p>
<p>You can get a free version of the extension from the <a href="http://visualstudiogallery.msdn.microsoft.com/e8d1fcad-5fa5-4353-ba9c-90f4b6a68154" target="_blank">Visual Studio Gallery</a>. This version randomly disables the Uninstall/Update commands to encourage you to purchase the full version via the <a href="http://blog.devstore.com/2013/05/how-to-purchase-extensions-in-devstore.html" target="_blank">DevStore</a>, which is also embedded in the free version.</p>
<p>Please report issues or suggestions at the <a href="https://github.com/danielkzu/NuGetReferences/issues" target="_blank">Issue Tracker</a>.</p>
<p>&#160;</p>
<p>Enjoy!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=bzfHrfGfPYI:9Ux0Ou2UF3A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=bzfHrfGfPYI:9Ux0Ou2UF3A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=bzfHrfGfPYI:9Ux0Ou2UF3A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=bzfHrfGfPYI:9Ux0Ou2UF3A:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/bzfHrfGfPYI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/increase-developer-productivity-with-nuget-packages-with-nuget-references/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/increase-developer-productivity-with-nuget-packages-with-nuget-references/</feedburner:origLink></item>
		<item>
		<title>NuGet References: publishing my first open source extension to the DevStore</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/-wR0g6Il-Bo/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/nuget-references-publishing-my-first-open-source-extension-to-the-devstore/#comments</comments>
		<pubDate>Sat, 18 May 2013 22:49:56 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/nuget-references-publishing-my-first-open-source-extension-to-the-devstore/</guid>
		<description>Last week I had the pleasure of spending time with a bunch of friends at the OuterConf 2013, including pretty much the entire NuGet team. I also could attend to the hackathon they organized, and I got to hack what I think is a pretty cool Visual Studio 2012 extension: NuGet References. An improved NuGet [...]</description>
			<content:encoded><![CDATA[<p>Last week I had the pleasure of spending time with a bunch of friends at the <a href="kzu.to/outerconf" target="_blank">OuterConf 2013</a>, including pretty much the entire NuGet team. I also could attend to the hackathon they organized, and I got to hack what I think is a pretty cool Visual Studio 2012 extension: NuGet References. </p>
<h2>An improved NuGet experience</h2>
<p>The idea is simple enough: I wanted to leverage some new extensibility hooks in VS2012 to show installed nuget packages right inside a packages.config file, like so:</p>
<p><img title="Nodes" 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="Nodes" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/Nodes.png" width="284" height="299" /></p>
<p>And once you have the nodes in there, wouldn’t it be cool to be able to update and uninstall right from there?</p>
<p><img title="Menus" 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="Menus" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/Menus.png" width="373" height="337" /></p>
<p>And why not allow me to see key information about the package on the properties window?</p>
<p><img title="Properties" 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="Properties" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/Properties.png" width="504" height="457" /></p>
<p>Cool enough <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sonrisa" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/wlEmoticon-smile.png" /></p>
<h2>Monetizing your creations</h2>
<p>Now, after the extension was “done” (there’s a TON more that can be added to it! This is just the start), I realized I had put quite a few hours (more like days by now!) into it. So even if I do want my work to be open source so that eventually it can make it into NuGet’s core tooling, I could certainly use a few bucks to pay for the coffee and beer I put into it <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Guiño" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/wlEmoticon-winkingsmile.png" />.</p>
<p>In the past, attempting to monetize small extensions was either a matter of placing a Donate button somewhere and hope that users would notice, or investing serious time in some sort of payment method (i.e. PayPal) and issuing product keys and implementing some activation mechanism. </p>
<p>I believe the Donate button doesn’t work because you have mainly two choices on how to expose it:</p>
<ul>
<li>At installation time </li>
<li>Sporadic nagging dialogs afterwards </li>
</ul>
<p>At installation time, I usually don’t know yet if what I’m installing is any good and if I will be willing to donate and how much. And everybody hates nagging dialogs. So there you have it: it won’t work. </p>
<p>And the alternative is simply not worth it most of the time (like for this cool extension I just built). I’m done with the fun part of building it, I just want to move on to the next fun thing. I’m hardly looking forward to building the payment and product activation stuff, much less maintain that up and running and the like. It’s just too much work.</p>
<p>This is the reason we (Clarius Consulting) built the <a href="http://devstore.com" target="_blank">DevStore</a>: it allows me to quickly and effortlessly publish my extension for sale and be done in minutes. So let’s do that right now!</p>
<h2>Publishing to the DevStore</h2>
<p>So let’s go to <a href="http://devstore.com">http://devstore.com</a> and click on the prominent Upload button:</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image.png" width="923" height="399" /></p>
<p>I get to sign in with either a Google or Windows Live account, and after that quick permissions acceptance dialog, I get to fill in basic information about myself and accept the DevStore terms of service.</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image1.png" width="928" height="545" /></p>
<p>That will send an email to our inbox for verification purposes, after which we can log in with our credentials by clicking the Login button at the top. Of course this is only required the first time <img src='http://blogs.clariusconsulting.net/kzu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>After we’re logged in, if we now click again the Upload button, we get to accept the Seller terms of service (which is different than for users, just like every other app store), and with that out of the way, we can just go ahead and upload our VSIX!</p>
<p><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://blogs.clariusconsulting.net/kzu/files/2013/05/image10.png" width="923" height="300" /></p>
<p>Here I have already chosen my extension file. Note that the file I’m uploading is the output of a regular VSIX project in Visual Studio. I haven’t modified the manifest in any way for now. Upon submitting the file, we get some data extracted from the manifest, which we can now tweak as needed:</p>
<p><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image11.png" width="890" height="452" /></p>
<p>For one thing, I know I want to change the Full Price value! So let’s click Edit. You can edit quite a bit of information about how you want to sell your extension, including full price (for first-time purchases), upgrade price (for v1 users when I come out with v2), what countries I want to sell it on, screenshots, and so on. I just happen to love Stella Artois beer which is <a href="http://fresh.amazon.com/product?asin=B0016XMXZK&amp;qid=156589851&amp;rank=1&amp;sr=1-1&amp;tag=title" target="_blank">about $2 on Amazon Fresh</a>, so I’ll just round it up to $2.99 and you can buy me a beer for this extension <img src='http://blogs.clariusconsulting.net/kzu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>After I’ve saved the information, I can click Submit/Publish, at which point it’s live on the site on the Recently Added section:</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image4.png" width="948" height="414" /></p>
<h2>Buying from the DevStore</h2>
<p>Now you can all go buy me a beer for this extension by either going to the website and downloading the VSIX from there, or, much more conveniently, do it from within Visual Studio!</p>
<p>All you need to do is first get the DevStore extension via the Extension Manager (remember, my extension only works on VS2012):</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image5.png" width="915" height="247" /></p>
<p>After a quick VS restart, you will get a new node in the extension manager window, the DevStore:</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image6.png" width="959" height="291" /></p>
<p>You cannot buy your own extensions, so here I’m buying it from another account I have, just to show you how it looks. The user will first have to register/sign in (right after clicking the Buy button), at which point they will get the Checkout dialog:</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image7.png" width="959" height="462" /></p>
<p>The next step takes you to your default browser, to the PayPal website. We had this step baked into Visual Studio at some point, but the overwhelming feedback from early beta testers was that they felt more confident and secure if we just took them to the regular browser window. In there, you get to log in and pay as usual:</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image8.png" width="939" height="396" /></p>
<p>Right after confirming the payment, I can go back to Visual Studio, and notice that the button changed from Buy to Download (as well as a new little world icon that tells me I own this extension in the cloud). And sure enough , after a quick download, I get the regular VSIX install dialog plus optional EULA if any, and I get to finish the install:</p>
<p><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; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2013/05/image9.png" width="959" height="550" /></p>
<p>&#160;</p>
<h2>What about Open Source, Freedom and Love?</h2>
<p>Well, I’m a complete fan of open source. I always ask myself “why NOT make this open source?”, rather than the opposite (and more common) question. I believe a very low-friction way to contribute with a few bucks with an open source project or developer is a great way to encourage more open source, independent developers and innovation. </p>
<p>The DevStore provides a great way to encourage developers to automate more of their daily programming activities, boosting productivity. I believe bite sized extensions in the range of $2-10 are a much better option that monster-sized tools that completely take over most of your IDE or pollute it unnecessarily with myriad (and totally unrelated) commands all over the place.</p>
<p>In order to prove the point that both open source and paid convenience delivery of binaries can actually be a commercially viable option, I’m also publishing the entire source for this extension in <a href="http://kzu.to/10x7FXt" target="_blank">GitHub</a>.</p>
<p>&#160;</p>
<p>&#160;</p>
<p>And that’s it! I just bought myself a beer with that demo above, so it’s time for me to go enjoy it. I hope you like the extension and gift me a beer too <img src='http://blogs.clariusconsulting.net/kzu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=-wR0g6Il-Bo:FYSn4bxPLIg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=-wR0g6Il-Bo:FYSn4bxPLIg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=-wR0g6Il-Bo:FYSn4bxPLIg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=-wR0g6Il-Bo:FYSn4bxPLIg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/-wR0g6Il-Bo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/nuget-references-publishing-my-first-open-source-extension-to-the-devstore/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/nuget-references-publishing-my-first-open-source-extension-to-the-devstore/</feedburner:origLink></item>
		<item>
		<title>How to perform regular expression based replacements on files with MSBuild</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/AbSYSDpbDMM/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/how-to-perform-regular-expression-based-replacements-on-files-with-msbuild/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 02:34:42 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[msbuild]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/how-to-perform-regular-expression-based-replacements-on-files-with-msbuild/</guid>
		<description>And without a custom DLL with a task, too . The example at the bottom of the MSDN page on MSBuild Inline Tasks already provides pretty much all you need for that with a TokenReplace task that receives a file path, a token and a replacement and uses string.Replace with that. Similar in spirit but [...]</description>
			<content:encoded><![CDATA[<p>And <a href="http://kzu.to/RAjUjY" target="_blank">without a custom DLL with a task</a>, too <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.clariusconsulting.net/kzu/files/2012/12/wlEmoticon-smile.png" />. </p>
<p>The example at the bottom of the MSDN page on <a href="http://msdn.microsoft.com/en-us/library/dd722601.aspx" target="_blank">MSBuild Inline Tasks</a> already provides pretty much all you need for that with a TokenReplace task that receives a file path, a token and a replacement and uses string.Replace with that. Similar in spirit but way more useful in its implementation is the <a href="http://kzu.to/WI1hHv" target="_blank">RegexTransform in NuGet’s Build.tasks</a>. It’s much better not only because it supports full regular expressions, but also because it receives items, which makes it very amenable to batching (applying the transforms to multiple items). You can read about how to use it for <a href="http://kzu.to/RAk62L" target="_blank">updating assemblies with a version number</a>, for example.</p>
<p>I recently had a need to also supply <a href="http://kzu.to/RAkhuT" target="_blank">RegexOptions</a> to the task so I extended the metadata and a little bit of the inline task so that it can parse the optional flags. So when using the task, I can pass the flags as item metadata as follows:</p>
<pre class="brush: xml;">&lt;Target Name=&quot;ReplaceReleaseNotes&quot;&gt;
    &lt;ItemGroup&gt;
        &lt;RegexTransform Include=&quot;$(BuildRoot)**\*.nuspec&quot;
                        Condition=&quot;'$(ReleaseNotes)' != ''&quot;&gt;
            &lt;Find&gt;&lt;![CDATA[&lt;releaseNotes /&gt;|&lt;releaseNotes/&gt;|&lt;releaseNotes&gt;.*&lt;/releaseNotes&gt;]]&gt;&lt;/Find&gt;
            &lt;ReplaceWith&gt;&lt;![CDATA[&lt;releaseNotes&gt;$(ReleaseNotes)&lt;/releaseNotes&gt;]]&gt;&lt;/ReplaceWith&gt;
            &lt;Options&gt;Singleline&lt;/Options&gt;
        &lt;/RegexTransform&gt;
    &lt;/ItemGroup&gt;

    &lt;RegexTransform Items=&quot;@(RegexTransform)&quot; /&gt;
&lt;/Target&gt;</pre>
<p>It also supports specifying multiple options, like “Singleline | IgnorePatternWhitespace”&#160; and the like.</p>
<p>The code changes to the task are minimal:</p>
<pre class="brush: xml;">&lt;!--
============================================================
            RegexTransform

Transforms the input Items parameter by evaluating the
regular expression in their Find metadata and
replacing with their ReplaceWith metadata. Optional, the
options for the regular expression evaluation can be specified.

Example input item:
        &lt;RegexTransform Include=&quot;$(BuildRoot)Src\GlobalAssemblyInfo.cs&quot;&gt;
            &lt;Find&gt;AssemblyFileVersion\(&quot;.*?&quot;\)&lt;/Find&gt;
            &lt;ReplaceWith&gt;AssemblyFileVersion(&quot;$(FileVersion)&quot;)&lt;/ReplaceWith&gt;
            &lt;Options&gt;Multiline | IgnorePatternWhitespace&lt;/Options&gt;
        &lt;/RegexTransform&gt;

Invoking the target:
    &lt;RegexTransform Items=&quot;@(RegexTransform)&quot; /&gt;
============================================================
--&gt;
&lt;UsingTask TaskName=&quot;RegexTransform&quot;
           TaskFactory=&quot;CodeTaskFactory&quot;
           AssemblyFile=&quot;$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll&quot;&gt;
    &lt;ParameterGroup&gt;
        &lt;Items ParameterType=&quot;Microsoft.Build.Framework.ITaskItem[]&quot; /&gt;
    &lt;/ParameterGroup&gt;
    &lt;Task&gt;
        &lt;Using Namespace=&quot;System.IO&quot; /&gt;
        &lt;Using Namespace=&quot;System.Text.RegularExpressions&quot; /&gt;
        &lt;Using Namespace=&quot;Microsoft.Build.Framework&quot; /&gt;
        &lt;Code Type=&quot;Fragment&quot;
              Language=&quot;cs&quot;&gt;
            &lt;![CDATA[
       foreach(var item in Items)
       {
         string fileName = item.GetMetadata(&quot;FullPath&quot;);
         string find = item.GetMetadata(&quot;Find&quot;);
         string replaceWith = item.GetMetadata(&quot;ReplaceWith&quot;);
         string optionsValue = item.GetMetadata(&quot;Options&quot;) ?? &quot;&quot;;

         var options = string.IsNullOrWhiteSpace(optionsValue) ?
             RegexOptions.None : (RegexOptions)Enum.Parse(typeof(RegexOptions), optionsValue.Replace('|', ','));

         if(!File.Exists(fileName))
         {
           Log.LogError(&quot;Could not find file: {0}&quot;, fileName);
           return false;
         }
         string content = File.ReadAllText(fileName);
         File.WriteAllText(
           fileName,
           Regex.Replace(
             content,
             find,
             replaceWith,
             options
           )
         );
       }
     ]]&gt;
        &lt;/Code&gt;
    &lt;/Task&gt;
&lt;/UsingTask&gt;</pre>
<p>&#160;</p>
<p><strong>Update</strong>: As noted by Emperor, I simplified the code for parsing the enum from using Aggregate to a simple string replace of | with a comma, which is readily supported by Enum.Parse <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.clariusconsulting.net/kzu/files/2012/12/wlEmoticon-smile.png" /></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=AbSYSDpbDMM:GVc3QKn6nZc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=AbSYSDpbDMM:GVc3QKn6nZc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=AbSYSDpbDMM:GVc3QKn6nZc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=AbSYSDpbDMM:GVc3QKn6nZc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/AbSYSDpbDMM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/how-to-perform-regular-expression-based-replacements-on-files-with-msbuild/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/how-to-perform-regular-expression-based-replacements-on-files-with-msbuild/</feedburner:origLink></item>
		<item>
		<title>How to access the raw markdown source for a github wiki page</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/k4Ii_fTl79s/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/how-to-access-the-raw-markdown-source-for-a-github-wiki-page/#comments</comments>
		<pubDate>Fri, 30 Nov 2012 04:44:49 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/how-to-access-the-raw-markdown-source-for-a-github-wiki-page/</guid>
		<description>This is not entirely obvious (at least it wasn’t for me), but since Github wikis are actually backed by a proper Git repo, I figured it should be possible to access the raw markdown for a page by using Github’s https://raw.github.com/ style URLs. After some minor trial/error, it turns out to be very predictable (as [...]</description>
			<content:encoded><![CDATA[<p>This is not entirely obvious (at least it wasn’t for me), but since Github wikis are actually backed by a <a href="https://github.com/blog/699-making-github-more-open-git-backed-wikis" target="_blank">proper Git repo</a>, I figured it should be possible to access the raw markdown for a page by using Github’s <a href="https://raw.github.com/">https://raw.github.com/</a> style URLs.</p>
<p>After some minor trial/error, it turns out to be very predictable (as many things in github):</p>
<p>https://raw.github.com/wiki/[user]/[project]/[page].md</p>
<p>Just replace the square brackets&#8217; stuff with your values and that’s it. I think I’ll be trying this out with a wiki page as a Release Notes landing page, which I just pull in raw format on a build script and replace the Nuget &lt;releaseNotes&gt; node with its content…</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=k4Ii_fTl79s:ISSgXEfmBG0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=k4Ii_fTl79s:ISSgXEfmBG0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=k4Ii_fTl79s:ISSgXEfmBG0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=k4Ii_fTl79s:ISSgXEfmBG0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/k4Ii_fTl79s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/how-to-access-the-raw-markdown-source-for-a-github-wiki-page/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/how-to-access-the-raw-markdown-source-for-a-github-wiki-page/</feedburner:origLink></item>
		<item>
		<title>Documenting user interfaces in a mouse-less touch UI</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/8VI0Wrb_jiE/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/documenting-user-interfaces-in-a-mouse-less-touch-ui/#comments</comments>
		<pubDate>Sun, 25 Nov 2012 22:05:00 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/documenting-user-interfaces-in-a-mouse-less-touch-ui/</guid>
		<description>“Old” apps rely on mouse pointing and tooltips to explain what a given button is for. Maybe there is text associated with the button, but you can only put so much text without wasting useful screen state. More so in a phone or tablet app. I’ve seen a trend in Google apps where they put [...]</description>
			<content:encoded><![CDATA[<p>“Old” apps rely on mouse pointing and tooltips to explain what a given button is for. Maybe there is text associated with the button, but you can only put so much text without wasting useful screen state. More so in a phone or tablet app.</p>
<p>I’ve seen a trend in Google apps where they put an overlay on top of the app the first time it runs, to explain how the various pieces of UI work. I have seen this also on my Nexus phone, but don’t have a screenshot. I don’t recall a way to actually bring that help overlay back again, so that’s maybe some built-in gesture that’s missing. Here’s what it looks like in Gmail, the first time you use the new compose layout:</p>
<p><a href="http://blogs.clariusconsulting.net/kzu/files/2012/11/gmailhelp.png"><img title="gmailhelp" style="display: inline" alt="gmailhelp" src="http://blogs.clariusconsulting.net/kzu/files/2012/11/gmailhelp_thumb.png" width="801" height="480" /></a></p>
<p>&#160;</p>
<p>I like the approach very much, and I think it’s something that should become standard part of mobile OS, and Windows, including a standard way to bring that help up from within any app.</p>
<p>Update 11/22: here&#8217;s another example, now from Netflix Android app:
<p>
<a href="http://blogs.clariusconsulting.net/kzu/files/2012/11/wpid-Screenshot_2012-11-23-21-10-26.png"><img title="NetflixAndroidHelp.png" class="alignnone" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2012/11/wpid-Screenshot_2012-11-23-21-10-26.png" /></a></p>
<p>Update 11/25: looks like a tend to me now. This time from YouTube app</p>
<p><a href="http://blogs.clariusconsulting.net/kzu/files/2012/11/wpid-Screenshot_2012-11-25-15-37-46.png"><img title="Screenshot_2012-11-25-15-37-46.png" class="alignnone" alt="image" src="http://blogs.clariusconsulting.net/kzu/files/2012/11/wpid-Screenshot_2012-11-25-15-37-46.png" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=8VI0Wrb_jiE:l_Q_NPlzagU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=8VI0Wrb_jiE:l_Q_NPlzagU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=8VI0Wrb_jiE:l_Q_NPlzagU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=8VI0Wrb_jiE:l_Q_NPlzagU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/8VI0Wrb_jiE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/documenting-user-interfaces-in-a-mouse-less-touch-ui/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/documenting-user-interfaces-in-a-mouse-less-touch-ui/</feedburner:origLink></item>
		<item>
		<title>How to exclude copy local referenced assemblies from a VSIX</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/zjgZkYM-MPs/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/how-to-exclude-copy-local-referenced-assemblies-from-a-vsix/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 17:49:12 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[extensibility]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/how-to-exclude-copy-local-referenced-assemblies-from-a-vsix/</guid>
		<description>When you add library references to project that are not reference assemblies or installed in the GAC, Visual Studio defaults to setting Copy Local to True: If, however, those dependencies are distributed by some other means (i.e. another extension, or are part of VS private assemblies, or whatever) and you want to avoid including them [...]</description>
			<content:encoded><![CDATA[<p>When you add library references to project that are not reference assemblies or installed in the GAC, Visual Studio defaults to setting Copy Local to True:</p>
<p><a href="http://blogs.clariusconsulting.net/kzu/files/2012/11/image.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://blogs.clariusconsulting.net/kzu/files/2012/11/image_thumb.png" width="281" height="436" /></a></p>
<p>If, however, those dependencies are distributed by some other means (i.e. another extension, or are part of VS private assemblies, or whatever) and you want to avoid including them in your VSIX, you can add the following property to the project file:</p>
<pre class="brush: csharp;">&lt;PropertyGroup&gt;
  ...
  &lt;IncludeCopyLocalReferencesInVSIXContainer&gt;false&lt;/IncludeCopyLocalReferencesInVSIXContainer&gt;</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=zjgZkYM-MPs:bow-3URldY0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=zjgZkYM-MPs:bow-3URldY0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=zjgZkYM-MPs:bow-3URldY0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=zjgZkYM-MPs:bow-3URldY0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/zjgZkYM-MPs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/how-to-exclude-copy-local-referenced-assemblies-from-a-vsix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/how-to-exclude-copy-local-referenced-assemblies-from-a-vsix/</feedburner:origLink></item>
		<item>
		<title>How to change the target VSIX file name</title>
		<link>http://feedproxy.google.com/~r/DanielCazzulino/~3/shlvtMgXrqA/</link>
		<comments>http://blogs.clariusconsulting.net/kzu/how-to-change-the-target-vsix-file-name/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 14:46:35 +0000</pubDate>
		<dc:creator>kzu</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blogs.clariusconsulting.net/kzu/how-to-change-the-target-vsix-file-name/</guid>
		<description>When creating a VSIX or VS Package extension to VS, the default .vsix file name matches the project assembly name. Usually this is too long. So if you want to change it to be a short name, you have to edit the project file and add the following property: &amp;#60;PropertyGroup&amp;#62; ... &amp;#60;TargetVsixContainerName&amp;#62;MyCoolExtension.vsix&amp;#60;/TargetVsixContainerName&amp;#62; Happy extending</description>
			<content:encoded><![CDATA[<p>When creating a VSIX or VS Package extension to VS, the default .vsix file name matches the project assembly name. Usually this is too long. So if you want to change it to be a short name, you have to edit the project file and add the following property:</p>
<pre class="brush: csharp;">&lt;PropertyGroup&gt;
  ...
  &lt;TargetVsixContainerName&gt;MyCoolExtension.vsix&lt;/TargetVsixContainerName&gt;</pre>
<p>Happy extending</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=shlvtMgXrqA:DHiy9Mv9Ri0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=shlvtMgXrqA:DHiy9Mv9Ri0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?i=shlvtMgXrqA:DHiy9Mv9Ri0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/DanielCazzulino?a=shlvtMgXrqA:DHiy9Mv9Ri0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/DanielCazzulino?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/DanielCazzulino/~4/shlvtMgXrqA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogs.clariusconsulting.net/kzu/how-to-change-the-target-vsix-file-name/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogs.clariusconsulting.net/kzu/how-to-change-the-target-vsix-file-name/</feedburner:origLink></item>
	</channel>
</rss>
