protected override void ExecuteCore() { if (!WriteAdditionalProbingPathsToMainConfig) { // If we want to generate the runtimeconfig.dev.json file // and we have additional probing paths to add to it // BUT the runtimeconfigdevpath is empty, log a warning. if (GenerateRuntimeConfigDevFile && AdditionalProbingPaths?.Any() == true && string.IsNullOrEmpty(RuntimeConfigDevPath)) { Log.LogWarning(Strings.SkippingAdditionalProbingPaths); } } if (!string.IsNullOrEmpty(RollForward)) { if (!RollForwardValues.Any(v => string.Equals(RollForward, v, StringComparison.OrdinalIgnoreCase))) { Log.LogError(Strings.InvalidRollForwardValue, RollForward, string.Join(", ", RollForwardValues)); return; } } if (AssetsFilePath == null) { var isFrameworkDependent = LockFileExtensions.IsFrameworkDependent( RuntimeFrameworks, IsSelfContained, RuntimeIdentifier, string.IsNullOrWhiteSpace(PlatformLibraryName)); if (isFrameworkDependent != true) { throw new ArgumentException( $"{nameof(DependencyContextBuilder)} Does not support non FrameworkDependent without asset file. " + $"runtimeFrameworks: {string.Join(",", RuntimeFrameworks.Select(r => r.ItemSpec))} " + $"isSelfContained: {IsSelfContained} " + $"runtimeIdentifier: {RuntimeIdentifier} " + $"platformLibraryName: {PlatformLibraryName}"); } if (PlatformLibraryName != null) { throw new ArgumentException( "Does not support non null PlatformLibraryName(TFM < 3) without asset file."); } WriteRuntimeConfig( RuntimeFrameworks.Select(r => new ProjectContext.RuntimeFramework(r)).ToArray(), null, isFrameworkDependent: true, new List <LockFileItem>()); } else { LockFile lockFile = new LockFileCache(this).GetLockFile(AssetsFilePath); ProjectContext projectContext = lockFile.CreateProjectContext( TargetFramework, RuntimeIdentifier, PlatformLibraryName, RuntimeFrameworks, IsSelfContained); WriteRuntimeConfig(projectContext.RuntimeFrameworks, projectContext.PlatformLibrary, projectContext.IsFrameworkDependent, projectContext.LockFile.PackageFolders); if (GenerateRuntimeConfigDevFile && !string.IsNullOrEmpty(RuntimeConfigDevPath)) { WriteDevRuntimeConfig(projectContext.LockFile.PackageFolders); } } }
private void WriteDepsFile(string depsFilePath) { ProjectContext projectContext; if (AssetsFilePath == null) { projectContext = null; } else { LockFile lockFile = new LockFileCache(this).GetLockFile(AssetsFilePath); projectContext = lockFile.CreateProjectContext( NuGetUtils.ParseFrameworkName(TargetFramework), RuntimeIdentifier, PlatformLibraryName, RuntimeFrameworks, IsSelfContained); } CompilationOptions compilationOptions = CompilationOptionsConverter.ConvertFrom(CompilerOptions); SingleProjectInfo mainProject = SingleProjectInfo.Create( ProjectPath, AssemblyName, AssemblyExtension, AssemblyVersion, AssemblySatelliteAssemblies); var userRuntimeAssemblySet = new HashSet <string>(UserRuntimeAssemblies ?? Enumerable.Empty <string>(), StringComparer.OrdinalIgnoreCase); Func <ITaskItem, bool> isUserRuntimeAssembly = item => userRuntimeAssemblySet.Contains(item.ItemSpec); IEnumerable <ReferenceInfo> referenceAssemblyInfos = ReferenceInfo.CreateReferenceInfos(ReferenceAssemblies); // If there is a generated asset file. The projectContext will have project reference. // So remove it from directReferences to avoid duplication var projectContextHasProjectReferences = projectContext != null; IEnumerable <ReferenceInfo> directReferences = ReferenceInfo.CreateDirectReferenceInfos(ReferencePaths, ReferenceSatellitePaths, projectContextHasProjectReferences, isUserRuntimeAssembly); IEnumerable <ReferenceInfo> dependencyReferences = ReferenceInfo.CreateDependencyReferenceInfos(ReferenceDependencyPaths, ReferenceSatellitePaths, isUserRuntimeAssembly); Dictionary <string, SingleProjectInfo> referenceProjects = SingleProjectInfo.CreateProjectReferenceInfos(ReferencePaths, ReferenceSatellitePaths, isUserRuntimeAssembly); IEnumerable <RuntimePackAssetInfo> runtimePackAssets = IsSelfContained ? RuntimePackAssets.Select(item => RuntimePackAssetInfo.FromItem(item)) : Enumerable.Empty <RuntimePackAssetInfo>(); DependencyContextBuilder builder; if (projectContext != null) { // Generate the RID-fallback for self-contained builds. // // In order to support loading components with RID-specific assets, // the AssemblyDependencyResolver requires a RID fallback graph. // The component itself should not carry the RID fallback graph with it, because // it would need to carry graph of all the RIDs and needs updates for newer RIDs. // For framework dependent apps, the RID fallback graph comes from the core framework Microsoft.NETCore.App, // so there is no need to write it into the app. // If self-contained apps, the (applicable subset of) RID fallback graph needs to be written to the deps.json manifest. // // If a RID-graph is provided to the DependencyContextBuilder, it generates a RID-fallback // graph with respect to the target RuntimeIdentifier. RuntimeGraph runtimeGraph = IsSelfContained ? new RuntimeGraphCache(this).GetRuntimeGraph(RuntimeGraphPath) : null; builder = new DependencyContextBuilder(mainProject, IncludeRuntimeFileVersions, runtimeGraph, projectContext); } else { builder = new DependencyContextBuilder( mainProject, IncludeRuntimeFileVersions, RuntimeFrameworks, isSelfContained: IsSelfContained, platformLibraryName: PlatformLibraryName, runtimeIdentifier: RuntimeIdentifier, targetFramework: TargetFramework); } builder = builder .WithMainProjectInDepsFile(IncludeMainProject) .WithReferenceAssemblies(referenceAssemblyInfos) .WithDirectReferences(directReferences) .WithDependencyReferences(dependencyReferences) .WithReferenceProjectInfos(referenceProjects) .WithRuntimePackAssets(runtimePackAssets) .WithCompilationOptions(compilationOptions) .WithReferenceAssembliesPath(FrameworkReferenceResolver.GetDefaultReferenceAssembliesPath()) .WithPackagesThatWereFiltered(GetFilteredPackages()); if (CompileReferences.Length > 0) { builder = builder.WithCompileReferences(ReferenceInfo.CreateReferenceInfos(CompileReferences)); } var resolvedNuGetFiles = ResolvedNuGetFiles.Select(f => new ResolvedFile(f, false)) .Concat(ResolvedRuntimeTargetsFiles.Select(f => new ResolvedFile(f, true))); builder = builder.WithResolvedNuGetFiles(resolvedNuGetFiles); DependencyContext dependencyContext = builder.Build(); var writer = new DependencyContextWriter(); using (var fileStream = File.Create(depsFilePath)) { writer.Write(dependencyContext, fileStream); } _filesWritten.Add(new TaskItem(depsFilePath)); }