Browse Source

Implement EnvDTE.SolutionBuild.BuildProject

Fixes 'No migrations configuration type was found in the assembly' error when enabling migrations.
EntityFramework's Enable-Migrations cmdlet builds the project and then checks the generated
assembly for the configurations class that it added.
Enable-Migrations now works.
pull/28/head
Matt Ward 13 years ago
parent
commit
a11658efa2
  1. 3
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 6
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs
  3. 25
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectBuilder.cs
  4. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs
  5. 20
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionBuild.cs
  6. 1
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs
  7. 18
      src/AddIns/Misc/PackageManagement/Project/Src/IProjectBuilder.cs
  8. 7
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs
  9. 50
      src/AddIns/Misc/PackageManagement/Project/Src/ProjectBuilder.cs
  10. 94
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionBuildTests.cs

3
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -78,6 +78,7 @@ @@ -78,6 +78,7 @@
<Compile Include="Src\ConfigSettingsFileSystem.cs" />
<Compile Include="Src\Design\DesignTimeSelectProjectsViewModel.cs" />
<Compile Include="Src\Design\FakePackageOperation.cs" />
<Compile Include="Src\Design\FakeProjectBuilder.cs" />
<Compile Include="Src\Design\FakeSelectedProject.cs" />
<Compile Include="Src\DocumentLoader.cs" />
<Compile Include="Src\DocumentNamespaceCreator.cs" />
@ -147,6 +148,7 @@ @@ -147,6 +148,7 @@
<Compile Include="Src\EnvDTE\Window.cs" />
<Compile Include="Src\IClassKindUpdater.cs" />
<Compile Include="Src\IDocumentNamespaceCreator.cs" />
<Compile Include="Src\IProjectBuilder.cs" />
<Compile Include="Src\IProjectContentExtensions.cs" />
<Compile Include="Src\IVirtualMethodUpdater.cs" />
<Compile Include="Src\IProjectBrowserUpdater.cs" />
@ -218,6 +220,7 @@ @@ -218,6 +220,7 @@
<Compile Include="Src\ManagePackagesViewTitle.cs" />
<Compile Include="Src\MSBuildBasedProjectExtensions.cs" />
<Compile Include="Src\PackageManagementServiceProvider.cs" />
<Compile Include="Src\ProjectBuilder.cs" />
<Compile Include="Src\VirtualMethodUpdater.cs" />
<Compile Include="Src\NewProjectsCreated.cs" />
<Compile Include="Src\OpenMSBuildProjects.cs" />

6
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs

@ -114,5 +114,11 @@ namespace ICSharpCode.PackageManagement.Design @@ -114,5 +114,11 @@ namespace ICSharpCode.PackageManagement.Design
}
return String.Empty;
}
public FakeProjectBuilder FakeProjectBuilder = new FakeProjectBuilder();
public IProjectBuilder ProjectBuilder {
get { return FakeProjectBuilder; }
}
}
}

