Flatten the dependency graph of Microsoft.AspNetCore.App (#4061)

This changes the way Microsoft.AspNetCore.App works to follow patterns set by Microsoft.NETCore.App. Instead of being a metapackage with dozens of dependencies, this package has no dependencies. It uses RID-splitting to deliver standalone assets for self-contained deployments.

Changes:
* Implements RID-split packages for Microsoft.AspNetCore.App.
* Update shared fx deps.json generation to only include entries for the RID-specific metapackages
* Include platform-specific packages in publish output
* Remove all nuspec dependencies of Microsoft.AspNetCore.App and collect all references into the package.
This commit is contained in:
Nate McMaster 2018-11-16 15:16:15 -08:00 committed by GitHub
parent 658653808d
commit 0e12274a8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 328 additions and 469 deletions

View File

@ -63,7 +63,7 @@ jobs:
- job: ${{ coalesce(parameters.jobName, parameters.agentOs) }}
displayName: ${{ coalesce(parameters.jobDisplayName, parameters.agentOs) }}
dependsOn: ${{ parameters.dependsOn }}
timeoutInMinutes: 90
timeoutInMinutes: 120
workspace:
clean: all
strategy:

View File

@ -97,7 +97,6 @@
<Import Project="eng\targets\RuntimeIdentifiers.props" />
<Import Project="eng\targets\Cpp.Common.props" Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />
<Import Project="eng\targets\CSharp.Common.props" Condition="'$(MSBuildProjectExtension)' == '.csproj'" />
<Import Project="eng\targets\SharedFx.Common.props" Condition="'$(MSBuildProjectExtension)' == '.shfxproj'" />
<Import Project="eng\targets\Wix.Common.props" Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
</Project>

View File

@ -54,6 +54,5 @@
<Import Project="eng\targets\Cpp.Common.targets" Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />
<Import Project="eng\targets\CSharp.Common.targets" Condition="'$(MSBuildProjectExtension)' == '.csproj'" />
<Import Project="eng\targets\SharedFx.Common.targets" Condition="'$(MSBuildProjectExtension)' == '.shfxproj'" />
<Import Project="eng\targets\Wix.Common.targets" Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
</Project>

View File

@ -58,7 +58,7 @@
Value="$(PackageVersion)" />
</Target>
<Target Name="GetFilesToPublish" DependsOnTargets="GetArtifactInfo;GeneratePublishFiles">
<Target Name="GetFilesToPublish" DependsOnTargets="GetAllRidPackages;GetArtifactInfo;GeneratePublishFiles">
<PropertyGroup>
<BlobBasePath>aspnetcore/Runtime/$(PackageVersion)/</BlobBasePath>
<NpmBlobBasePath>aspnetcore/npm/</NpmBlobBasePath>
@ -175,6 +175,11 @@
<Output TaskParameter="JoinResult" ItemName="_PackageArtifactInfoWithCategory" />
</RepoTasks.JoinItems>
<ItemGroup>
<_RidSpecificPackages Include="$(SupportedRuntimeIdentifiers)" Exclude="$(SharedFxRid)" />
<PackageToPublish Include="$(DependencyPackagesDir)runtime.%(_RidSpecificPackages.Identity).Microsoft.AspNetCore.App.$(SharedFxVersion).nupkg" Category="ship" />
</ItemGroup>
<ItemGroup>
<PackageToPublish Include="%(_PackageArtifactInfoWithCategory.ArtifactPath)" Category="%(_PackageArtifactInfoWithCategory.Category)" />
<PackageToPublish Include="%(_PackageArtifactInfo.ArtifactPath)" Category="%(_PackageArtifactInfo.Category)" Condition="'%(_PackageArtifactInfo.Category)' != ''" />

View File

@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<UnitTestFxProject>$(RepositoryRoot)src\Framework\Framework.UnitTests\Framework.UnitTests.csproj</UnitTestFxProject>
<UnitTestFxProject>$(RepositoryRoot)src\Framework\test\Microsoft.AspNetCore.App.UnitTests.csproj</UnitTestFxProject>
<UnitTestFxProject>$([MSBuild]::NormalizePath($(UnitTestFxProject)))</UnitTestFxProject>
<CodeSignDependsOn Condition="'$(_ProjectsOnly)' != 'true'">$(CodeSignDependsOn);GetSharedFxFilesToSign</CodeSignDependsOn>
<BuildSharedFxDependsOn>_BuildSharedFxProjects;TestSharedFx</BuildSharedFxDependsOn>

View File

@ -23,7 +23,7 @@
<PackageArtifact Include="Microsoft.AspNet.Identity.AspNetCoreCompat" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.App" Category="ship" />
<PackageArtifact Include="runtime.$(SharedFxRid).Microsoft.AspNetCore.App" Category="noship" />
<PackageArtifact Include="runtime.$(SharedFxRid).Microsoft.AspNetCore.App" Category="ship" />
<PackageArtifact Include="Microsoft.AspNetCore.Antiforgery" Category="ship" />
<PackageArtifact Include="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Category="ship" />
<PackageArtifact Include="Microsoft.AspNetCore.AspNetCoreModule" Category="noship" Condition=" '$(OS)' == 'Windows_NT' " />

View File

@ -142,7 +142,7 @@
<CastleCorePackageVersion>4.2.1</CastleCorePackageVersion>
<DevDependency_MicrosoftDotNetBuildTasksFeedPackageVersion>2.2.0-preview1-03124-01</DevDependency_MicrosoftDotNetBuildTasksFeedPackageVersion>
<DevDependency_MicrosoftExtensionsDependencyModelPackageVersion>2.0.0</DevDependency_MicrosoftExtensionsDependencyModelPackageVersion>
<DevDependency_MicrosoftExtensionsDependencyModelPackageVersion>2.1.0</DevDependency_MicrosoftExtensionsDependencyModelPackageVersion>
<DevDependency_WindowsAzureStoragePackageVersion>8.7.0</DevDependency_WindowsAzureStoragePackageVersion>
<FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
<IdentityServer4PackageVersion>2.3.0-preview1-update2</IdentityServer4PackageVersion>

View File

@ -1,12 +1,10 @@
// 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.
// Sourced from https://github.com/dotnet/core-setup/tree/be8d8e3486b2bf598ed69d39b1629a24caaba45e/tools-local/tasks, needs to be kept in sync
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Microsoft.Extensions.DependencyModel;
@ -28,21 +26,22 @@ namespace RepoTasks
public string OutputPath { get; set; }
[Required]
public string FrameworkName { get; set; }
// When generating the .deps.json file, these files are used to replace "project" libraries with "packages".
public ITaskItem[] ResolvedPackageProjectReferences { get; set; }
public string[] PackagesToRemove { get; set; }
public string TargetFramework { get; set; }
[Required]
public string Runtime { get; set; }
public string FrameworkName { get; set; }
[Required]
public string FrameworkVersion { get; set; }
[Required]
public string BaseRuntimeIdentifier { get; set; }
public override bool Execute()
{
ExecuteCore();
return true;
return !Log.HasLoggedErrors;
}
private void ExecuteCore()
@ -61,23 +60,69 @@ namespace RepoTasks
var manager = new RuntimeGraphManager();
var graph = manager.Collect(lockFile);
var expandedGraph = manager.Expand(graph, Runtime);
var expandedGraph = manager.Expand(graph, BaseRuntimeIdentifier);
// Remove the runtime entry for the project which generates the original deps.json. For example, there is no Microsoft.AspNetCore.App.dll.
var trimmedRuntimeLibraries = RuntimeReference.RemoveSharedFxRuntimeEntry(context.RuntimeLibraries, FrameworkName);
var runtimeFiles = new List<RuntimeFile>();
var nativeFiles = new List<RuntimeFile>();
var resourceAssemblies = new List<ResourceAssembly>();
trimmedRuntimeLibraries = ResolveProjectsAsPackages(ResolvedPackageProjectReferences, trimmedRuntimeLibraries);
if (PackagesToRemove != null && PackagesToRemove.Any())
foreach (var library in context.RuntimeLibraries)
{
trimmedRuntimeLibraries = RuntimeReference.RemoveReferences(trimmedRuntimeLibraries, PackagesToRemove);
foreach (var file in library.RuntimeAssemblyGroups.SelectMany(g => g.RuntimeFiles))
{
var path = $"runtimes/{context.Target.Runtime}/lib/{TargetFramework}/{Path.GetFileName(file.Path)}";
runtimeFiles.Add(
new RuntimeFile(
path,
file.AssemblyVersion,
file.FileVersion));
}
foreach (var file in library.NativeLibraryGroups.SelectMany(g => g.RuntimeFiles))
{
var path = $"runtimes/{context.Target.Runtime}/native/{Path.GetFileName(file.Path)}";
nativeFiles.Add(
new RuntimeFile(
path,
file.AssemblyVersion,
file.FileVersion));
}
resourceAssemblies.AddRange(
library.ResourceAssemblies);
}
var runtimePackageName = $"runtime.{context.Target.Runtime}.{FrameworkName}";
var runtimeLibrary = new RuntimeLibrary("package",
runtimePackageName,
FrameworkVersion,
string.Empty,
new[] { new RuntimeAssetGroup(string.Empty, runtimeFiles) },
new[] { new RuntimeAssetGroup(string.Empty, nativeFiles) },
resourceAssemblies,
Array.Empty<Dependency>(),
hashPath: null,
path: $"{runtimePackageName.ToLowerInvariant()}/{FrameworkVersion}",
serviceable: true);
var targetingPackLibrary = new RuntimeLibrary("package",
FrameworkName,
FrameworkVersion,
string.Empty,
Array.Empty<RuntimeAssetGroup>(),
Array.Empty<RuntimeAssetGroup>(),
resourceAssemblies,
new[] { new Dependency(runtimeLibrary.Name, runtimeLibrary.Version) },
hashPath: null,
path: $"{FrameworkName.ToLowerInvariant()}/{FrameworkVersion}",
serviceable: true);
context = new DependencyContext(
context.Target,
CompilationOptions.Default,
Array.Empty<CompilationLibrary>(),
trimmedRuntimeLibraries,
new[] { targetingPackLibrary, runtimeLibrary },
expandedGraph
);
@ -86,43 +131,5 @@ namespace RepoTasks
new DependencyContextWriter().Write(context, depsStream);
}
}
private IEnumerable<RuntimeLibrary> ResolveProjectsAsPackages(ITaskItem[] resolvedProjects, IEnumerable<RuntimeLibrary> compilationLibraries)
{
var projects = resolvedProjects.ToDictionary(k => k.GetMetadata("PackageId"), k => k, StringComparer.OrdinalIgnoreCase);
foreach (var library in compilationLibraries)
{
if (projects.TryGetValue(library.Name, out var project))
{
Log.LogMessage("Replacing the library entry for {0}", library.Name);
var packagePath = project.ItemSpec;
var packageId = library.Name;
var version = library.Version;
string packageHash;
using (var sha512 = SHA512.Create())
{
packageHash = "sha512-" + sha512.ComputeHashAsBase64(File.OpenRead(packagePath), leaveStreamOpen: false);
}
yield return new RuntimeLibrary("package",
library.Name,
library.Version,
packageHash,
library.RuntimeAssemblyGroups,
library.NativeLibraryGroups,
library.ResourceAssemblies,
library.Dependencies,
serviceable: true,
path: $"{library.Name}/{library.Version}".ToLowerInvariant(),
hashPath: $"{library.Name}.{library.Version}.nupkg.sha512".ToLowerInvariant());
}
else
{
yield return library;
}
}
}
}
}

