List<ProjectPropertyInstance> properties;
Dictionary<string, ProjectTargetInstance> targets;
string tools_version;
+
+ List<string> GetDefaultTargets (ProjectRootElement xml)
+ {
+ var ret = xml.DefaultTargets.Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries).Select (s => s.Trim ()).ToList ();
+ if (ret.Count == 0 && xml.Targets.Any ())
+ ret.Add (xml.Targets.First ().Name);
+ return ret;
+ }
void InitializeProperties (ProjectRootElement xml, ProjectInstance parent)
{
#endif
full_path = xml.FullPath;
directory = string.IsNullOrWhiteSpace (xml.DirectoryPath) ? System.IO.Directory.GetCurrentDirectory () : xml.DirectoryPath;
- DefaultTargets = xml.DefaultTargets.Split (';').Select (s => s.Trim ()).ToList ();
- InitialTargets = xml.InitialTargets.Split (';').Select (s => s.Trim ()).ToList ();
+ DefaultTargets = GetDefaultTargets (xml);
+ InitialTargets = xml.InitialTargets.Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries).Select (s => s.Trim ()).ToList ();
raw_imports = new List<ResolvedImport> ();
item_definitions = new Dictionary<string, ProjectItemDefinitionInstance> ();
ProcessXml (parent, xml);
}
- static readonly char [] item_sep = {';'};
+ static readonly char [] item_target_sep = {';'};
void ProcessXml (ProjectInstance parent, ProjectRootElement xml)
{
foreach (var p in ige.Items) {
if (!EvaluateCondition (ige.Condition) || !EvaluateCondition (p.Condition))
continue;
- var includes = ExpandString (p.Include).Split (item_sep, StringSplitOptions.RemoveEmptyEntries);
- var excludes = ExpandString (p.Exclude).Split (item_sep, StringSplitOptions.RemoveEmptyEntries);
+ var includes = ExpandString (p.Include).Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries);
+ var excludes = ExpandString (p.Exclude).Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries);
if (includes.Length == 0)
continue;
try {
using (var reader = XmlReader.Create (path)) {
var root = ProjectRootElement.Create (reader, projects);
+ if (DefaultTargets.Count == 0)
+ DefaultTargets.AddRange (GetDefaultTargets (root));
raw_imports.Add (new ResolvedImport (import, root, true));
return this.EvaluatePropertiesAndImports (root.Children).ToArray ();
}
public bool Build (IEnumerable<ILogger> loggers, IEnumerable<ForwardingLoggerRecord> remoteLoggers)
{
- return Build ((string []) null, loggers, remoteLoggers);
+ return Build (DefaultTargets.ToArray (), loggers, remoteLoggers);
}
public bool Build (string target, IEnumerable<ILogger> loggers)
public class ProjectTargetInstanceTest
{
[Test]
- public void SimpleCall ()
+ public void DefaultTargetsEmpty ()
{
+ string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+</Project>";
+ var xml = XmlReader.Create (new StringReader (project_xml));
+ var root = ProjectRootElement.Create (xml);
+ var proj = new ProjectInstance (root);
+ Assert.AreEqual (new string [0], proj.DefaultTargets, "#1");
+ }
+
+ [Test]
+ public void DefaultTargetsFromAttribute ()
+ {
+ string project_xml = @"<Project DefaultTargets='Foo Bar Baz;Foo' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+</Project>";
+ var xml = XmlReader.Create (new StringReader (project_xml));
+ var root = ProjectRootElement.Create (xml);
+ var proj = new ProjectInstance (root);
+ string [] expected = {"Foo Bar Baz", "Foo"};
+ Assert.AreEqual (expected, proj.DefaultTargets, "#1");
+ }
+
+ [Test]
+ public void DefaultTargetsFromElements ()
+ {
+ string [] defaultTargetAtts = {string.Empty, "DefaultTargets=''"};
+
+ for (int i = 0; i < defaultTargetAtts.Length; i++) {
+ string project_xml = string.Format (@"<Project {0} xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+ <Target Name='Foo' />
+ <Target Name='Bar' />
+</Project>", defaultTargetAtts [i]);
+ var xml = XmlReader.Create (new StringReader (project_xml));
+ var root = ProjectRootElement.Create (xml);
+ var proj = new ProjectInstance (root);
+ string [] expected = {"Foo"}; // Bar is not included
+ Assert.AreEqual (expected, proj.DefaultTargets, "#1-" + i);
+ }
+ }
+
+ [Test]
+ public void MicrosoftCommonTargets ()
+ {
+ string [] defaultTargetAtts = { string.Empty, "DefaultTargets=''" };
+
+ for (int i = 0; i < defaultTargetAtts.Length; i++) {
+ string project_xml = string.Format (@"<Project {0} xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+ <Import Project='$(MSBuildToolsPath)\Microsoft.Common.targets' />
+</Project>", defaultTargetAtts [i]);
+ var xml = XmlReader.Create (new StringReader (project_xml));
+ var root = ProjectRootElement.Create (xml);
+ var proj = new ProjectInstance (root);
+ Assert.AreEqual ("Build", proj.DefaultTargets.FirstOrDefault (), "#1-" + i);
+ }
+ }
+
+ [Test]
+ public void DefaultTargetsOverride ()
+ {
+ string project_xml = @"<Project DefaultTargets='Foo' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+ <Import Project='$(MSBuildToolsPath)\Microsoft.Common.targets' />
+</Project>";
+ var xml = XmlReader.Create (new StringReader (project_xml));
+ var root = ProjectRootElement.Create (xml);
+ var proj = new ProjectInstance (root);
+ Assert.AreEqual ("Foo", proj.DefaultTargets.FirstOrDefault (), "#1");
+ }
+
+ [Test]
+ public void MultipleDefaultTargets ()
+ {
+ bool[] expected = { true, false, true };
+ string [] defaultTargets = {"Foo", "Foo;Bar", "Foo;Bar"};
+ string [] targets = { string.Empty, string.Empty, "<Target Name='Bar' />" };
+ for (int i = 0; i < expected.Length; i++) {
+ string project_xml = string.Format (@"<Project DefaultTargets='{0}' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+ <Import Project='$(MSBuildToolsPath)\Microsoft.Common.targets' />
+ <Target Name='Foo' />
+ {1}
+</Project>", defaultTargets [i], targets [i]);
+ var xml = XmlReader.Create (new StringReader (project_xml));
+ var root = ProjectRootElement.Create (xml);
+ var proj = new ProjectInstance (root);
+ Assert.AreEqual ("Foo", proj.DefaultTargets.FirstOrDefault (), "#1-" + i);
+ Assert.AreEqual (expected [i], proj.Build (), "#2-" + i);
+ }
}
}
}