NAnt Task to Enforce VB.NET Project Settings
July 7th, 2005

Here is a NAnt task I am using to enforce VB.NET project settings during a build. This is useful if you can’t use <vbc> to compile your projects.

Usage example:

<vboptions compare="Binary" strict="true" explicit="true"
    path="${projectfile}"
    if="${path::get-extension(projectfile) == '.vbproj'}" />

The code:


    /// <summary>
    /// Enforces specific VB settings on a particular project.
    /// </summary>
    [TaskName("vboptions")]
    public class VbOptionsTask : Task
    {
        private string _path;
        private bool _strict;
        private bool _explicit;
        private string _compare;
    
        [TaskAttribute("path", Required=true)]
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
    
        [TaskAttribute("explicit", Required=false)]
        public bool Explicit
        {
            get { return _explicit; }
            set { _explicit = value; }
        }
    
        [TaskAttribute("compare", Required=false)]
        public string Compare
        {
            get { return _compare; }
            set { _compare = value; }
        }
    
        [TaskAttribute("strict", Required=false)]
        public bool Strict
        {
            get { return _strict; }
            set { _strict = value; }
        }
    
        private bool CheckOption(string opt, bool val)
        {
            bool on = (string.Compare(opt, "On", true) == 0);
            return (on == val);
        }
    
        private void ValidateOption(XmlNode node, string attr, bool val)
        {
            XmlAttribute a = node.Attributes[attr];
            if(a == null || !CheckOption(a.Value, val))
            {
                throw new BuildException(
                     string.Format("The build option '{0}' in project {1} is not set to '{2}.'",
                         attr, this.Path, (val ? "On" : "Off")
                         )
                     );
            }
        }
    
        protected override void ExecuteTask()
        {
            XmlDocument proj = ProjectFactory.LoadProjectXml(this.Path);
            if(proj == null)
            {
                throw new BuildException("Could not load project xml for: " + this.Path + ".");
            }
            XmlNode settings = proj.SelectSingleNode("//VisualBasic/Build/Settings");
            if(proj == null)
            {
                throw new BuildException(this.Path + " is not an Everett .vbproj file.");
            }
            XmlAttribute c = settings.Attributes["OptionCompare"];
            if(c == null || string.Compare(c.Value, this.Compare, true) != 0)
            {
                throw new BuildException(string.Format("The project {0} does not have Option Compare set to {1}.", this.Path, this.Compare));
            }
            ValidateOption(settings, "OptionStrict", this.Strict);
            ValidateOption(settings, "OptionExplicit", this.Explicit);
        }
    
        public VbOptionsTask()
        {
            _compare = "Binary";
            _explicit = true;
            _strict = true;
        }
    }