diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageNames.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageNames.cs index ada280bbf..4ccdbc3e6 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageNames.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageNames.cs @@ -6,5 +6,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration internal class ConstantPackageNames { public const string CSdkPackageName = "Microsoft.NET.Sdk"; + public const string CWebSdkPackageName = "Microsoft.NET.Sdk.Web"; } } \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs new file mode 100644 index 000000000..e20824810 --- /dev/null +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ConstantPackageVersions.cs @@ -0,0 +1,7 @@ +namespace Microsoft.DotNet.ProjectJsonMigration +{ + internal class ConstantPackageVersions + { + public const string WebSdkPackageVersion = "1.0.0-alpha-20161027-4-91"; + } +} diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectTypeDetector.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectTypeDetector.cs new file mode 100644 index 000000000..1f4032143 --- /dev/null +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectTypeDetector.cs @@ -0,0 +1,60 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license info + +using System; +using System.IO; +using System.Linq; +using Microsoft.DotNet.Internal.ProjectModel; + +namespace Microsoft.DotNet.ProjectJsonMigration +{ + public static class ProjectTypeDetector + { + public static bool TryDetectProjectType(string projectDirectory, out string projectType) + { + string projectJsonFile = Path.Combine(projectDirectory, "project.json"); + if (!File.Exists(projectJsonFile)) + { + projectType = null; + return false; + } + + if (IsWebProject(projectJsonFile)) + { + projectType = "web"; + return true; + } + + projectType = null; + return false; + } + + private static bool IsWebProject(string projectJsonFile) + { + Project project; + if (ProjectReader.TryGetProject(projectJsonFile, out project)) + { + if(project.IsTestProject) + { + return false; + } + + foreach (var tf in project.GetTargetFrameworks()) + { + if (tf.CompilerOptions.EmitEntryPoint.GetValueOrDefault() + && HasAnyPackageContainingName(tf, ".AspNetCore.")) + { + return true; + } + } + } + + return false; + } + + private static bool HasAnyPackageContainingName(TargetFrameworkInformation tf, string nameSegment) + { + return tf.Dependencies.Any(x => x.Name.IndexOf(nameSegment, StringComparison.OrdinalIgnoreCase) > -1); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs index 3f1a5de38..d1708e45b 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs @@ -39,6 +39,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules var noFrameworkPackageReferenceItemGroup = migrationRuleInputs.OutputMSBuildProject.AddItemGroup(); + AddProjectTypeSpecificDependencies(migrationSettings, noFrameworkPackageReferenceItemGroup); + // Inject Sdk dependency _transformApplicator.Execute( PackageDependencyInfoTransform.Transform( @@ -76,6 +78,27 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules MigrateTools(project, migrationRuleInputs.OutputMSBuildProject); } + private void AddProjectTypeSpecificDependencies(MigrationSettings migrationSettings, ProjectItemGroupElement noFrameworkPackageReferenceItemGroup) + { + string type; + if (ProjectTypeDetector.TryDetectProjectType(migrationSettings.ProjectDirectory, out type)) + { + switch (type) + { + case "web": + _transformApplicator.Execute( + PackageDependencyInfoTransform.Transform( + new PackageDependencyInfo + { + Name = ConstantPackageNames.CWebSdkPackageName, + Version = ConstantPackageVersions.WebSdkPackageVersion, + PrivateAssets = "All" + }), noFrameworkPackageReferenceItemGroup, mergeExisting: false); + break; + } + } + } + private void MigrateImports(ProjectPropertyGroupElement commonPropertyGroup, TargetFrameworkInformation targetFramework) { var transform = ImportsTransformation.Transform(targetFramework); diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs index b7de22eb5..794942193 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs @@ -49,6 +49,26 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests privateAssetsMetadata.Value.Should().Be("All"); } + [Fact] + public void It_migrates_web_projects_to_have_web_sdk_PrivateAssets() + { + var mockProj = RunPackageDependenciesRuleOnPj(@" + { + ""dependencies"": { + ""Microsoft.AspNetCore.Mvc"" : { + ""version"": ""1.0.0"" + } + } + }"); + + + var packageRef = mockProj.Items.First(i => i.Include == "Microsoft.NET.Sdk.Web" && i.ItemType == "PackageReference"); + + var privateAssetsMetadata = packageRef.GetMetadataWithName("PrivateAssets"); + privateAssetsMetadata.Value.Should().NotBeNull(); + privateAssetsMetadata.Value.Should().Be("All"); + } + [Fact] public void It_migrates_suppress_parent_array_to_PrivateAssets() {