コード例 #1
0
        private Tuple <SemanticVersion, string> ResolveAssembly(DllReference parentAssembly, AssemblyReference assemblyDependency)
        {
            var assemblies            = _assemblyCacheService.Assemblies;
            var conflictingAssemblies = _assemblyCacheService.ConflictingAssemblies;

            //RULE 1. It's an assembly that is known on nuget.org or other. Official or Snapshot doesn't matter
            if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyUsingOfficialRepository)
            {
                var nugetPackage = _mappingService.GetNuGetPackage(_assemblyCacheService, assemblyDependency);
                if (nugetPackage != null)
                {
                    Trace.TraceInformation($"{assemblyDependency.Item2}-{assemblyDependency.Item1} found in official repository as {nugetPackage.Item2}-{nugetPackage.Item1}");
                    return(nugetPackage);
                }
            }

            //RULE 2. The reference is not known but it match with at least one dll present on local folder
            var resolvedAssembly = new Tuple <SemanticVersion, string>(new SemanticVersion(assemblyDependency.Item1), assemblyDependency.Item2);

            if (_assemblyCacheService.Assemblies.ContainsKey(resolvedAssembly) &&
                conflictingAssemblies[assemblyDependency].Count(_ => string.IsNullOrEmpty(_.SpecialVersion)) == 1)
            {
                Trace.TraceInformation($"{assemblyDependency.Item2}-{assemblyDependency.Item1} found at {assemblies[resolvedAssembly].Path}");
                return(assemblies[resolvedAssembly].Id);
            }

            if (conflictingAssemblies.ContainsKey(assemblyDependency) &&
                conflictingAssemblies[assemblyDependency].Count(_ => string.IsNullOrEmpty(_.SpecialVersion)) > 1 &&
                _resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringMultipleAssembliesWithSameVersion)
            {
                // there might be more than one dll with the expected version...Try to find the best one...
                resolvedAssembly = RetrieveConflictingDependancyFromCacheOrResolve(assemblies, parentAssembly, conflictingAssemblies[assemblyDependency], assemblyDependency);
            }


            // RULE 3. Let's try to find if there is a snapshot or a equivalent Version (build number mistmatch only)
            if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringBuildNumber)
            {
                var resolvedpackage = CompatibleBuild(assemblyDependency, assemblies, resolvedAssembly);
                if (resolvedpackage != null)
                {
                    return(resolvedpackage);
                }
            }


            // RULE 4. Let's try to find if there is Higher Version (Patch & Build only) and take it only if there is only one possibility
            if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringPatchAndBuildNumber)
            {
                var resolvedpackage = ComptiblePathAndBuild(assemblyDependency, assemblies, resolvedAssembly);
                if (resolvedpackage != null)
                {
                    return(resolvedpackage);
                }
            }

            Trace.TraceError($"Unable to find dependency {assemblyDependency.Item2}, {assemblyDependency.Item1}");
            if (_useCache)
            {
                _dependencies.AddUnresolvedDependencies(assemblyDependency);
            }

            return(null);
        }