View File

@ -11,7 +11,6 @@
<UsingTask TaskName="RepoTasks.JoinItems" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.OrderBy" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.ProcessSharedFrameworkDeps" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.ResolveVersionRange" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.PublishToAzureBlob" AssemblyFile="$(_RepoTaskAssembly)" />
<!-- tools from dotnet-buildtools -->

View File

@ -1,68 +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 Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using NuGet.Versioning;
using RepoTasks.Utilities;
namespace RepoTasks
{
public class ResolveVersionRange : Task
{
[Required]
[Output]
public ITaskItem[] Items { get; set; }
[Required]
public string Version { get; set; }
[Required]
public string RangeType { get; set; }
// MSBuild doesn't allow binding to enums directly.
private enum VersionRangeType
{
Minimum, // [1.1.1, )
MajorMinor, // [1.1.1, 1.2.0)
}
public override bool Execute()
{
if (!Enum.TryParse<VersionRangeType>(RangeType, out var rangeType))
{
Log.LogError("Unexpected value {0} for RangeType", RangeType);
return false;
}
var versionRange = GetVersionRange(rangeType, Version);
foreach (var item in Items)
{
item.SetMetadata("_OriginalVersion", Version);
item.SetMetadata("Version", versionRange);
}
return !Log.HasLoggedErrors;
}
private string GetVersionRange(VersionRangeType rangeType, string packageVersion)
{
switch (rangeType)
{
case VersionRangeType.MajorMinor:
if (!NuGetVersion.TryParse(packageVersion, out var nugetVersion))
{
Log.LogError("Invalid NuGet version '{0}'", packageVersion);
return null;
}
return $"[{packageVersion}, {nugetVersion.Major}.{nugetVersion.Minor + 1}.0)";
case VersionRangeType.Minimum:
return packageVersion;
default:
throw new NotImplementedException();
}
}
}
}

