From f9c72c25c1dacfa0a2e3c245296cd6ec2a83af08 Mon Sep 17 00:00:00 2001 From: Tomasz Heimowski Date: Thu, 9 Apr 2015 09:44:55 +0200 Subject: [PATCH 1/3] convert from nuget- read target framework from packages.config file - references #609 #759 --- src/Paket.Core/DependenciesFile.fs | 9 ++++---- src/Paket.Core/NugetConvert.fs | 35 ++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Paket.Core/DependenciesFile.fs b/src/Paket.Core/DependenciesFile.fs index 58fd0be82b..0e46590ae2 100644 --- a/src/Paket.Core/DependenciesFile.fs +++ b/src/Paket.Core/DependenciesFile.fs @@ -363,10 +363,11 @@ type DependenciesFile(fileName,options,sources,packages : PackageRequirement lis DependenciesFile(fileName,options,sources,newPackages,remoteFiles, comments) - static member add (dependenciesFile : DependenciesFile) (packageName,version) = - dependenciesFile.Add(packageName,version) + static member add (dependenciesFile : DependenciesFile) (packageName,version,installSettings) = + dependenciesFile.Add(packageName,version,installSettings) - member this.Add(packageName,version:string) = + member this.Add(packageName,version:string,?installSettings : InstallSettings) = + let installSettings = defaultArg installSettings InstallSettings.Default let (PackageName name) = packageName if this.HasPackage packageName then traceWarnfn "%s contains package %s already. ==> Ignored" fileName name @@ -376,7 +377,7 @@ type DependenciesFile(fileName,options,sources,packages : PackageRequirement lis tracefn "Adding %s to %s" name fileName else tracefn "Adding %s %s to %s" name version fileName - this.AddAdditionalPackage(packageName,version,InstallSettings.Default) + this.AddAdditionalPackage(packageName,version,installSettings) member this.Remove(packageName) = let (PackageName name) = packageName diff --git a/src/Paket.Core/NugetConvert.fs b/src/Paket.Core/NugetConvert.fs index f0b9367fc3..d34cb7732d 100644 --- a/src/Paket.Core/NugetConvert.fs +++ b/src/Paket.Core/NugetConvert.fs @@ -44,10 +44,16 @@ type CredsMigrationMode = /// Represents type of NuGet packages.config file type NugetPackagesConfigType = ProjectLevel | SolutionLevel +type NugetPackage = { + Id : string + Version : SemVerInfo + TargetFramework : string option +} + /// Represents NuGet packages.config file type NugetPackagesConfig = { File: FileInfo - Packages: (string*SemVerInfo) list + Packages: NugetPackage list Type: NugetPackagesConfigType } @@ -176,7 +182,9 @@ module NugetEnv = { File = file Type = if file.Directory.Name = ".nuget" then SolutionLevel else ProjectLevel Packages = [for node in doc.SelectNodes("//package") -> - node.Attributes.["id"].Value, node.Attributes.["version"].Value |> SemVer.Parse ]} + { Id = node.Attributes.["id"].Value + Version = node.Attributes.["version"].Value |> SemVer.Parse + TargetFramework = node |> getAttribute "targetFramework" } ]} |> ok with _ -> fail (NugetPackagesConfigParseError file) @@ -209,12 +217,12 @@ module ConvertResultR = PaketEnv = paketEnv SolutionFiles = solutionFiles } -let createPackageRequirement packageName version sources dependenciesFileName = +let createPackageRequirement (packageName, version, restrictions) sources dependenciesFileName = { Name = PackageName packageName VersionRequirement = VersionRequirement(VersionRange.Exactly version, PreReleaseStatus.No) Sources = sources ResolverStrategy = ResolverStrategy.Max - Settings = InstallSettings.Default + Settings = { InstallSettings.Default with FrameworkRestrictions = restrictions } //Requirements.parseRestrictions Parent = PackageRequirementSource.DependenciesFile dependenciesFileName } let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode = @@ -222,32 +230,35 @@ let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode = let dependenciesFileName = Path.Combine(rootDirectory.FullName, Constants.DependenciesFileName) let allVersions = + nugetEnv.NugetProjectFiles |> Seq.collect (fun (_,c) -> c.Packages) - |> Seq.groupBy fst - |> Seq.map (fun (name, packages) -> name, packages |> Seq.map snd |> Seq.distinct) + |> Seq.groupBy (fun p -> p.Id) + |> Seq.map (fun (name, packages) -> name, packages |> Seq.map (fun p -> p.Version, p.TargetFramework) |> Seq.distinctBy fst) |> 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 in different versions: %A. Paket will choose the latest one." name - (versions |> Seq.map string |> Seq.toList) + (versions |> Seq.map (fst >> string) |> Seq.toList) let latestVersions = allVersions - |> Seq.map (fun (name, versions) -> name, versions |> Seq.max |> string) + |> Seq.map (fun (name, versions) -> + let latestVersion, targetFramework = versions |> Seq.maxBy fst + name, string latestVersion, targetFramework |> Option.toList |> List.collect Requirements.parseRestrictions) |> Seq.toList let packages = match nugetEnv.NugetExe with - | Some _ -> ("Nuget.CommandLine","2.8.3") :: latestVersions + | Some _ -> ("Nuget.CommandLine","2.8.3",[]) :: latestVersions | _ -> latestVersions let read() = let addPackages dependenciesFile = packages - |> List.map (fun (name, v) -> PackageName name, v) + |> List.map (fun (name, v, restrictions) -> PackageName name, v, { InstallSettings.Default with FrameworkRestrictions = restrictions}) |> List.fold DependenciesFile.add dependenciesFile try DependenciesFile.ReadFromFile dependenciesFileName @@ -268,7 +279,7 @@ let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode = sources |> lift (fun sources -> - let packages = packages |> List.map (fun (name,v) -> createPackageRequirement name v sources dependenciesFileName) + let packages = packages |> List.map (fun (name,v,restr) -> createPackageRequirement (name, v, restr) sources dependenciesFileName) Paket.DependenciesFile(dependenciesFileName, InstallOptions.Default, sources, packages, [], [])) if File.Exists dependenciesFileName then read() else create() @@ -277,7 +288,7 @@ let convertPackagesConfigToReferences projectFileName packagesConfig = let referencesFile = ProjectFile.FindOrCreateReferencesFile(FileInfo projectFileName) packagesConfig.Packages - |> List.map (fst >> PackageName) + |> List.map ((fun p -> p.Id) >> PackageName) |> List.fold (fun (r : ReferencesFile) packageName -> r.AddNuGetReference(packageName)) referencesFile From 9636cd6149b02c80c2409cf46a28d4969850fc53 Mon Sep 17 00:00:00 2001 From: Tomasz Heimowski Date: Thu, 9 Apr 2015 10:55:59 +0200 Subject: [PATCH 2/3] remove comment --- src/Paket.Core/NugetConvert.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Paket.Core/NugetConvert.fs b/src/Paket.Core/NugetConvert.fs index d34cb7732d..6f7d33dd78 100644 --- a/src/Paket.Core/NugetConvert.fs +++ b/src/Paket.Core/NugetConvert.fs @@ -222,7 +222,7 @@ let createPackageRequirement (packageName, version, restrictions) sources depend VersionRequirement = VersionRequirement(VersionRange.Exactly version, PreReleaseStatus.No) Sources = sources ResolverStrategy = ResolverStrategy.Max - Settings = { InstallSettings.Default with FrameworkRestrictions = restrictions } //Requirements.parseRestrictions + Settings = { InstallSettings.Default with FrameworkRestrictions = restrictions } Parent = PackageRequirementSource.DependenciesFile dependenciesFileName } let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode = From d709311eab5edac4cab07e1ed4098957bc340692 Mon Sep 17 00:00:00 2001 From: Tomasz Heimowski Date: Thu, 9 Apr 2015 18:43:04 +0200 Subject: [PATCH 3/3] ignore targetFramework if multiple for the same package --- src/Paket.Core/NugetConvert.fs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Paket.Core/NugetConvert.fs b/src/Paket.Core/NugetConvert.fs index 6f7d33dd78..0c7e67a08f 100644 --- a/src/Paket.Core/NugetConvert.fs +++ b/src/Paket.Core/NugetConvert.fs @@ -234,20 +234,25 @@ let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode = 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.distinctBy fst) + |> Seq.map (fun (name, packages) -> name, packages |> Seq.map (fun p -> p.Version, p.TargetFramework) |> Seq.distinct) |> 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 in different versions: %A. Paket will choose the latest one." - name - (versions |> Seq.map (fst >> string) |> Seq.toList) + 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 latestVersions = allVersions |> Seq.map (fun (name, versions) -> - let latestVersion, targetFramework = versions |> Seq.maxBy fst - name, string latestVersion, targetFramework |> Option.toList |> List.collect Requirements.parseRestrictions) + let latestVersion, _ = versions |> Seq.maxBy fst + let restrictions = + match versions |> Seq.toList with + | [ version, targetFramework ] -> targetFramework |> Option.toList |> List.collect Requirements.parseRestrictions + | _ -> [] + name, string latestVersion, restrictions) |> Seq.toList let packages =