private async Task <List <ProjectDependency> > ResolveAssemblyReferencesAsync(ILogger logger, CancellationToken cancellationToken) { ThrowOnDisposed(); cancellationToken.ThrowIfCancellationRequested(); var assemblyDependencies = new List <ProjectDependency>(); using (var safeLogger = await SafeLogger.WriteStartOperationAsync(logger, $"Resolving assembly references for {this.TargetFramework} target framework ...").ConfigureAwait(false)) { await ResolveProperyValuesAsync(new string[] { "OutputPath", "TargetPath" }, logger, cancellationToken).ConfigureAwait(false); var outputPath = this._resolvedProperties["OutputPath"]; if (!Path.IsPathRooted(outputPath)) { outputPath = Path.Combine(this.DirectoryPath, outputPath.Trim(new char[] { '\"' })); } var depsFile = this.GlobalProperties.TryGetValue("Configuration", out var activeConfiguration) && !string.IsNullOrWhiteSpace(activeConfiguration) ? Path.Combine(outputPath, $"{Path.GetFileNameWithoutExtension(this.FileName)}.deps.json") : await ResolveDepsFilePathFromBuildConfigAsync(outputPath, logger, cancellationToken).ConfigureAwait(false); if (File.Exists(depsFile)) { await AsyncHelper.RunAsync(async() => { try { DependencyContext depContext = null; using (var stream = File.OpenRead(depsFile)) { depContext = new DependencyContextJsonReader().Read(stream); } var targetLib = Path.GetFileName(this._resolvedProperties["TargetPath"].Trim('\"')); if (string.IsNullOrEmpty(targetLib)) { targetLib = $"{Path.ChangeExtension(this.FileName, ".dll")}"; } foreach (var rtLib in depContext.RuntimeLibraries.Where(l => l.NativeLibraryGroups.Count == 0)) { ProjectDependency dependency = null; switch (rtLib.Type) { case "project": case "reference": foreach (var assemblyGroup in rtLib.RuntimeAssemblyGroups) { foreach (var assetPath in assemblyGroup.AssetPaths) { if (!Path.GetFileName(assetPath).Equals(targetLib, RuntimeEnvironmentHelper.FileStringComparison)) { dependency = ProjectDependency.FromAssembly(Path.Combine(outputPath, assetPath)); if (File.Exists(dependency.FullPath) && !assemblyDependencies.Contains(dependency)) { assemblyDependencies.Add(dependency); } } } } break; //case "package": default: break; } } } catch (Exception ex) { if (Utils.IsFatalOrUnexpected(ex)) { throw; } await safeLogger.WriteWarningAsync(ex.Message, logToUI: false).ConfigureAwait(false); } }, cancellationToken).ConfigureAwait(false); assemblyDependencies.Sort(); } else { await safeLogger.WriteWarningAsync("Deps file not found (project not built), unable to resolve assembly/project dependencies!", logToUI : false).ConfigureAwait(false); } await safeLogger.WriteMessageAsync($"Assembly reference count: {assemblyDependencies.Count}", logToUI : false).ConfigureAwait(false); } return(assemblyDependencies); }
private async Task <List <ProjectDependency> > ResolvePackageReferencesAsync(ILogger logger, CancellationToken cancellationToken) { ThrowOnDisposed(); cancellationToken.ThrowIfCancellationRequested(); var packageDependencies = new List <ProjectDependency>(); using (var safeLogger = await SafeLogger.WriteStartOperationAsync(logger, "Resolving package references ...").ConfigureAwait(false)) { await AsyncHelper.RunAsync(async() => { try { var assetsFile = new FileInfo(Path.Combine(this.DirectoryPath, "obj", "project.assets.json")).FullName; if (File.Exists(assetsFile)) { LockFile lockFile = LockFileUtilities.GetLockFile(assetsFile, logger as NuGet.Common.ILogger); if (lockFile != null) { if (lockFile.Targets.Count == 1) { foreach (var lib in lockFile.Targets[0].Libraries) { bool isPackage = StringComparer.OrdinalIgnoreCase.Compare(lib.Type, "package") == 0; if (isPackage) { foreach (var compiletimeAssembly in lib.CompileTimeAssemblies) { if (Path.GetExtension(compiletimeAssembly.Path) == ".dll") { var dependency = ProjectDependency.FromPackage(Path.GetFileNameWithoutExtension(compiletimeAssembly.Path), lib.Name, lib.Version.ToNormalizedString()); var itemIdx = packageDependencies.IndexOf(dependency); if (itemIdx == -1) { packageDependencies.Add(dependency); } else if (dependency.IsFramework) { // packages can be described individually and/or as part of a platform metapackage in the lock file; for instance: Microsoft.CSharp is a package that is part of Microsoft.NetCore. packageDependencies[itemIdx] = dependency; } } } } } packageDependencies.Sort(); } else { await safeLogger.WriteWarningAsync(Shared.Resources.WarningMultiFxOrNoSupportedDnxVersion, logToUI: true).ConfigureAwait(false); } } else { await safeLogger.WriteWarningAsync(Shared.Resources.WarningCannotResolveProjectReferences, logToUI: true).ConfigureAwait(false); } } } catch (Exception ex) { if (Utils.IsFatalOrUnexpected(ex)) { throw; } await safeLogger.WriteWarningAsync(ex.Message, logToUI: false).ConfigureAwait(false); } }, cancellationToken).ConfigureAwait(false); await safeLogger.WriteMessageAsync($"Package reference count: {packageDependencies.Count}", logToUI : false).ConfigureAwait(false); } return(packageDependencies); }