25
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectBuilder.cs

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.Design
{
public class FakeProjectBuilder : IProjectBuilder
{
public FakeProjectBuilder()
{
BuildResults = new BuildResults();
}
public IProject ProjectPassedToBuild;
public BuildResults BuildResults { get; set; }
public void Build(IProject project)
{
ProjectPassedToBuild = project;
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs

@ -19,6 +19,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -19,6 +19,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
this.solution = projectService.OpenSolution;
this.Projects = new Projects(projectService);
this.Globals = new SolutionGlobals(this);
this.SolutionBuild = new SolutionBuild(this, projectService.ProjectBuilder);
CreateProperties();
}
@ -63,10 +64,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -63,10 +64,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return null;
}
public global::EnvDTE.SolutionBuild SolutionBuild {
get { return new SolutionBuild(this); }
}
public global::EnvDTE.SolutionBuild SolutionBuild { get; private set; }
public global::EnvDTE.Properties Properties { get; private set; }
internal Project GetStartupProject()

20
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionBuild.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.PackageManagement.EnvDTE
@ -9,14 +10,17 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -9,14 +10,17 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public class SolutionBuild : MarshalByRefObject, global::EnvDTE.SolutionBuild
{
Solution solution;
IProjectBuilder projectBuilder;
int lastBuildInfo;
public SolutionBuild()
{
}
public SolutionBuild(Solution solution)
public SolutionBuild(Solution solution, IProjectBuilder projectBuilder)
{
this.solution = solution;
this.projectBuilder = projectBuilder;
}
public global::EnvDTE.SolutionConfiguration ActiveConfiguration {
@ -27,11 +31,23 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -27,11 +31,23 @@ namespace ICSharpCode.PackageManagement.EnvDTE
/// Returns the number of projects that failed to build.
/// </summary>
public int LastBuildInfo {
get { return 0; }
get { return lastBuildInfo; }
}
public void BuildProject(string solutionConfiguration, string projectUniqueName, bool waitForBuildToFinish)
{
Project project = solution.Projects.Item(projectUniqueName) as Project;
projectBuilder.Build(project.MSBuildProject);
UpdateLastBuildInfo(projectBuilder.BuildResults);
}
void UpdateLastBuildInfo(BuildResults buildResults)
{
if (buildResults.ErrorCount > 0) {
lastBuildInfo = 1;
} else {
lastBuildInfo = 0;
}
}
public object StartupProjects {

1
src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs

@ -12,6 +12,7 @@ namespace ICSharpCode.PackageManagement @@ -12,6 +12,7 @@ namespace ICSharpCode.PackageManagement
{
IProject CurrentProject { get; }
Solution OpenSolution { get; }
IProjectBuilder ProjectBuilder { get; }
event ProjectEventHandler ProjectAdded;
event SolutionFolderEventHandler SolutionFolderRemoved;

18
src/AddIns/Misc/PackageManagement/Project/Src/IProjectBuilder.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement
{
public interface IProjectBuilder
{
BuildResults BuildResults { get; }
/// <summary>
/// Builds the project and waits for the build to complete.
/// </summary>
void Build(IProject project);
}
}

7
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs

@ -15,6 +15,11 @@ namespace ICSharpCode.PackageManagement @@ -15,6 +15,11 @@ namespace ICSharpCode.PackageManagement
{
public class PackageManagementProjectService : IPackageManagementProjectService
{
public PackageManagementProjectService()
{
ProjectBuilder = new ProjectBuilder();
}
public IProject CurrentProject {
get { return ProjectService.CurrentProject; }
}
@ -23,6 +28,8 @@ namespace ICSharpCode.PackageManagement @@ -23,6 +28,8 @@ namespace ICSharpCode.PackageManagement
get { return ProjectService.OpenSolution; }
}
public IProjectBuilder ProjectBuilder { get; private set; }
public void RefreshProjectBrowser()
{
if (WorkbenchSingleton.InvokeRequired) {

50
src/AddIns/Misc/PackageManagement/Project/Src/ProjectBuilder.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using System.Threading;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.PackageManagement
{
public class ProjectBuilder : IProjectBuilder
{
ManualResetEvent buildCompleteEvent = new ManualResetEvent(false);
TimeSpan DefaultBuildTimeout = new TimeSpan(0, 5, 0);
public ProjectBuilder()
{
}
public BuildResults BuildResults { get; private set; }
public void Build(IProject project)
{
var build = new BuildProject(project);
build.BuildComplete += BuildComplete;
buildCompleteEvent.Reset();
WorkbenchSingleton.SafeThreadAsyncCall(() => build.Run());
if (buildCompleteEvent.WaitOne(DefaultBuildTimeout)) {
BuildResults = build.LastBuildResults;
} else {
BuildResults = GetBuildTimeoutResult();
}
build.BuildComplete -= BuildComplete;
}
BuildResults GetBuildTimeoutResult()
{
var results = new BuildResults { Result = BuildResultCode.Error };
results.Add(new BuildError(String.Empty, "Timed out waiting for build to complete."));
return results;
}
void BuildComplete(object sender, EventArgs e)
{
buildCompleteEvent.Set();
}
}
}

94
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionBuildTests.cs

@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using ICSharpCode.PackageManagement.EnvDTE;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
@ -14,11 +16,13 @@ namespace PackageManagement.Tests.EnvDTE @@ -14,11 +16,13 @@ namespace PackageManagement.Tests.EnvDTE
SolutionHelper solutionHelper;
Solution solution;
SolutionBuild solutionBuild;
FakeProjectBuilder projectBuilder;
void CreateSolutionBuild()
{
solutionHelper = new SolutionHelper();
solution = solutionHelper.Solution;
projectBuilder = solutionHelper.FakeProjectService.FakeProjectBuilder;
solutionBuild = (SolutionBuild)solution.SolutionBuild;
}
@ -39,6 +43,29 @@ namespace PackageManagement.Tests.EnvDTE @@ -39,6 +43,29 @@ namespace PackageManagement.Tests.EnvDTE
solutionHelper.SetActiveConfiguration(name);
}
void BuildProjectResultHasBuildError()
{
var error = new ICSharpCode.SharpDevelop.Project.BuildError();
projectBuilder.BuildResults.Add(error);
}
void BuildProjectFails()
{
CreateSolutionBuild(@"d:\projects\MyProject\MySolution.sln");
string projectFileName = @"d:\projects\MyProject\MyProject.csproj";
solutionHelper.AddProjectToSolutionWithFileName("MyProject", projectFileName);
BuildProjectResultHasBuildError();
solutionBuild.BuildProject("Debug", "MyProject.csproj", true);
}
void BuildProjectSucceeds()
{
CreateSolutionBuild(@"d:\projects\MyProject\MySolution.sln");
string projectFileName = @"d:\projects\MyProject\MyProject.csproj";
solutionHelper.AddProjectToSolutionWithFileName("MyProject", projectFileName);
solutionBuild.BuildProject("Debug", "MyProject.csproj", true);
}
[Test]
public void StartupProjects_SolutionHasNoProjects_ReturnsEmptyArray()
{
@ -73,5 +100,72 @@ namespace PackageManagement.Tests.EnvDTE @@ -73,5 +100,72 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual("Debug", name);
}
[Test]
public void BuildProject_OneProjectInSolutionAndUniqueNameMatchesProject_ProjectPassedToProjectBuilder()
{
CreateSolutionBuild(@"d:\projects\MyProject\MySolution.sln");
string projectFileName = @"d:\projects\MyProject\MyProject.csproj";
TestableProject expectedProject = solutionHelper.AddProjectToSolutionWithFileName("MyProject", projectFileName);
solutionBuild.BuildProject("Debug", "MyProject.csproj", true);
Assert.AreEqual(expectedProject, projectBuilder.ProjectPassedToBuild);
}
[Test]
public void BuildProject_ProjectIsSecondProjectInSolution_CorrectProjectPassedToProjectBuilder()
{
CreateSolutionBuild(@"d:\projects\MyProject\MySolution.sln");
solutionHelper.AddProjectToSolution("FirstProject");
string projectFileName = @"d:\projects\MyProject\MyProject.csproj";
TestableProject expectedProject = solutionHelper.AddProjectToSolutionWithFileName("MyProject", projectFileName);
solutionBuild.BuildProject("Debug", "MyProject.csproj", true);
Assert.AreEqual(expectedProject, projectBuilder.ProjectPassedToBuild);
}
[Test]
public void BuildProject_OneProjectInSubFolderInsideSolutionFolderAndUniqueNameMatchesProject_ProjectPassedToProjectBuilder()
{
CreateSolutionBuild(@"d:\projects\MyProject\MySolution.sln");
string projectFileName = @"d:\projects\MyProject\SubFolder\MyProject.csproj";
TestableProject expectedProject = solutionHelper.AddProjectToSolutionWithFileName("MyProject", projectFileName);
solutionBuild.BuildProject("Debug", @"SubFolder\MyProject.csproj", true);
Assert.AreEqual(expectedProject, projectBuilder.ProjectPassedToBuild);
}
[Test]
public void LastBuildInfo_BuildProjectFails_LastBuildInfoIsOne()
{
BuildProjectFails();
int result = solutionBuild.LastBuildInfo;
Assert.AreEqual(1, result);
}
[Test]
public void LastBuildInfo_BuildProjectFails_SolutionBuildLastBuildInfoUnchangedWhenAccessedViaSolution()
{
BuildProjectFails();
int result = solution.SolutionBuild.LastBuildInfo;
Assert.AreEqual(1, result);
}
[Test]
public void LastBuildInfo_BuildProjectSucceeds_LastBuildInfoIsZero()
{
BuildProjectSucceeds();
int result = solution.SolutionBuild.LastBuildInfo;
Assert.AreEqual(0, result);
}
}
}

Loading…
Cancel
Save