Using mdoc - Jonathan Pryor's web log
« TekPub's Mastering LINQ Challenge | Main | Writing Documentation for mdoc »
Using mdoc
As mentioned last time, mdoc is an assembly-based documentation management system. Thus, before you can use mdoc you need an assembly to document. Let's write some C# source:
using System; namespace Cadenza { public static class ObjectCoda { public static TResult With<TSource, TResult>( this TSource self, Func<TSource, TResult> selector) { if (selector == null) throw new ArgumentNullException ("selector"); return selector (self); } } }
Compile it into an assembly (use csc if running on Windows):
$ gmcs /t:library /out:Demo.dll demo.cs
Now that we have an assembly, we can create the mdoc repository for the Demo.dll assembly, which will contain documentation stubs for all publically visible types and members in the assembly:
$ mdoc update -o Documentation/en Demo.dll --exceptions=added New Type: Cadenza.ObjectCoda Member Added: public static TResult With<TSource,TResult> (this TSource self, Func<TSource,TResult> selector); Namespace Directory Created: Cadenza New Namespace File: Cadenza Members Added: 1, Members Deleted: 0
mdoc update is the command for for synchronizing the documentation repository with the assembly; it can be run multiple times. The -o option specifies where to write the documentation repository. Demo.dll is the assembly to process; any number of assemblies can be specified. The --exceptions argument analyzes the IL to statically determine which exception types can be generated from a member. (It is not without some limitations; see the "--exceptions" documentation section.) The added argument to --exceptions tells mdoc to add <exception/> elements only for types and members that have been added to the repository, not to all types and members in the assembly. This is useful for when you've removed <exception/> documentation and don't want mdoc to re-add them.
We choose Documentation/en as the documentation repository location so that we can easily support localizing the documentation into multiple languages: each directory underneath Documentation would be named after an ISO 639-1 code, e.g. en is for English. This is only a convention, and is not required; any directory name can be used.
Notice that, since mdoc is processing assemblies, it will be able to work with any language that can generate assemblies, such as Visual Basic.NET and F#. It does not require specialized support for each language.
Now we have a documentation repository containing XML files; a particularly relevant file is ObjectCoda.xml, which contains the documentation stubs for our added type. I won't show the output here, but if you view it there are three important things to note:
- The XML is full of type information, e.g. the /Type/Members/Member/Parameters/Parameter/@Type attribute value.
- The XML contains additional non-documentation information, such as the //AssemblyVersion elements. This will be discussed in a future blog posting.
- The //Docs elements are a container for the usual C# XML documentation elements.
Of course, a documentation repository isn't very useful on it's own. We want to view it! mdoc provides three ways to view documentation:
- mdoc export-html: This command generates a set of static HTML files for all types and members found within the documentation repository.
- mdoc assemble: This command "assembles" the documentation repository into a .zip and .tree file for use with the monodoc Documentation browser and the ASP.NET front-end (which powers http://www.go-mono.com/docs).
- mdoc export-msxdoc: This generates the "traditional" XML file which contains only member documentation. This is for use with IDEs like Visual Studio, so that the IDE can show summary documentation while editing.
We will cover mdoc assemble and mdoc export-msxdoc in future installments. For now, to generate static HTML:
$ mdoc export-html -o html Documentation/en Cadenza.ObjectCoda
The current Demo.dll documentation.
Next time we will cover how to write actual documentation instead of just documentation stubs.
blog comments powered by Disqus