2016-08-22 12:21:34 -07:00
|
|
|
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
|
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
|
|
|
|
|
|
using System.Collections.Generic;
|
2016-08-23 13:50:05 -07:00
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
2016-08-22 12:21:34 -07:00
|
|
|
|
using Microsoft.Build.Construction;
|
2016-08-23 13:50:05 -07:00
|
|
|
|
using Microsoft.DotNet.ProjectJsonMigration.Transforms;
|
2016-08-22 12:21:34 -07:00
|
|
|
|
using Microsoft.DotNet.ProjectModel;
|
|
|
|
|
using Microsoft.DotNet.ProjectModel.Compilation;
|
|
|
|
|
using Microsoft.DotNet.ProjectModel.Graph;
|
|
|
|
|
using Microsoft.DotNet.Tools.Common;
|
|
|
|
|
|
2016-08-23 13:50:05 -07:00
|
|
|
|
namespace Microsoft.DotNet.ProjectJsonMigration.Rules
|
2016-08-22 12:21:34 -07:00
|
|
|
|
{
|
|
|
|
|
public class MigrateProjectDependenciesRule : IMigrationRule
|
|
|
|
|
{
|
|
|
|
|
private readonly ITransformApplicator _transformApplicator;
|
|
|
|
|
private string _projectDirectory;
|
|
|
|
|
|
2016-08-23 13:50:05 -07:00
|
|
|
|
public MigrateProjectDependenciesRule(ITransformApplicator transformApplicator = null)
|
2016-08-22 12:21:34 -07:00
|
|
|
|
{
|
|
|
|
|
_transformApplicator = transformApplicator ?? new TransformApplicator();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Apply(MigrationSettings migrationSettings, MigrationRuleInputs migrationRuleInputs)
|
|
|
|
|
{
|
|
|
|
|
_projectDirectory = migrationSettings.ProjectDirectory;
|
|
|
|
|
|
|
|
|
|
var csproj = migrationRuleInputs.OutputMSBuildProject;
|
|
|
|
|
var projectContext = migrationRuleInputs.DefaultProjectContext;
|
|
|
|
|
var projectExports = projectContext.CreateExporter("_").GetDependencies(LibraryType.Project);
|
|
|
|
|
|
|
|
|
|
var projectDependencyTransformResults =
|
|
|
|
|
projectExports.Select(projectExport => ProjectDependencyTransform.Transform(projectExport));
|
2016-08-23 13:50:05 -07:00
|
|
|
|
|
|
|
|
|
if (projectDependencyTransformResults.Any())
|
|
|
|
|
{
|
|
|
|
|
AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup);
|
|
|
|
|
AddProjectDependenciesToNewItemGroup(csproj.AddItemGroup(), projectDependencyTransformResults);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddProjectDependenciesToNewItemGroup(ProjectItemGroupElement itemGroup, IEnumerable<ProjectItemElement> projectDependencyTransformResults)
|
|
|
|
|
{
|
|
|
|
|
foreach (var projectDependencyTransformResult in projectDependencyTransformResults)
|
|
|
|
|
{
|
|
|
|
|
_transformApplicator.Execute(projectDependencyTransformResult, itemGroup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddPropertyTransformsToCommonPropertyGroup(ProjectPropertyGroupElement commonPropertyGroup)
|
|
|
|
|
{
|
|
|
|
|
var propertyTransformResults = new[]
|
2016-08-22 12:21:34 -07:00
|
|
|
|
{
|
|
|
|
|
AutoUnifyTransform.Transform(true),
|
|
|
|
|
DesignTimeAutoUnifyTransform.Transform(true)
|
|
|
|
|
};
|
|
|
|
|
|
2016-08-23 13:50:05 -07:00
|
|
|
|
foreach (var propertyTransformResult in propertyTransformResults)
|
2016-08-22 12:21:34 -07:00
|
|
|
|
{
|
2016-08-23 13:50:05 -07:00
|
|
|
|
_transformApplicator.Execute(propertyTransformResult, commonPropertyGroup);
|
2016-08-22 12:21:34 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private AddPropertyTransform<bool> AutoUnifyTransform => new AddPropertyTransform<bool>(
|
|
|
|
|
"AutoUnify",
|
|
|
|
|
"true",
|
|
|
|
|
b => true);
|
|
|
|
|
|
|
|
|
|
private AddPropertyTransform<bool> DesignTimeAutoUnifyTransform => new AddPropertyTransform<bool>(
|
|
|
|
|
"DesignTimeAutoUnify",
|
|
|
|
|
"true",
|
|
|
|
|
b => true);
|
|
|
|
|
|
|
|
|
|
private AddItemTransform<LibraryExport> ProjectDependencyTransform => new AddItemTransform<LibraryExport>(
|
|
|
|
|
"ProjectReference",
|
|
|
|
|
export =>
|
|
|
|
|
{
|
|
|
|
|
if (!export.Library.Resolved)
|
|
|
|
|
{
|
2016-08-23 13:50:05 -07:00
|
|
|
|
MigrationErrorCodes.MIGRATE1014(
|
|
|
|
|
$"Unresolved project dependency ({export.Library.Identity.Name})").Throw();
|
2016-08-22 12:21:34 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var projectFile = ((ProjectDescription)export.Library).Project.ProjectFilePath;
|
|
|
|
|
var projectDir = Path.GetDirectoryName(projectFile);
|
|
|
|
|
var migratedProjectFileName = Path.GetFileName(projectDir) + ".csproj";
|
|
|
|
|
var relativeProjectDir = PathUtility.GetRelativePath(_projectDirectory + "/", projectDir);
|
|
|
|
|
|
|
|
|
|
return Path.Combine(relativeProjectDir, migratedProjectFileName);
|
|
|
|
|
},
|
|
|
|
|
export => "",
|
|
|
|
|
export => true);
|
|
|
|
|
}
|
|
|
|
|
}
|