Sitelet https://github.com/fsprojects/Paket/pull/760/files
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/Paket.Core/DependenciesFile.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
44 changes: 30 additions & 14 deletions src/Paket.Core/NugetConvert.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -209,45 +217,53 @@ 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 }
Parent = PackageRequirementSource.DependenciesFile dependenciesFileName }

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.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 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) -> name, versions |> Seq.max |> string)
|> Seq.map (fun (name, versions) ->
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 =
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
Expand All @@ -268,7 +284,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()
Expand All @@ -277,7 +293,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

Expand Down