View File

@ -7,7 +7,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.Extensions.DependencyModel;
using NuGet.Frameworks;
using NuGet.Packaging;
using NuGet.ProjectModel;
using NuGet.RuntimeModel;

View File

@ -1,86 +0,0 @@
// 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.
// Sourced from https://github.com/dotnet/core-setup/tree/be8d8e3486b2bf598ed69d39b1629a24caaba45e/tools-local/tasks, needs to be kept in sync
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyModel;
namespace RepoTasks.Utilities
{
internal class RuntimeReference
{
public static IEnumerable<RuntimeLibrary> RemoveSharedFxRuntimeEntry(IEnumerable<RuntimeLibrary> runtimeLibraries, string fxName)
{
foreach (var runtimeLib in runtimeLibraries)
{
if (string.Equals(runtimeLib.Name, fxName, StringComparison.OrdinalIgnoreCase))
{
yield return new RuntimeLibrary(runtimeLib.Type,
runtimeLib.Name,
runtimeLib.Version,
runtimeLib.Hash,
Array.Empty<RuntimeAssetGroup>(), // runtimeLib.RuntimeAssemblyGroups,
runtimeLib.NativeLibraryGroups,
runtimeLib.ResourceAssemblies,
runtimeLib.Dependencies,
runtimeLib.Serviceable);
}
else
{
yield return runtimeLib;
}
}
}
public static List<RuntimeLibrary> RemoveReferences(IEnumerable<RuntimeLibrary> runtimeLibraries, IEnumerable<string> packages)
{
List<RuntimeLibrary> result = new List<RuntimeLibrary>();
foreach (var runtimeLib in runtimeLibraries)
{
if (string.IsNullOrEmpty(packages.FirstOrDefault(elem => runtimeLib.Name.Equals(elem, StringComparison.OrdinalIgnoreCase))))
{
List<Dependency> toRemoveDependecy = new List<Dependency>();
foreach (var dependency in runtimeLib.Dependencies)
{
if (!string.IsNullOrEmpty(packages.FirstOrDefault(elem => dependency.Name.Equals(elem, StringComparison.OrdinalIgnoreCase))))
{
toRemoveDependecy.Add(dependency);
}
}
if (toRemoveDependecy.Count > 0)
{
List<Dependency> modifiedDependencies = new List<Dependency>();
foreach (var dependency in runtimeLib.Dependencies)
{
if (!toRemoveDependecy.Contains(dependency))
{
modifiedDependencies.Add(dependency);
}
}
result.Add(new RuntimeLibrary(runtimeLib.Type,
runtimeLib.Name,
runtimeLib.Version,
runtimeLib.Hash,
runtimeLib.RuntimeAssemblyGroups,
runtimeLib.NativeLibraryGroups,
runtimeLib.ResourceAssemblies,
modifiedDependencies,
runtimeLib.Serviceable));
}
else if (string.IsNullOrEmpty(packages.FirstOrDefault(elem => runtimeLib.Name.Equals(elem, StringComparison.OrdinalIgnoreCase))))
{
result.Add(runtimeLib);
}
}
}
return result;
}
}
}

View File

