public override async Task InstallPackageAsync()

in tools/nuget2bazel/ProjectBazelManipulator.cs [137:188]


        public override async Task<bool> InstallPackageAsync(
            PackageIdentity packageIdentity,
            DownloadResourceResult downloadResourceResult,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            var dependency = new PackageDependency(packageIdentity.Id, new VersionRange(packageIdentity.Version));

            var json = await GetJsonAsync();
            json.dependencies.Add(packageIdentity.Id, packageIdentity.Version.ToString());
            await SaveJsonAsync(json);

            var packageReader = downloadResourceResult.PackageReader
                                ?? new PackageArchiveReader(downloadResourceResult.PackageStream, leaveStreamOpen: true);
            IAsyncPackageContentReader packageContentReader = packageReader;
            IAsyncPackageCoreReader packageCoreReader = packageReader;

            var libItemGroups = await packageContentReader.GetLibItemsAsync(token);
            var referenceItemGroups = await packageContentReader.GetReferenceItemsAsync(token);
            var frameworkReferenceGroups = await packageContentReader.GetFrameworkItemsAsync(token);
            var contentFileGroups = await packageContentReader.GetContentItemsAsync(token);
            var buildFileGroups = await packageContentReader.GetBuildItemsAsync(token);
            var toolItemGroups = await packageContentReader.GetToolItemsAsync(token);
            var depsGroups = await packageContentReader.GetPackageDependenciesAsync(token);

            // Very ugly hack to extract build folder and runtimes folder content
            // Unfortunately, the original implementation only returns .prop and .targets files.
            var readerBase = (PackageReaderBase)packageContentReader;
            var dynMethod = readerBase.GetType().BaseType.GetMethod("GetFileGroups", BindingFlags.NonPublic | BindingFlags.Instance);
            var allBuildFileGroups = (IEnumerable<FrameworkSpecificGroup>)dynMethod.Invoke(readerBase, new object?[] { "build" });
            var allRuntimes = (IEnumerable<FrameworkSpecificGroup>)dynMethod.Invoke(readerBase, new object?[] { "runtimes" });

            IEnumerable<FrameworkSpecificGroup> refItemGroups = null;

            if (packageReader is PackageArchiveReader reader)
                refItemGroups = await reader.GetItemsAsync(PackagingConstants.Folders.Ref, token);
            else if (packageReader is PackageFolderReader reader2)
                refItemGroups = await reader2.GetItemsAsync(PackagingConstants.Folders.Ref, token);

            var sha256 = "";
            if (!_skipSha256)
            {
                sha256 = GetSha(downloadResourceResult.PackageStream);
            }
            var entry = new WorkspaceEntry(json.dependencies, packageIdentity, sha256,
                depsGroups, libItemGroups, toolItemGroups, refItemGroups, allBuildFileGroups, allRuntimes, _mainFile, _variable, _nugetSourceCustom);

            _entries.Add(packageIdentity, entry);
            await AddEntry(entry);

            return await base.InstallPackageAsync(packageIdentity, downloadResourceResult, nuGetProjectContext, token);
        }