diff --git a/src/Paket.Core/NugetConvert.fs b/src/Paket.Core/NugetConvert.fs index 0c7e67a08f..ca114a7559 100644 --- a/src/Paket.Core/NugetConvert.fs +++ b/src/Paket.Core/NugetConvert.fs @@ -184,7 +184,8 @@ module NugetEnv = Packages = [for node in doc.SelectNodes("//package") -> { Id = node.Attributes.["id"].Value Version = node.Attributes.["version"].Value |> SemVer.Parse - TargetFramework = node |> getAttribute "targetFramework" } ]} + TargetFramework = + node |> getAttribute "targetFramework" |> Option.map (fun t -> ">= " + t) } ]} |> ok with _ -> fail (NugetPackagesConfigParseError file) @@ -228,24 +229,31 @@ let createPackageRequirement (packageName, version, restrictions) sources depend let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode = let dependenciesFileName = Path.Combine(rootDirectory.FullName, Constants.DependenciesFileName) - - let allVersions = + let allVersionsGroupped = nugetEnv.NugetProjectFiles |> Seq.collect (fun (_,c) -> c.Packages) |> Seq.groupBy (fun p -> p.Id) - |> Seq.map (fun (name, packages) -> name, packages |> Seq.map (fun p -> p.Version, p.TargetFramework) |> Seq.distinct) + + let findDistinctsPackages selector = + allVersionsGroupped + |> Seq.map (fun (name, packages) -> name, packages |> selector) |> Seq.sortBy (fun (name,_) -> name.ToLower()) - - for (name, versions) in allVersions do - if Seq.length versions > 1 - then traceWarnfn - "Package %s is referenced multiple times with different versions or target frameworks : %A. Paket will choose the latest version and disregard target framework." - name - (versions |> Seq.map string |> Seq.toList) + + let findWarnings searchBy message = + for (name, versions) in + findDistinctsPackages searchBy + do + if Seq.length versions > 1 + then traceWarnfn message name (versions |> Seq.toList) + + findWarnings (Seq.map (fun p -> p.Version) >> Seq.distinct >> Seq.map string) + "Package %s is referenced multiple times in different versions: %A. Paket will choose the latest one." + findWarnings (Seq.map (fun p -> p.TargetFramework) >> Seq.distinct >> Seq.choose(fun target -> target) >> Seq.map string) + "Package %s is referenced multiple times with different target frameworks : %A. Paket may disregard target framework." let latestVersions = - allVersions + findDistinctsPackages (Seq.map (fun p -> p.Version, p.TargetFramework) >> Seq.distinct) |> Seq.map (fun (name, versions) -> let latestVersion, _ = versions |> Seq.maxBy fst let restrictions =