@ -1,36 +0,0 @@
<!--
This file defines properties for building a shared framework.
This targets file should only be imported by .shfxproj files.
-->
<Project>
<PropertyGroup>
<!-- shfxproj must be explicit about its dependencies. -->
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == ''">$(SharedFxRID)</RuntimeIdentifier>
<RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == ''">$(HostRid)</RuntimeIdentifier>
<SharedFxRid Condition="'$(SharedFxRid)' == ''">$(RuntimeIdentifier)</SharedFxRid>
<!-- Optimize the framework using the crossgen tool -->
<CrossgenOutput>true</CrossgenOutput>
<!-- Produce crossgen symbols when running the crossgen tool -->
<CrossgenSymbolsOutput>true</CrossgenSymbolsOutput>
<!-- Always generated, even though output type == Library -->
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<!-- Even though RuntimeIdentifier is set, shared framework projects are not self-contained projects -->
<SelfContained>false</SelfContained>
<!-- Don't add TFM to the project output path of shared framework projects -->
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<!-- The project representing the shared framework doesn't produce a .NET assembly or symbols -->
<DebugType>none</DebugType>
<CopyBuildOutputToPublishDirectory>false</CopyBuildOutputToPublishDirectory>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<IncludeMainProjectInDepsFile>false</IncludeMainProjectInDepsFile>
</PropertyGroup>
</Project>

View File

@ -5,12 +5,6 @@
<IsFrameworkMetapackage>true</IsFrameworkMetapackage>
</PropertyGroup>
<PropertyGroup Condition=" '$(MSBuildProjectExtension)' == '.pkgproj' ">
<IsPackable Condition=" '$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))' == 'pkg'">true</IsPackable>
<BaseIntermediateOutputPath>$(RepositoryRoot)obj\pkg\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
</PropertyGroup>
<!--
Currently, the shared framework builds by using PackageReference to internally generate the deps.json files and move bits between projects.
For local builds, this import is required to point to packages which actually exists. Run "build.cmd /t:GeneratePropsFiles /p:BuildNumber=xyz" to
@ -18,18 +12,4 @@
-->
<Import Condition="Exists('..\..\obj\dependencies.g.props') AND '$(DotNetPackageVersionPropsPath)' == ''" Project="..\..\obj\dependencies.g.props" />
<PropertyGroup Condition=" '$(MSBuildProjectExtension)' == '.shfxproj' ">
<OutputPath>$(RepositoryRoot)bin\fx\$(SharedFxRid)\$(MSBuildProjectName)\</OutputPath>
<BaseIntermediateOutputPath>$(RepositoryRoot)obj\fx\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
<CrossgenOutput Condition="'$(SharedFxRid)' == 'linux-arm'">false</CrossgenOutput>
<CrossgenSymbolsOutput Condition=" '$(CrossgenOutput)' == 'false' OR '$(SharedFxRid)' == 'osx-x64'">false</CrossgenSymbolsOutput>
<IncludeSymbols>true</IncludeSymbols>
<NuspecFile>$(MSBuildThisFileDirectory)runtime.fx.nuspec</NuspecFile>
<PackageTags>aspnetcore;shared-framework</PackageTags>
<!-- Workaround for invalid NU5109 error when packing on macOS. -->
<NoPackageAnalysis>true</NoPackageAnalysis>
</PropertyGroup>
</Project>

View File

@ -1,29 +0,0 @@
<Project>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.targets))\Directory.Build.targets" />
<Import Condition=" '$(MSBuildProjectExtension)' == '.pkgproj' " Project="Metapackage.targets" />
<Target Name="PopulateNuspec" BeforeTargets="GenerateNuspec" Condition=" '$(MSBuildProjectExtension)' == '.shfxproj' ">
<PropertyGroup>
<NuspecProperties>
id=$(PackageId);
version=$(PackageVersion);
authors=$(Authors);
rid=$(SharedFxRid);
description=$(PackageDescription);
tags=$(PackageTags.Replace(';', ' '));
licenseUrl=$(PackageLicenseUrl);
projectUrl=$(PackageProjectUrl);
iconUrl=$(PackageIconUrl);
repositoryUrl=$(RepositoryUrl);
repositoryCommit=$(RepositoryCommit);
copyright=$(Copyright);
targetFramework=$(TargetFramework);
symbolsAssets=$([MSBuild]::NormalizeDirectory($(SymbolsOutputPath)));
nativeAssets=$([MSBuild]::NormalizeDirectory($(NativeAssetsOutputPath)));
runtimeAssets=$([MSBuild]::NormalizeDirectory($(RuntimeAssetsOutputPath)));
</NuspecProperties>
</PropertyGroup>
</Target>
</Project>

View File

