diff --git a/build/RepositoryBuild.targets b/build/RepositoryBuild.targets index 15a9347f0d..cec7ab9291 100644 --- a/build/RepositoryBuild.targets +++ b/build/RepositoryBuild.targets @@ -77,6 +77,8 @@ + true + $(RepositoryBuildArguments) /p:AspNetUniverseBuildOffline=true @@ -88,6 +90,7 @@ $(RepositoryBuildArguments) /noconsolelogger '/l:RepoTasks.FlowLogger,$(MSBuildThisFileDirectory)tasks\bin\publish\RepoTasks.dll;Summary;FlowId=$(RepositoryToBuild)' $(RepositoryBuildArguments) '/p:DotNetAssetRootAccessTokenSuffix=$(DotNetAssetRootAccessTokenSuffix)' $(RepositoryBuildArguments) '/p:DotNetAssetRootUrl=$(DotNetAssetRootUrl)' + $(RepositoryBuildArguments) /p:SkipAspNetCoreRuntimeInstall=true $(RepositoryRoot)korebuild-lock.txt $(BuildRepositoryRoot)korebuild-lock.txt @@ -160,9 +163,12 @@ + + + - - + diff --git a/build/SharedFx.targets b/build/SharedFx.targets index 7809cb8613..cb484f13ca 100644 --- a/build/SharedFx.targets +++ b/build/SharedFx.targets @@ -2,10 +2,6 @@ - - $(GetArtifactInfoDependsOn);GetMetapackageArtifactInfo - - $([MSBuild]::NormalizeDirectory($(ArtifactsDir)))assets\Runtime\$(PackageVersion)\ @@ -71,8 +67,7 @@ ReferencePackagePath="$(MetapackageWorkDirectory)$(MetapackageName).csproj" MetapackageReferenceType="$(MetapackageReferenceType)" DependencyVersionRangeType="$(MetapackageDependencyVersionRangeType)" - BuildArtifacts="@(ArtifactInfo)" - PackageArtifacts="@(PackageArtifact)" + PackageArtifacts="@(_PackageArtifactSpec)" ExternalDependencies="@(ExternalDependency)" /> diff --git a/build/Templating.targets b/build/Templating.targets deleted file mode 100644 index 5f2867073d..0000000000 --- a/build/Templating.targets +++ /dev/null @@ -1,78 +0,0 @@ - - - $(MSBuildThisFileDirectory)..\modules\Templating\ - $(GetArtifactInfoDependsOn);GetTemplateArtifactInfo - $(TestDependsOn);TestTemplates - false - - - - - RepositoryRoot=$(TemplatingProjectRoot); - BuildNumber=$(BuildNumber); - Configuration=$(Configuration); - IsFinalBuild=$(IsFinalBuild); - - - - - - - - - - - - <_BuildTemplateProjProperties> - $(TemplateProjProperties); - SkipAspNetCoreRuntimeInstall=true; - DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath); - DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath); - SkipTests=true; - - - - - - - - - - - - - - - - - - - - - - - - - <_TestTemplateProjProperties> - $(TemplateProjProperties); - SkipAspNetCoreRuntimeInstall=true; - DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath); - DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath); - NoBuild=true; - - - - - - - diff --git a/build/artifacts.props b/build/artifacts.props index ab225069f3..98336566fa 100644 --- a/build/artifacts.props +++ b/build/artifacts.props @@ -25,17 +25,16 @@ + - - - + + - - - + + @@ -49,50 +48,52 @@ - + + - + + - + - + - + - + + + + - - - @@ -100,15 +101,17 @@ + + + - + - - + @@ -116,68 +119,59 @@ - - + + - + + - - - + + - + - - + - + + - + + - - - - - - - - - - + - - + + - @@ -197,32 +191,33 @@ - + + - + - - + - + - + + - + @@ -230,7 +225,6 @@ - @@ -242,13 +236,14 @@ + - - - + + + @@ -257,13 +252,12 @@ - + - - + @@ -274,10 +268,11 @@ + - + @@ -288,8 +283,8 @@ - + @@ -297,17 +292,15 @@ - + - - diff --git a/build/buildorder.props b/build/buildorder.props index 4c4e98d981..565c9704f6 100644 --- a/build/buildorder.props +++ b/build/buildorder.props @@ -47,6 +47,7 @@ + diff --git a/build/dependencies.props b/build/dependencies.props index 75ea5099e8..3c2ca3bb15 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,4 +1,4 @@ - + 4.6.0-preview1-26725-04 @@ -132,6 +132,10 @@ 2.0.1 6.0.1 2.2.0 + 0.20.0 + 3.12.1 + 17.17134.0 + 3.12.1 1.4.0 3.2.0 1.1.11 @@ -160,12 +164,12 @@ 2.9.0-beta4-62911-02 8.1.4 2.0.1 - 0.9.0 + 0.10.0 2.3.1 2.3.1 2.3.1 2.3.1 2.3.1 - 2.4.0-rc.1.build4038 + 2.4.0 diff --git a/build/external-dependencies.props b/build/external-dependencies.props index 2a72ca410b..93c7d854d8 100644 --- a/build/external-dependencies.props +++ b/build/external-dependencies.props @@ -124,9 +124,13 @@ - + + + + + @@ -145,8 +149,8 @@ - + @@ -166,7 +170,6 @@ - @@ -174,5 +177,7 @@ + + diff --git a/build/repo.props b/build/repo.props index 0346602d9d..38bc1dd623 100644 --- a/build/repo.props +++ b/build/repo.props @@ -52,6 +52,12 @@ Arch="x86" Feed="$(DotNetAssetRootUrl)" FeedCredential="$(DotNetAssetRootAccessTokenSuffix)" /> + + + diff --git a/build/repo.targets b/build/repo.targets index 80a5b354c0..f575d77aff 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -2,7 +2,6 @@ - @@ -20,17 +19,16 @@ $(CleanDependsOn);CleanArtifacts;CleanUniverseArtifacts $(RestoreDependsOn);InstallDotNet $(CompileDependsOn);BuildRepositories - $(PackageDependsOn);BuildMetapackages;BuildTemplates;CheckExpectedPackagesExist + $(PackageDependsOn);BuildMetapackages;CheckExpectedPackagesExist $(TestDependsOn);_TestRepositories - $(VerifyDependsOn);VerifyCoherentVersions - $(GetArtifactInfoDependsOn);ResolveRepoInfo;GetLineupPackageInfo + $(GetArtifactInfoDependsOn);ResolveRepoInfo - + MicrosoftNETCoreAppPackageVersion=$(MicrosoftNETCoreAppPackageVersion); @@ -77,8 +75,41 @@ - - <_ShippedSolution Update="@(_ShippedSolution)" Build="false" Shipped="true" /> + <_Temp Remove="@(_Temp)" /> + <_Temp Include="@(PackageArtifact)" /> + + + + + + + + + + <_PackageArtifactWithoutMatchingInfo Include="@(_Temp)" Exclude="@(PackageArtifact)" /> + + + + + + + + %(ShippedArtifactInfo.Version) + + + + <_PackageArtifactSpec Include="@(PackageArtifact)" /> + + + + + <_ShippedSolution Update="@(_ShippedSolution)" Build="false" IsPatching="false" /> <_NoBuildSolution Update="@(_NoBuildSolution)" Build="false" /> @@ -184,6 +215,10 @@ + + + + @@ -242,17 +278,6 @@ - - - - - - - - - diff --git a/build/submodules.props b/build/submodules.props index a5ff155336..c01258dd35 100644 --- a/build/submodules.props +++ b/build/submodules.props @@ -2,13 +2,40 @@ true + + + ProductChangesOnly + + false + ProductChangesOnly + + + true + + - @@ -35,9 +62,8 @@ - + - @@ -45,13 +71,18 @@ - + - + + + + + + diff --git a/build/tasks/AddMetapackageReferences.cs b/build/tasks/AddMetapackageReferences.cs index 4f799b19c1..57a9675061 100644 --- a/build/tasks/AddMetapackageReferences.cs +++ b/build/tasks/AddMetapackageReferences.cs @@ -29,9 +29,6 @@ namespace RepoTasks MajorMinor, // [1.1.1, 1.2.0) } - [Required] - public ITaskItem[] BuildArtifacts { get; set; } - [Required] public ITaskItem[] PackageArtifacts { get; set; } @@ -49,9 +46,6 @@ namespace RepoTasks // Parse input var metapackageArtifacts = PackageArtifacts.Where(p => p.GetMetadata(MetapackageReferenceType) == "true"); var externalArtifacts = ExternalDependencies.Where(p => p.GetMetadata(MetapackageReferenceType) == "true"); - var buildArtifacts = BuildArtifacts.Select(ArtifactInfo.Parse) - .OfType() - .Where(p => !p.IsSymbolsArtifact); var xmlDoc = new XmlDocument(); xmlDoc.Load(ReferencePackagePath); @@ -66,19 +60,7 @@ namespace RepoTasks foreach (var package in metapackageArtifacts) { var packageName = package.ItemSpec; - string packageVersion; - try - { - packageVersion = buildArtifacts - .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase)) - .PackageInfo.Version.ToString(); - } - catch (InvalidOperationException) - { - Log.LogError($"Missing Package: {packageName} from build artifacts"); - throw; - } - + var packageVersion = package.GetMetadata("Version"); if (string.IsNullOrEmpty(packageVersion)) { Log.LogError("Missing version information for package {0}", packageName); diff --git a/build/tasks/AnalyzeBuildGraph.cs b/build/tasks/AnalyzeBuildGraph.cs index aa2b7131cb..7975908bae 100644 --- a/build/tasks/AnalyzeBuildGraph.cs +++ b/build/tasks/AnalyzeBuildGraph.cs @@ -29,6 +29,9 @@ namespace RepoTasks [Required] public ITaskItem[] Artifacts { get; set; } + [Required] + public ITaskItem[] Repositories { get; set; } + [Required] public ITaskItem[] Dependencies { get; set; } @@ -67,6 +70,18 @@ namespace RepoTasks var solutions = factory.Create(Solutions, props, defaultConfig, _cts.Token); Log.LogMessage($"Found {solutions.Count} and {solutions.Sum(p => p.Projects.Count)} projects"); + var policies = new Dictionary(); + foreach (var repo in Repositories) + { + policies.Add(repo.ItemSpec, Enum.Parse(repo.GetMetadata("PatchPolicy"))); + } + + foreach (var solution in solutions) + { + var repoName = Path.GetFileName(solution.Directory); + solution.PatchPolicy = policies[repoName]; + } + if (_cts.IsCancellationRequested) { return false; @@ -107,9 +122,7 @@ namespace RepoTasks } var inconsistentVersions = new List(); - var reposThatShouldPatch = new HashSet(); - // TODO cleanup the 4-deep nested loops foreach (var solution in solutions) foreach (var project in solution.Projects) foreach (var tfm in project.Frameworks) @@ -155,19 +168,25 @@ namespace RepoTasks continue; } - if (!solution.ShouldBuild && solution.Shipped) + var shouldCascade = (solution.PatchPolicy & PatchPolicy.CascadeVersions) != 0; + if (!solution.ShouldBuild && !solution.IsPatching && shouldCascade) { - reposThatShouldPatch.Add(Path.GetFileName(Path.GetDirectoryName(solution.FullPath))); + var repoName = Path.GetFileName(Path.GetDirectoryName(solution.FullPath)); + Log.LogError($"{repoName} should not be marked 'IsPatching=false'. Version changes in other repositories mean it should be patched to perserve cascading version upgrades."); + } - inconsistentVersions.Add(new VersionMismatch + if (shouldCascade) { - Solution = solution, - Project = project, - PackageId = dependency.Key, - ActualVersion = dependencyVersion, - ExpectedVersion = package.PackageInfo.Version, - }); + inconsistentVersions.Add(new VersionMismatch + { + Solution = solution, + Project = project, + PackageId = dependency.Key, + ActualVersion = dependency.Value.Version, + ExpectedVersion = package.PackageInfo.Version, + }); + } } if (inconsistentVersions.Count != 0) @@ -200,11 +219,6 @@ namespace RepoTasks Log.LogMessage(MessageImportance.Normal, $"Potentially unused external dependency: {item.PackageId}/{item.Version}. See https://github.com/aspnet/Universe/wiki/Build-warning-and-error-codes for details."); } } - - foreach (var repo in reposThatShouldPatch) - { - Log.LogError($"{repo} should not be a 'ShippedRepository'. Version changes in other repositories mean it should be patched to perserve cascading version upgrades."); - } } private ITaskItem[] GetRepositoryBuildOrder(IEnumerable artifacts, IEnumerable solutions) diff --git a/build/tasks/CheckRepoGraph.cs b/build/tasks/CheckRepoGraph.cs index 5502d7316c..eecd32580e 100644 --- a/build/tasks/CheckRepoGraph.cs +++ b/build/tasks/CheckRepoGraph.cs @@ -155,6 +155,15 @@ namespace RepoTasks var repoName = GetDirectoryName(src.Directory); var repo = repos[repoName]; + var policy = Enum.Parse(repo.GetMetadata("PatchPolicy")); + + if ((policy & PatchPolicy.AlwaysUpdate) != 0 && !src.IsPatching) + { + Log.LogError($"{repoName} is not currently set to patch, but it should because the policy is set to always include this in servicing updates. Update the configuration in submodule.props."); + continue; + } + + var srcShouldCascade = (policy & PatchPolicy.CascadeVersions) != 0; for (var j = 0; j < repoGraph.Count; j++) { if (j == i) continue; @@ -164,9 +173,9 @@ namespace RepoTasks var targetRepoName = GetDirectoryName(target.Directory); var targetRepo = repos[targetRepoName]; - if (src.Shipped && !target.Shipped) + if (srcShouldCascade && !src.IsPatching && target.IsPatching) { - Log.LogError($"{repoName} cannot depend on {targetRepoName}. Repos marked as 'Shipped' cannot depend on repos that are rebuilding. Update the configuration in submodule.props."); + Log.LogError($"{repoName} should be patching because it depend on {targetRepoName} and its patch policy is to cascade version changes. Update the configuration in submodule.props."); } } } diff --git a/build/tasks/ProjectModel/PatchPolicy.cs b/build/tasks/ProjectModel/PatchPolicy.cs new file mode 100644 index 0000000000..a28451cabb --- /dev/null +++ b/build/tasks/ProjectModel/PatchPolicy.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using NuGet.Frameworks; + +namespace RepoTasks.ProjectModel +{ + [Flags] + internal enum PatchPolicy + { + /// + /// Only produce new package versions if there were changes to product code. + /// + ProductChangesOnly = 1 << 0, + + /// + /// Packages should update in every patch. + /// + AlwaysUpdate = 1 << 1, + + /// + /// Produce new package versions if there were changes to product code, or if one of the package dependencies has updated. + /// + CascadeVersions = 1 << 2, + + AlwaysUpdateAndCascadeVersions = CascadeVersions | AlwaysUpdate, + } +} diff --git a/build/tasks/ProjectModel/SolutionInfo.cs b/build/tasks/ProjectModel/SolutionInfo.cs index 21af5e5291..cacc521367 100644 --- a/build/tasks/ProjectModel/SolutionInfo.cs +++ b/build/tasks/ProjectModel/SolutionInfo.cs @@ -9,7 +9,7 @@ namespace RepoTasks.ProjectModel { internal class SolutionInfo { - public SolutionInfo(string fullPath, string configName, IReadOnlyList projects, bool shouldBuild, bool shipped) + public SolutionInfo(string fullPath, string configName, IReadOnlyList projects, bool shouldBuild, bool isPatching) { if (string.IsNullOrEmpty(fullPath)) { @@ -26,8 +26,7 @@ namespace RepoTasks.ProjectModel ConfigName = configName; Projects = projects ?? throw new ArgumentNullException(nameof(projects)); ShouldBuild = shouldBuild; - Shipped = shipped; - + IsPatching = isPatching; foreach (var proj in Projects) { proj.SolutionInfo = this; @@ -39,6 +38,7 @@ namespace RepoTasks.ProjectModel public string ConfigName { get; } public IReadOnlyList Projects { get; } public bool ShouldBuild { get; } - public bool Shipped { get; } + public bool IsPatching { get; } + public PatchPolicy PatchPolicy { get; set; } } } diff --git a/build/tasks/ProjectModel/SolutionInfoFactory.cs b/build/tasks/ProjectModel/SolutionInfoFactory.cs index 4099399118..aac69cff08 100644 --- a/build/tasks/ProjectModel/SolutionInfoFactory.cs +++ b/build/tasks/ProjectModel/SolutionInfoFactory.cs @@ -85,14 +85,14 @@ namespace RepoTasks.ProjectModel } bool.TryParse(solution.GetMetadata("Build"), out var shouldBuild); - bool.TryParse(solution.GetMetadata("Shipped"), out var shipped); + bool.TryParse(solution.GetMetadata("IsPatching"), out var isPatching); var solutionInfo = new SolutionInfo( solutionFile, configName, projects.ToArray(), shouldBuild, - shipped); + isPatching); _buildEngine.RegisterTaskObject(key, solutionInfo, RegisteredTaskObjectLifetime.Build, allowEarlyCollection: true); diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index ce7b31fa2c..1339fcba27 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -18,7 +18,6 @@ - diff --git a/build/tasks/VerifyCoherentVersions.cs b/build/tasks/VerifyCoherentVersions.cs deleted file mode 100644 index 714a57d807..0000000000 --- a/build/tasks/VerifyCoherentVersions.cs +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.Build.Framework; -using NuGet.Packaging; -using RepoTasks.ProjectModel; - -namespace RepoTasks -{ - public class VerifyCoherentVersions : Microsoft.Build.Utilities.Task - { - [Required] - public ITaskItem[] PackageFiles { get; set; } - - [Required] - public ITaskItem[] ExternalDependencies { get; set; } - - public override bool Execute() - { - if (PackageFiles.Length == 0) - { - Log.LogError("Did not find any packages to verify for version coherence"); - return false; - } - - var packageLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); - var dependencyMap = new Dictionary>(StringComparer.OrdinalIgnoreCase); - - foreach (var dep in ExternalDependencies) - { - if (!dependencyMap.TryGetValue(dep.ItemSpec, out var list)) - { - dependencyMap[dep.ItemSpec] = list = new List(); - } - - list.Add(dep.GetMetadata("Version")); - } - - foreach (var file in PackageFiles) - { - PackageInfo package; - using (var reader = new PackageArchiveReader(file.ItemSpec)) - { - var identity = reader.GetIdentity(); - var metadata = new PackageBuilder(reader.GetNuspec(), basePath: null); - package = new PackageInfo(identity.Id, identity.Version, - source: Path.GetDirectoryName(file.ItemSpec), - dependencyGroups: metadata.DependencyGroups.ToArray()); - } - - if (packageLookup.TryGetValue(package.Id, out var existingPackage)) - { - Log.LogError("Multiple copies of the following package were found: " + - Environment.NewLine + - existingPackage + - Environment.NewLine + - package); - continue; - } - - packageLookup[package.Id] = package; - } - - foreach (var packageInfo in packageLookup.Values) - { - Visit(packageLookup, dependencyMap, packageInfo); - } - - Log.LogMessage(MessageImportance.High, $"Verified {PackageFiles.Length} package(s) have coherent versions"); - return !Log.HasLoggedErrors; - } - - private void Visit( - IReadOnlyDictionary packageLookup, - IReadOnlyDictionary> dependencyMap, - PackageInfo packageInfo) - { - Log.LogMessage(MessageImportance.Low, $"Processing package {packageInfo.Id}"); - try - { - foreach (var dependencySet in packageInfo.DependencyGroups) - { - foreach (var dependency in dependencySet.Packages) - { - PackageInfo dependencyPackageInfo; - var minVersion = dependency.VersionRange.MinVersion; - var minVersionString = minVersion.ToString(); - if (dependencyMap.TryGetValue(dependency.Id, out var externalDepVersions)) - { - var matchedVersion = externalDepVersions.FirstOrDefault(d => minVersionString.Equals(d)); - - // If dependency does not match an external dependency version, check if matching version - // will be built in Universe. That's fine in benchmark apps for example. - var universePackageVersion = string.Empty; - if (matchedVersion == null && - packageLookup.TryGetValue(dependency.Id, out var universePackageInfo)) - { - if (universePackageInfo.Version == minVersion) - { - continue; - } - - // Include Universe version in following error message. - universePackageVersion = universePackageInfo.Version.ToString(); - } - - if (matchedVersion == null) - { - var versions = string.Join(" or ", externalDepVersions); - if (!string.IsNullOrEmpty(universePackageVersion)) - { - versions += $" or {universePackageVersion}"; - } - - Log.LogError($"Package {packageInfo.Id} has an external dependency on the wrong version of {dependency.Id}. " - + $"It uses {minVersionString} but only {versions} is allowed."); - } - - continue; - } - else if (!packageLookup.TryGetValue(dependency.Id, out dependencyPackageInfo)) - { - Log.LogError($"Package {packageInfo.Id} has an undefined external dependency on {dependency.Id}/{minVersionString}. " + - "If the package is built in aspnet/Universe, make sure it is also marked as 'ship'. " + - "If it is an external dependency, add it as a new ExternalDependency."); - continue; - } - - if (dependencyPackageInfo.Version != minVersion) - { - // For any dependency in the universe - // Add a mismatch if the min version doesn't work out - // (we only really care about >= minVersion) - Log.LogError($"{packageInfo.Id} depends on {dependency.Id} " + - $"{dependency.VersionRange} ({dependencySet.TargetFramework}) when the latest build is {dependencyPackageInfo.Version}."); - } - } - } - } - catch (Exception ex) - { - Log.LogError($"Unexpected error while attempting to verify package {packageInfo.Id}.\r\n{ex}"); - } - } - } -} diff --git a/scripts/PatchVersionPrefix.ps1 b/scripts/PatchVersionPrefix.ps1 index cf62428902..d8cce86487 100755 --- a/scripts/PatchVersionPrefix.ps1 +++ b/scripts/PatchVersionPrefix.ps1 @@ -54,6 +54,9 @@ function BumpVersion([System.Xml.XmlNode]$node) { 'Patch' { $node.InnerText = "{0}.{1}.{2}" -f $version.Major, $version.Minor, ($version.Build + 1) } + default { + throw "Could not figure out how to apply patch policy $mode" + } } return "Bumping version from $version to $($node.InnerText)" } diff --git a/src/PackageArchive/Scenario.ConsoleApp/Scenario.ConsoleApp.csproj b/src/PackageArchive/Scenario.ConsoleApp/Scenario.ConsoleApp.csproj index a83925d7df..d5e6b40bed 100644 --- a/src/PackageArchive/Scenario.ConsoleApp/Scenario.ConsoleApp.csproj +++ b/src/PackageArchive/Scenario.ConsoleApp/Scenario.ConsoleApp.csproj @@ -1,17 +1,17 @@ - netcoreapp3.0 99.9 + netcoreapp3.0 3.0.0 - - $(MicrosoftNETCoreApp30PackageVersion) - $([MSbuild]::ValueOrDefault('$(MicrosoftNETCoreAppPackageVersion)','$(MaxImplicitVersion)')) + + $(MicrosoftNETCoreApp30PackageVersion) + $([MSbuild]::ValueOrDefault('$(NETCoreImplicitVersion)','$(MaxImplicitVersion)')) - + diff --git a/src/PackageArchive/Scenario.WebApp/Scenario.WebApp.csproj b/src/PackageArchive/Scenario.WebApp/Scenario.WebApp.csproj index 7b6e555ae0..70dada7c7b 100644 --- a/src/PackageArchive/Scenario.WebApp/Scenario.WebApp.csproj +++ b/src/PackageArchive/Scenario.WebApp/Scenario.WebApp.csproj @@ -1,14 +1,18 @@ - netcoreapp3.0 99.9 + netcoreapp3.0 + 3.0.0 + + $(MicrosoftAspNetCoreAppPackageVersion) + $([MSBuild]::ValueOrDefault('$(AspNetCoreImplicitVersion)','$(MaxImplicitVersion)')) - - + +