@ -1,51 +0,0 @@
<Project>
<PropertyGroup>
<!-- There is no build output -->
<IncludeBuildOutput>false</IncludeBuildOutput>
<!-- There are no symbols. -->
<IncludeSymbols>false</IncludeSymbols>
<!-- There is no API to check -->
<EnableApiCheck>false</EnableApiCheck>
<!-- Manually control dependencies -->
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<!-- The only build output of a pkgproj is the project -->
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>$(MSBuildProjectName)</PackageId>
<TargetPath>$(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg</TargetPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" PrivateAssets="All" Publish="false" />
</ItemGroup>
<ItemDefinitionGroup>
<TargetPathWithTargetPlatformMoniker>
<PackageId>$(PackageId)</PackageId>
</TargetPathWithTargetPlatformMoniker>
</ItemDefinitionGroup>
<Import Project="$(RepositoryRoot)build\tasks\RepoTasks.tasks" />
<Target Name="ResolveDependenciesToPackageReferences" BeforeTargets="CollectPackageReferences">
<Error Text="Missing version information for dependencies:%0A - @(Dependency, '%0A - ')" Condition=" '%(Dependency.Version)' == '' " />
<RepoTasks.ResolveVersionRange
Items="@(Dependency)"
Version="%(Version)"
RangeType="%(VersionRangeType)">
<Output TaskParameter="Items" ItemName="_CustomPackageReference" />
</RepoTasks.ResolveVersionRange>
<ItemGroup>
<PackageReference Include="@(_CustomPackageReference)">
<!-- Ensure that the metapackage does not exclude build or analyzer assets. -->
<PrivateAssets>None</PrivateAssets>
</PackageReference>
</ItemGroup>
</Target>
<Target Name="CopyFilesToOutputDirectory" />
<Target Name="CoreCompile" />
<Target Name="CreateManifestResourceNames" />
</Project>

View File

@ -125,7 +125,7 @@
<Dependency Include="Microsoft.Extensions.Primitives" Version="$(MicrosoftExtensionsPrimitivesPackageVersion)" />
<Dependency Include="Microsoft.Extensions.WebEncoders" Version="$(MicrosoftExtensionsWebEncodersPackageVersion)" />
<Dependency Include="Microsoft.Net.Http.Headers" Version="$(MicrosoftNetHttpHeadersPackageVersion)" />
<Dependency Include="System.IO.Pipelines" Version="$(SystemIOPipelinesPackageVersion)" VersionRangeType="Minimum" />
<Dependency Include="System.IO.Pipelines" Version="$(SystemIOPipelinesPackageVersion)" />
</ItemGroup>
</Project>

View File

@ -1,26 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PackageTags>aspnetcore</PackageTags>
<PackageDescription>Provides a default set of APIs for building an ASP.NET Core application.
This package requires the ASP.NET Core runtime. This runtime is installed by the .NET Core SDK, or can be acquired separately using installers available at https://aka.ms/dotnet-download.
</PackageDescription>
</PropertyGroup>
<ItemGroup>
<Content Include="build\$(TargetFramework)\*.props" PackagePath="%(Identity)" />
<Content Include="build\$(TargetFramework)\*.targets" PackagePath="%(Identity)" />
<Content Include="lib\$(TargetFramework)\_._" PackagePath="%(Identity)" />
</ItemGroup>
<ItemDefinitionGroup>
<Dependency>
<VersionRangeType>MajorMinor</VersionRangeType>
</Dependency>
</ItemDefinitionGroup>
<Import Project="..\Microsoft.AspNetCore.App.props" />
</Project>

View File

@ -1,21 +0,0 @@
<Project>
<!--
The _AspNetCoreAppSharedFxIsEnabled property is meant for internal use only. When set to 'false',
the default value of MicrosoftNETPlatformLibrary will be used. It was added to support
a better SDK exprience on platforms where the ASP.NET Core shared framework is not avaiable.
In these cases, ASP.NET Core can still be as if it were just a set of NuGet packages.
NB: this is _AspNetCore*App*SharedFxIsEnabled, not _AspNetCore*All*SharedFxIsEnabled
-->
<PropertyGroup>
<_AspNetCoreAppSharedFxIsEnabled Condition=" '$(_AspNetCoreAppSharedFxIsEnabled)' == '' ">true</_AspNetCoreAppSharedFxIsEnabled>
</PropertyGroup>
<!--
Capability that enables Visual Studio support for hosting Asp.Net Core applications in the IIS process
-->
<ItemGroup>
<ProjectCapability Include="AspNetCoreInProcessHosting" />
</ItemGroup>
</Project>

View File

@ -1,18 +0,0 @@
<Project>
<!--
This property instructs the .NET Core SDK to treat this package as the shared framework platform.
This affects how the SDK will trim references and publish output, determines how the runtimeconfig
files are generated, and may affect how optimizations are preformed by other tools.
NB: this is _AspNetCore*App*SharedFxIsEnabled, not _AspNetCore*All*SharedFxIsEnabled
-->
<PropertyGroup Condition=" '$(_AspNetCoreAppSharedFxIsEnabled)' == 'true' ">
<MicrosoftNETPlatformLibrary>Microsoft.AspNetCore.App</MicrosoftNETPlatformLibrary>
</PropertyGroup>
<Target Name="EnsureTFMCompatibility" BeforeTargets="_CheckForInvalidConfigurationAndPlatform">
<Error
Text="This version of Microsoft.AspNetCore.App is only compatible with the netcoreapp3.0 target framework. Please target netcoreapp3.0 or choose a version of Microsoft.AspNetCore.App compatible with $(TargetFramework)."
Condition="'$(TargetFramework)' != 'netcoreapp3.0'"/>
</Target>
</Project>

View File

@ -1,20 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<BaseSharedFrameworkName>Microsoft.NETCore.App</BaseSharedFrameworkName>
<RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
<!-- The runtime Package ID is for self-contained assets. -->
<PackageId>runtime.$(SharedFxRid).$(MSBuildProjectName)</PackageId>
<PackageDescription>This package provides assets used for self-contained deployments of an ASP.NET Core application. It is an internal implementation package not meant for direct consumption. Please do not reference directly.
$(MSBuildProjectName) provides a default set of APIs for building an ASP.NET Core application.
</PackageDescription>
</PropertyGroup>
<ItemGroup>
<PackageProjectReference Include="..\pkg\Microsoft.AspNetCore.App.pkgproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,72 @@
<Project>
<PropertyGroup>
<!-- There is no build output -->
<IncludeBuildOutput>false</IncludeBuildOutput>
<!-- There are no symbols. -->
<IncludeSymbols>false</IncludeSymbols>
<!-- There is no API to check -->
<EnableApiCheck>false</EnableApiCheck>
<!-- Manually control dependencies -->
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<!-- The only build output of a pkgproj is the project -->
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<!-- Do not include dependencies in the genreate nuspec. -->
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
<PackageId>$(MSBuildProjectName)</PackageId>
<TargetPath>$(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg</TargetPath>
</PropertyGroup>
<ItemGroup>
<Content Include="$(IntermediateOutputPath)\runtime.json" PackagePath="\" />
<PackageReference Include="Microsoft.NETCore.App">
<Version>$(MicrosoftNETCoreAppPackageVersion)</Version>
<PrivateAssets>All</PrivateAssets>
<AllowExplicitVersion>true</AllowExplicitVersion>
</PackageReference>
<PackageReference Include="@(Dependency)" />
</ItemGroup>
<ItemDefinitionGroup>
<TargetPathWithTargetPlatformMoniker>
<PackageId>$(PackageId)</PackageId>
</TargetPathWithTargetPlatformMoniker>
</ItemDefinitionGroup>
<Import Project="$(RepositoryRoot)build\tasks\RepoTasks.tasks" />
<Target Name="GenerateRuntimeJson" BeforeTargets="BeforeBuild">
<ItemGroup>
<_SupportedRids Include="$(SupportedRuntimeIdentifiers)" />
</ItemGroup>
<PropertyGroup>
<RuntimeJsonFileContent>
{
"runtimes": {
@(_SupportedRids->'"%(Identity)": { "$(PackageId)": { "runtime.%(Identity).$(PackageId)": "$(PackageVersion)" } }', ',%0A ')
}
}
</RuntimeJsonFileContent>
</PropertyGroup>
<WriteLinesToFile Lines="$(RuntimeJsonFileContent)" File="$(IntermediateOutputPath)\runtime.json" Overwrite="true" />
</Target>
<Target Name="ResolveReferenceItemsForPackage" DependsOnTargets="ResolveReferences" BeforeTargets="_GetPackageFiles">
<ItemGroup>
<Content Include="@(ReferencePath)" Condition="'%(ReferencePath.NuGetPackageId)' != 'Microsoft.NETCore.App'">
<PackagePath>ref/$(TargetFramework)/%(ReferencePath.FileName)%(ReferencePath.Extension)</PackagePath>
</Content>
</ItemGroup>
</Target>
<Target Name="CopyFilesToOutputDirectory" />
<Target Name="CoreCompile" DependsOnTargets="ResolveReferenceItemsForPackage" />
<Target Name="CreateManifestResourceNames" />
</Project>

View File

@ -0,0 +1,30 @@
<Project>
<PropertyGroup>
<BaseIntermediateOutputPath>$(RepositoryRoot)obj\pkg\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
<!-- Don't add TFM to the project output path of shared framework projects -->
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>true</IsPackable>
<PackageDescription>Provides a default set of APIs for building an ASP.NET Core application.
This package requires the ASP.NET Core runtime. This runtime is installed by the .NET Core SDK, or can be acquired separately using installers available at https://aka.ms/dotnet-download.
</PackageDescription>
</PropertyGroup>
<ItemGroup>
<Content Include="$(MSBuildProjectName).targets" PackagePath="build\$(TargetFramework)\" />
<Content Include="_._" PackagePath="lib\$(TargetFramework)\" />
</ItemGroup>
<Import Project="..\Microsoft.AspNetCore.App.props" />
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<Import Project="Metapackage.targets" />
</Project>

View File

@ -0,0 +1,7 @@
<Project>
<Target Name="EnsureTFMCompatibility" BeforeTargets="_CheckForInvalidConfigurationAndPlatform">
<Error
Text="This version of Microsoft.AspNetCore.App is only compatible with the netcoreapp3.0 target framework. Please target netcoreapp3.0 or choose a version of Microsoft.AspNetCore.App compatible with $(TargetFramework)."
Condition="'$(TargetFramework)' != 'netcoreapp3.0'"/>
</Target>
</Project>

View File

@ -0,0 +1,64 @@
<Project>
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<BaseSharedFrameworkName>Microsoft.NETCore.App</BaseSharedFrameworkName>
<RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
<OutputPath>$(RepositoryRoot)bin\fx\$(SharedFxRid)\$(MSBuildProjectName)\</OutputPath>
<BaseIntermediateOutputPath>$(RepositoryRoot)obj\fx\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
<!-- shfxproj must be explicit about its dependencies. -->
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == ''">$(SharedFxRID)</RuntimeIdentifier>
<RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == ''">$(HostRid)</RuntimeIdentifier>
<SharedFxRid Condition="'$(SharedFxRid)' == ''">$(RuntimeIdentifier)</SharedFxRid>
<!-- Optimize the framework using the crossgen tool -->
<CrossgenOutput>true</CrossgenOutput>
<!-- Produce crossgen symbols when running the crossgen tool -->
<CrossgenSymbolsOutput>true</CrossgenSymbolsOutput>
<CrossgenOutput Condition="'$(SharedFxRid)' == 'linux-arm'">false</CrossgenOutput>
<CrossgenSymbolsOutput Condition=" '$(CrossgenOutput)' == 'false' OR '$(SharedFxRid)' == 'osx-x64'">false</CrossgenSymbolsOutput>
<!-- Always generated, even though output type == Library -->
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<!-- Even though RuntimeIdentifier is set, shared framework projects are not self-contained projects -->
<SelfContained>false</SelfContained>
<!-- Don't add TFM to the project output path of shared framework projects -->
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<!-- The project representing the shared framework doesn't produce a .NET assembly or symbols -->
<DebugType>none</DebugType>
<CopyBuildOutputToPublishDirectory>false</CopyBuildOutputToPublishDirectory>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<IncludeMainProjectInDepsFile>false</IncludeMainProjectInDepsFile>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<!-- The runtime Package ID is for self-contained assets. -->
<PackageId>runtime.$(SharedFxRid).$(MSBuildProjectName)</PackageId>
<PackageDescription>This package provides assets used for self-contained deployments of an ASP.NET Core application. It is an internal implementation package not meant for direct consumption. Please do not reference directly.
$(MSBuildProjectName) provides a default set of APIs for building an ASP.NET Core application.
</PackageDescription>
<IncludeSymbols>true</IncludeSymbols>
<NuspecFile>$(MSBuildThisFileDirectory)runtime.fx.nuspec</NuspecFile>
<PackageTags>aspnetcore;shared-framework</PackageTags>
<!-- Workaround for invalid NU5109 error when packing on macOS. -->
<NoPackageAnalysis>true</NoPackageAnalysis>
</PropertyGroup>
<Import Project="..\Microsoft.AspNetCore.App.props" />
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<Import Project="SharedFx.targets" />
</Project>

View File

@ -4,7 +4,7 @@ This targets file should only be imported by .shfxproj files.
-->
<Project>
<Import Project="..\..\build\tasks\RepoTasks.tasks" />
<Import Project="$(RepositoryRoot)build\tasks\RepoTasks.tasks" />
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
@ -94,21 +94,14 @@ This targets file should only be imported by .shfxproj files.
<PublishDepsFilePath>$(IntermediateOutputPath)$(SharedFxName).publish.deps.json</PublishDepsFilePath>
<!-- The output path of generated files -->
<ProjectRuntimeConfigFilePath>$(MetadataOutputPath)$(SharedFxName).runtimeconfig.json</ProjectRuntimeConfigFilePath>
<PublishRuntimeConfigFilePath>$(MetadataOutputPath)$(SharedFxName).runtimeconfig.json</PublishRuntimeConfigFilePath>
<!-- The SDK renamed PublishRuntimeConfigFilePath to PublishRuntimeConfigFilePath, so set both to be safe. -->
<ProjectRuntimeConfigFilePath>$(PublishRuntimeConfigFilePath)</ProjectRuntimeConfigFilePath>
<SharedFxDepsFilePath>$(MetadataOutputPath)$(SharedFxName).deps.json</SharedFxDepsFilePath>
<VersionFileOutputPath>$(MetadataOutputPath).version</VersionFileOutputPath>
</PropertyGroup>
<ItemDefinitionGroup>
<!-- Defines different types of project references. -->
<FrameworkProjectReference>
<OutputItemType>_ResolvedFrameworkProjectReferencePaths</OutputItemType>
</FrameworkProjectReference>
<PackageProjectReference>
<OutputItemType>_ResolvedPackageProjectReferencePaths</OutputItemType>
</PackageProjectReference>
<TargetPathWithTargetPlatformMoniker>
<!--
This lists all folders of assets which should be collected into the same folder in a shared framework installer.
@ -129,7 +122,6 @@ This targets file should only be imported by .shfxproj files.
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.App" Version="$(RuntimeFrameworkVersion)">
<IsImplicitlyDefined>true</IsImplicitlyDefined>
<Publish>true</Publish>
<PrivateAssets>All</PrivateAssets>
<ExcludeAssets>Native</ExcludeAssets>
@ -138,10 +130,8 @@ This targets file should only be imported by .shfxproj files.
<PackageReference Include="@(Dependency)">
<IncludeAssets>Runtime;Native</IncludeAssets>
<Publish>true</Publish>
</PackageReference>
<ProjectReference Include="@(FrameworkProjectReference)" />
<ProjectReference Include="@(PackageProjectReference)" />
</ItemGroup>
<!-- Check some required properties before building a shared framework/ -->
@ -186,12 +176,12 @@ This targets file should only be imported by .shfxproj files.
Outputs="$(SharedFxDepsFilePath)">
<ProcessSharedFrameworkDeps
FrameworkName="$(SharedFxName)"
FrameworkVersion="$(SharedFxVersion)"
AssetsFilePath="$(ProjectAssetsFile)"
TargetFramework="$(TargetFramework)"
DepsFilePath="$(PublishDepsFilePath)"
OutputPath="$(SharedFxDepsFilePath)"
PackagesToRemove="@(_ResolvedFrameworkProjectReferencePaths->'%(PackageId)')"
ResolvedPackageProjectReferences="@(_ResolvedPackageProjectReferencePaths)"
Runtime="$(BaseSharedFxRid)" />
BaseRuntimeIdentifier="$(BaseSharedFxRid)" />
</Target>
<!-- Optimizes shared framework output -->
@ -274,7 +264,6 @@ This targets file should only be imported by .shfxproj files.
<_PlatformAssemblyPaths Remove="@(_PlatformAssemblyPaths)" />
<_PlatformAssemblyPaths Include="$(CrossGenToolDir)" />
<_PlatformAssemblyPaths Include="$(PublishDir)" />
<_PlatformAssemblyPaths Include="%(_ResolvedFrameworkProjectReferencePaths.RuntimeAssetsOutputPath)" Condition="'%(_ResolvedFrameworkProjectReferencePaths.RuntimeAssetsOutputPath)' != ''" />
</ItemGroup>
<PropertyGroup>
@ -360,4 +349,27 @@ This targets file should only be imported by .shfxproj files.
</ArtifactInfo>
</ItemGroup>
</Target>
<Target Name="PopulateNuspec" BeforeTargets="GenerateNuspec">
<PropertyGroup>
<NuspecProperties>
id=$(PackageId);
version=$(PackageVersion);
authors=$(Authors);
rid=$(SharedFxRid);
description=$(PackageDescription);
tags=$(PackageTags.Replace(';', ' '));
licenseUrl=$(PackageLicenseUrl);
projectUrl=$(PackageProjectUrl);
iconUrl=$(PackageIconUrl);
repositoryUrl=$(RepositoryUrl);
repositoryCommit=$(RepositoryCommit);
copyright=$(Copyright);
targetFramework=$(TargetFramework);
symbolsAssets=$([MSBuild]::NormalizeDirectory($(SymbolsOutputPath)));
nativeAssets=$([MSBuild]::NormalizeDirectory($(NativeAssetsOutputPath)));
runtimeAssets=$([MSBuild]::NormalizeDirectory($(RuntimeAssetsOutputPath)));
</NuspecProperties>
</PropertyGroup>
</Target>
</Project>

View File

@ -30,7 +30,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\**\*.shfxproj">
<ProjectReference Include="..\src\Microsoft.AspNetCore.App.shfxproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<OutputItemType>_ResolvedFrameworkReference</OutputItemType>
</ProjectReference>

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;
using Xunit;
@ -9,6 +10,13 @@ namespace Microsoft.AspNetCore
{
public class SharedFxTests
{
private readonly string _expectedTfm;
public SharedFxTests()
{
_expectedTfm = "netcoreapp" + TestData.GetPackageVersion().Substring(0, 3);
}
[Fact]
public void ItContainsValidRuntimeConfigFile()
{
@ -20,7 +28,7 @@ namespace Microsoft.AspNetCore
var runtimeConfig = JObject.Parse(File.ReadAllText(runtimeConfigFilePath));
Assert.Equal("Microsoft.NETCore.App", (string)runtimeConfig["runtimeOptions"]["framework"]["name"]);
Assert.Equal("netcoreapp" + TestData.GetPackageVersion().Substring(0, 3), (string)runtimeConfig["runtimeOptions"]["tfm"]);
Assert.Equal(_expectedTfm, (string)runtimeConfig["runtimeOptions"]["tfm"]);
Assert.Equal(TestData.GetMicrosoftNETCoreAppPackageVersion(), (string)runtimeConfig["runtimeOptions"]["framework"]["version"]);
}
@ -32,13 +40,13 @@ namespace Microsoft.AspNetCore
var rid = TestData.GetSharedFxRuntimeIdentifier();
var target = $".NETCoreApp,Version=v{TestData.GetPackageVersion().Substring(0, 3)}/{rid}";
var ridPackageId = $"runtime.{rid}.Microsoft.AspNetCore.App";
AssertEx.FileExists(depsFilePath);
var depsFile = JObject.Parse(File.ReadAllText(depsFilePath));
Assert.Equal(target, (string)depsFile["runtimeTarget"]["name"]);
Assert.NotNull(depsFile["targets"][target]);
Assert.NotNull(depsFile["compilationOptions"]);
Assert.Empty(depsFile["compilationOptions"]);
Assert.NotEmpty(depsFile["runtimes"][rid]);
@ -47,8 +55,41 @@ namespace Microsoft.AspNetCore
var prop = Assert.IsType<JProperty>(item);
var lib = Assert.IsType<JObject>(prop.Value);
Assert.Equal("package", lib["type"].Value<string>());
Assert.StartsWith("sha512-", lib["sha512"].Value<string>());
Assert.Empty(lib["sha512"].Value<string>());
});
Assert.NotNull(depsFile["libraries"][$"Microsoft.AspNetCore.App/{TestData.GetPackageVersion()}"]);
Assert.NotNull(depsFile["libraries"][$"runtime.{rid}.Microsoft.AspNetCore.App/{TestData.GetPackageVersion()}"]);
Assert.Equal(2, depsFile["libraries"].Values().Count());
var targetLibraries = depsFile["targets"][target];
Assert.Equal(2, targetLibraries.Values().Count());
var metapackage = targetLibraries[$"Microsoft.AspNetCore.App/{TestData.GetPackageVersion()}"];
Assert.Null(metapackage["runtime"]);
Assert.Null(metapackage["native"]);
var runtimeLibrary = targetLibraries[$"{ridPackageId}/{TestData.GetPackageVersion()}"];
Assert.Null(runtimeLibrary["dependencies"]);
Assert.All(runtimeLibrary["runtime"], item =>
{
var obj = Assert.IsType<JProperty>(item);
Assert.StartsWith($"runtimes/{rid}/lib/{_expectedTfm}/", obj.Name);
Assert.NotEmpty(obj.Value["assemblyVersion"].Value<string>());
Assert.NotEmpty(obj.Value["fileVersion"].Value<string>());
});
if (TestData.GetSharedFxRuntimeIdentifier().StartsWith("win"))
{
Assert.All(runtimeLibrary["native"], item =>
{
var obj = Assert.IsType<JProperty>(item);
Assert.StartsWith($"runtimes/{rid}/native/", obj.Name);
});
}
else
{
Assert.Null(runtimeLibrary["native"]);
}
}
[Fact]

View File

@ -16,7 +16,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Framework\**\*.shfxproj">
<ProjectReference Include="..\..\Framework\src\Microsoft.AspNetCore.App.shfxproj">
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<OutputItemType>_ResolvedFxProjects</OutputItemType>
</ProjectReference>

View File

@ -19,7 +19,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Framework\*\src\*.shfxproj">
<ProjectReference Include="..\..\Framework\src\Microsoft.AspNetCore.App.shfxproj">
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<OutputItemType>_ResolvedFxProjects</OutputItemType>
</ProjectReference>

View File

@ -40,7 +40,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Framework\**\Microsoft.AspNetCore.App.shfxproj">
<ProjectReference Include="..\..\Framework\src\Microsoft.AspNetCore.App.shfxproj">
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<OutputItemType>_ResolvedFxProjects</OutputItemType>
</ProjectReference>

View File

@ -25,7 +25,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Framework\**\Microsoft.AspNetCore.App.shfxproj">
<ProjectReference Include="..\..\Framework\src\Microsoft.AspNetCore.App.shfxproj">
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<OutputItemType>_ResolvedFxProjects</OutputItemType>
</ProjectReference>