diff --git a/Paket.LoadingScripts/AssemblyInfo.fs b/Paket.LoadingScripts/AssemblyInfo.fs new file mode 100644 index 0000000000..6b396f3694 --- /dev/null +++ b/Paket.LoadingScripts/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace Paket.LoadingScripts.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/Paket.LoadingScripts/LoadingScriptsGenerator.fs b/Paket.LoadingScripts/LoadingScriptsGenerator.fs new file mode 100644 index 0000000000..4e0ef50968 --- /dev/null +++ b/Paket.LoadingScripts/LoadingScriptsGenerator.fs @@ -0,0 +1,275 @@ +namespace Paket.LoadingScripts + +open Paket +open Paket.Domain +open System.IO + +module LoadingScriptsGenerator = + + let getLeafPackagesGeneric getPackageName getDependencies (knownPackages:Set<_>) (openList) = + let leafPackages = + openList + |> List.filter (fun p -> + not (knownPackages.Contains(getPackageName p)) && + getDependencies p |> Seq.forall (knownPackages.Contains)) + let newKnownPackages = + leafPackages + |> Seq.fold (fun state package -> state |> Set.add (getPackageName package)) knownPackages + let newState = + openList + |> List.filter (fun p -> leafPackages |> Seq.forall (fun l -> getPackageName l <> getPackageName p)) + leafPackages, newKnownPackages, newState + + let getPackageOrderGeneric getPackageName getDependencies packages = + let rec step finalList knownPackages currentPackages = + match currentPackages |> getLeafPackagesGeneric getPackageName getDependencies knownPackages with + | ([], _, _) -> finalList + | (leafPackages, newKnownPackages, newState) -> + step (leafPackages @ finalList) newKnownPackages newState + step [] Set.empty packages + |> List.rev + + let getPackageOrderResolvedPackage = + getPackageOrderGeneric + (fun (p:PackageResolver.ResolvedPackage) -> p.Name) + (fun p -> p.Dependencies |> Seq.map (fun (n,_,_) -> n)) + + let getPackageOrderFromDependenciesFile (lockFile:FileInfo) = + let lockFile = LockFileParser.Parse (System.IO.File.ReadAllLines lockFile.FullName) + lockFile + |> Seq.map (fun p -> p.GroupName, getPackageOrderResolvedPackage p.Packages) + |> Map.ofSeq + + let testOrdering = + let testData = + [ { PackageResolver.ResolvedPackage.Name = PackageName("Test1") + PackageResolver.ResolvedPackage.Version = SemVer.Parse "1.0.0" + PackageResolver.ResolvedPackage.Dependencies = + Set.empty + |> Set.add( + PackageName("other"), + VersionRequirement(VersionRange.Specific (SemVer.Parse "1.0.0"), PreReleaseStatus.No), + Paket.Requirements.FrameworkRestrictions.AutoDetectFramework) + PackageResolver.ResolvedPackage.Unlisted = false + PackageResolver.ResolvedPackage.Settings = Requirements.InstallSettings.Default + PackageResolver.ResolvedPackage.Source = PackageSources.PackageSource.NuGetV2 { Url = ""; Authentication = None } } + { Name = PackageName("other") + Version = SemVer.Parse "1.0.0" + Dependencies = Set.empty + Unlisted = false + Settings = Requirements.InstallSettings.Default + Source = PackageSources.PackageSource.NuGetV2 { Url = ""; Authentication = None } } + ] + let result = + getPackageOrderResolvedPackage testData + |> List.map (fun p -> p.Name) + + System.Diagnostics.Debug.Assert( + result = + [ PackageName("other") + PackageName("Test1") + ] : bool) + + let result2 = + getPackageOrderResolvedPackage (testData |> List.rev) + |> List.map (fun p -> p.Name) + + System.Diagnostics.Debug.Assert( + result2 = + [ PackageName("other") + PackageName("Test1") + ] : bool) + + +module ScriptGeneratingModule = + open System.IO + open System.Collections.Generic + open Mono.Cecil + open QuickGraph + open System + + let private listOfFrameworks = [ + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V4_5 + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V4_Client + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V3_5 + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V2 + ] + + let tryFind key (dict: IDictionary<_,_>) = + match dict.TryGetValue(key) with + | true, v -> Some v + | _ -> None + let weightTargetProfiles possibleFrameworksInOrderOfPreference (profiles: Paket.TargetProfile list) = + + let relevantFrameworksWithPreferenceIndex = + possibleFrameworksInOrderOfPreference + |> Seq.mapi (fun i f -> f, i) + |> dict + + let profileWithAllFrameworks = + profiles + |> Seq.map (fun targetProfile -> + targetProfile, + match targetProfile with + | Paket.SinglePlatform platform -> [platform] + | Paket.PortableProfile (_, platforms) -> platforms + ) + |> Seq.map (fun (targetProfile, profiles) -> + targetProfile, + profiles + |> Seq.map (fun p -> p, tryFind p relevantFrameworksWithPreferenceIndex) + ) + + // we pick the first one for which the sum of prefered indexes is the lowest + let choices = + profileWithAllFrameworks + |> Seq.map (fun (targetProfile, selection) -> + let sum = + let selectionWithMatches = + selection + |> Seq.filter (snd >> Option.isSome) + if selectionWithMatches |> Seq.isEmpty then + Int32.MaxValue + else + selectionWithMatches + |> Seq.map (snd) + |> Seq.choose id + |> Seq.sum + targetProfile,sum + ) + |> Seq.filter (snd >> ((<>) Int32.MaxValue)) + choices + + let makeTargetPredicate frameworks = + fun (folders: Paket.LibFolder list) -> + folders + |> Seq.map (fun folder-> folder, weightTargetProfiles frameworks folder.Targets) + |> Seq.map (fun (folder, weightedTargetProfiles) -> + folder, weightedTargetProfiles |> Seq.sumBy snd + ) + |> Seq.sortBy snd + |> Seq.map fst + |> Seq.tryHead + + let getDllFilesWithinPackage (paketDependencies: Paket.Dependencies) (targetPredicate: _ -> Paket.LibFolder option) groupName packageName = + + let installModel = paketDependencies.GetInstalledPackageModel(groupName, packageName) + let libFolder = targetPredicate installModel.ReferenceFileFolders + + let references = + match libFolder with + | None -> Set.empty + | Some folder -> folder.Files.References + + let referenceByAssembly = + references + |> Seq.filter (fun f -> f.LibName.IsSome) + |> Seq.map (fun r -> (r.Path |> AssemblyDefinition.ReadAssembly), r) + |> dict + + let assemblyByName = + referenceByAssembly.Keys + |> Seq.map (fun a -> a.Name.ToString(), a) + |> dict + + let graph = AdjacencyGraph<_,_>() + + for r in referenceByAssembly do + let assembly = r.Key + let paketRef = referenceByAssembly.[assembly] + graph.AddVertex(paketRef) |> ignore + let references = assembly.MainModule.AssemblyReferences + printfn "%A" paketRef + references + |> Seq.map (fun a -> tryFind a.FullName assemblyByName) + |> Seq.choose id + |> Seq.map (fun a -> paketRef, referenceByAssembly.[a]) + |> Seq.iter (fun (fromRef, toRef) -> + graph.AddVertex(toRef) |> ignore + graph.AddEdge(Edge(fromRef, toRef)) |> ignore + ) + + let result = + let topologicalSort = Algorithms.TopologicalSort.TopologicalSortAlgorithm(graph) + topologicalSort.Compute() + topologicalSort.SortedVertices |> Seq.rev |> Seq.toArray + + result + + let getScriptName (package: PackageName) = sprintf "Include_%s.fsx" (package.GetCompareString()) + let generateFSharpScript dependenciesFile lockFile (packagesOrGroupFolder: DirectoryInfo) (knownIncludeScripts:Map) (package: PackageResolver.ResolvedPackage) = + let packageFolder = + Path.Combine (packagesOrGroupFolder.FullName, package.Name.GetCompareString()) + |> DirectoryInfo + + let scriptFile = Path.Combine (packageFolder.FullName, getScriptName package.Name) + let relScriptFile = Path.Combine (package.Name.GetCompareString(), getScriptName package.Name) + let depLines = + package.Dependencies + |> Seq.map (fun (depName,_,_) -> sprintf "#load \"../%s\"" ((knownIncludeScripts |> Map.find depName).Replace("\\", "/"))) + + let toRelative = (Path.GetFullPath >> (fun f -> f.Substring(packageFolder.FullName.Length + 1))) + + let dllFiles = + if package.Name.GetCompareString().ToLowerInvariant() = "fsharp.core" then + Seq.empty + else + let group = None + let references = getDllFilesWithinPackage dependenciesFile (makeTargetPredicate listOfFrameworks) group (package.Name.GetCompareString()) + references + |> Seq.map (fun r -> toRelative r.Path) + + let orderedDllFiles = + // TODO: Order by the inter-dependencies + // 1. Drop all unknown dependencies (they are either already resolved or we cannot do it anyway) + // 2. Use the algorithm above to sort. + dllFiles + |> Seq.sortBy (fun l -> l.Length) + + let dllLines = + orderedDllFiles + |> Seq.map (fun dll -> sprintf "#r \"%s\"" (dll.Replace("\\", "/"))) + + depLines + |> fun lines -> Seq.append lines dllLines + |> fun lines -> Seq.append lines [ sprintf "printfn \"%%s\" \"Loaded %s\"" (package.Name.GetCompareString()) ] + |> fun lines -> File.WriteAllLines (scriptFile, lines) + + knownIncludeScripts |> Map.add package.Name relScriptFile + + // Generate a fsharp script from the given order of packages, if a package is ordered before its dependencies this function will throw. + let generateFSharpScripts dependenciesFile lockFile packagesOrGroupFolder (orderedPackages: PackageResolver.ResolvedPackage list) = + orderedPackages + |> Seq.fold (fun (knownIncludeScripts) p -> + generateFSharpScript dependenciesFile lockFile packagesOrGroupFolder knownIncludeScripts p) Map.empty + |> ignore + + + // Generate a fsharp script from the given order of packages, if a package is ordered before its dependencies this function will throw. + let generateFSharpScriptsForRootFolder (rootFolder: DirectoryInfo) = + + let dependenciesFile, lockFile = + let deps = Paket.Dependencies.Locate(rootFolder.FullName) + let lock = + deps.DependenciesFile + |> Paket.DependenciesFile.ReadFromFile + |> fun f -> f.FindLockfile().FullName + |> Paket.LockFile.LoadFrom + deps, lock + + let dependencies = LoadingScriptsGenerator.getPackageOrderFromDependenciesFile (FileInfo(lockFile.FileName)) + + let packagesFolder = + Path.Combine(rootFolder.FullName, "packages") + |> DirectoryInfo + + dependencies + |> Map.map (fun groupName packages -> + let packagesOrGroupFolder = + match groupName.GetCompareString () with + | "main" -> packagesFolder + | groupName -> Path.Combine(packagesFolder.FullName, groupName) |> DirectoryInfo + generateFSharpScripts dependenciesFile lockFile packagesOrGroupFolder packages + ) + |> ignore + \ No newline at end of file diff --git a/Paket.LoadingScripts/Paket.LoadingScripts.fsproj b/Paket.LoadingScripts/Paket.LoadingScripts.fsproj new file mode 100644 index 0000000000..bfb862ffd6 --- /dev/null +++ b/Paket.LoadingScripts/Paket.LoadingScripts.fsproj @@ -0,0 +1,289 @@ + + + + + Debug + AnyCPU + 2.0 + e2677a2b-c2d9-4a28-9f7c-f93f3e2e7a7f + Library + Paket.LoadingScripts + Paket.LoadingScripts + v4.5 + 4.4.0.0 + true + Paket.LoadingScripts + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\Paket.LoadingScripts.XML + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\Paket.LoadingScripts.XML + + + + + + + + + + + + + + + + + + Paket.Core + {7bab0ae2-089f-4761-b138-a717aa2f86c5} + True + + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + + + + + ..\packages\Chessie\lib\net40\Chessie.dll + True + True + + + + + + + + + ..\packages\FSharp.Core\lib\net20\FSharp.Core.dll + True + True + + + + + + + ..\packages\FSharp.Core\lib\net40\FSharp.Core.dll + True + True + + + + + + + ..\packages\FSharp.Core\lib\portable-net45+netcore45\FSharp.Core.dll + True + True + + + + + + + ..\packages\FSharp.Core\lib\portable-net45+monoandroid10+monotouch10+xamarinios10\FSharp.Core.dll + True + True + + + + + + + ..\packages\FSharp.Core\lib\portable-net45+sl5+netcore45\FSharp.Core.dll + True + True + + + + + + + ..\packages\FSharp.Core\lib\portable-net45+netcore45+wp8\FSharp.Core.dll + True + True + + + + + + + ..\packages\FSharp.Core\lib\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll + True + True + + + + + + + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net35\Mono.Cecil.Mdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net35\Mono.Cecil.Pdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net35\Mono.Cecil.Rocks.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net35\Mono.Cecil.dll + True + True + + + + + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net20\Mono.Cecil.Mdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net20\Mono.Cecil.Pdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net20\Mono.Cecil.dll + True + True + + + + + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net40\Mono.Cecil.Mdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net40\Mono.Cecil.Pdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net40\Mono.Cecil.Rocks.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net40\Mono.Cecil.dll + True + True + + + + + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net45\Mono.Cecil.Mdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net45\Mono.Cecil.Pdb.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net45\Mono.Cecil.Rocks.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\net45\Mono.Cecil.dll + True + True + + + + + + + ..\packages\scriptbuilder\Mono.Cecil\lib\sl5\Mono.Cecil.Rocks.dll + True + True + + + ..\packages\scriptbuilder\Mono.Cecil\lib\sl5\Mono.Cecil.dll + True + True + + + + + + + + + ..\packages\scriptbuilder\QuickGraph\lib\net4\QuickGraph.Data.dll + True + True + + + ..\packages\scriptbuilder\QuickGraph\lib\net4\QuickGraph.Graphviz.dll + True + True + + + ..\packages\scriptbuilder\QuickGraph\lib\net4\QuickGraph.Serialization.dll + True + True + + + ..\packages\scriptbuilder\QuickGraph\lib\net4\QuickGraph.dll + True + True + + + + + \ No newline at end of file diff --git a/Paket.LoadingScripts/Script.fsx b/Paket.LoadingScripts/Script.fsx new file mode 100644 index 0000000000..bf9b5a8f74 --- /dev/null +++ b/Paket.LoadingScripts/Script.fsx @@ -0,0 +1,97 @@ +#load "Scripts/load-project-debug.fsx" +open System +open System.Collections.Generic +open System.IO +open System.Linq +open Mono.Cecil +open QuickGraph + +let dependenciesFile, lockFile = + let rootFolder = (@"C:\dev\src\g\fiddle3d") |> DirectoryInfo + //let rootFolder = (__SOURCE_DIRECTORY__) |> DirectoryInfo + let deps = Paket.Dependencies.Locate(rootFolder.FullName) + let lock = + deps.DependenciesFile + |> Paket.DependenciesFile.ReadFromFile + |> fun f -> f.FindLockfile().FullName + |> Paket.LockFile.LoadFrom + deps, lock + +Paket.LoadingScripts.ScriptGeneratingModule.generateFSharpScriptsForRootFolder ((@"C:\dev\src\g\fiddle3d") |> DirectoryInfo) + +(* +let tryFind = Paket.LoadingScripts.ScriptGeneratingModule.tryFind +let weightTargetProfiles = Paket.LoadingScripts.ScriptGeneratingModule.weightTargetProfiles +let makeTargetPredicate = Paket.LoadingScripts.ScriptGeneratingModule.makeTargetPredicate +let getDllFilesWithinPackage = Paket.LoadingScripts.ScriptGeneratingModule.getDllFilesWithinPackage + +let computePackageTopologyGraph (lockFile: Paket.LockFile) = + let lookup = Dictionary<_,_>() + for g in lockFile.Groups do + let groupName = g.Value.Name + let lookup = + let dict = Dictionary<_,_>() + lookup.[groupName] <- dict + dict + for r in g.Value.Resolution do + let package = r.Key + let deps = + lockFile.GetAllNormalizedDependenciesOf(groupName, package) + |> Seq.map snd + |> Seq.filter ((<>) package) + |> HashSet<_> + lookup.[package] <- deps + + [ + for group in lookup.Keys do + let depTree = lookup.[group] + for package in depTree.Keys do + let graph = new AdjacencyGraph<_,_>() + graph.AddVertex(package) |> ignore + depTree.[package] |> Seq.iter (graph.AddVertex >> ignore) + depTree.[package] |> Seq.iter (fun d -> graph.AddEdge(Edge<_>(package, d)) |> ignore) + let depsInOrder = + let sortAlgorithm = Algorithms.TopologicalSort.TopologicalSortAlgorithm<_,_>(graph) + sortAlgorithm.Compute() + sortAlgorithm.SortedVertices |> Seq.rev |> Seq.toArray + yield ((group, package), depsInOrder) + ] + |> dict + + +let frameworkIdentifiersInPreferenceOrder = + [ + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V4_5 + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V4_Client + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V3_5 + Paket.FrameworkIdentifier.DotNetFramework Paket.FrameworkVersion.V2 + ] + +let profiles = dependenciesFile.GetInstalledPackageModel(None, "Chessie") +for refFolder in profiles.ReferenceFileFolders do + printfn "%A" (weightTargetProfiles frameworkIdentifiersInPreferenceOrder refFolder.Targets) + +let targetPredicate = makeTargetPredicate frameworkIdentifiersInPreferenceOrder + +getDllFilesWithinPackage dependenciesFile targetPredicate None ("fspickler") + +let packagesGraph = computePackageTopologyGraph lockFile + +for (group, package) in packagesGraph.Keys do + + printfn "= %s %s =" (group.ToString()) (package.GetCompareString()) + try + let dlls = getDllFilesWithinPackage dependenciesFile targetPredicate (None) (package.ToString()) + for d in dlls do + printfn "\t-> %s" d.Path + with + | e -> printfn "\t ERROR: %s" (e.ToString()) + +let installModel = dependenciesFile.GetInstalledPackageModel(Some "main", "newtonsoft.json") + +for p in installModel.ReferenceFileFolders do + let folderName = p.Name + printfn "%s" folderName + for t in p.Targets do + printfn "\t-> %A" t +*) \ No newline at end of file diff --git a/Paket.LoadingScripts/Scripts/load-project-debug.fsx b/Paket.LoadingScripts/Scripts/load-project-debug.fsx new file mode 100644 index 0000000000..8690987d16 --- /dev/null +++ b/Paket.LoadingScripts/Scripts/load-project-debug.fsx @@ -0,0 +1,5 @@ +// Warning: generated file; your changes could be lost when a new file is generated. +#I __SOURCE_DIRECTORY__ +#load "load-references-debug.fsx" +#load "../AssemblyInfo.fs" + "../LoadingScriptsGenerator.fs" diff --git a/Paket.LoadingScripts/Scripts/load-references-debug.fsx b/Paket.LoadingScripts/Scripts/load-references-debug.fsx new file mode 100644 index 0000000000..bee2e7fe28 --- /dev/null +++ b/Paket.LoadingScripts/Scripts/load-references-debug.fsx @@ -0,0 +1,15 @@ +// Warning: generated file; your changes could be lost when a new file is generated. +#I __SOURCE_DIRECTORY__ +#r "../../packages/Chessie/lib/net40/Chessie.dll" +#r "../../bin/Paket.Core.dll" +#r "System.Core.dll" +#r "System.dll" +#r "System.Numerics.dll" +#r "../../packages/scriptbuilder/QuickGraph/lib/net4/QuickGraph.dll" +#r "../../packages/scriptbuilder/QuickGraph/lib/net4/QuickGraph.Data.dll" +#r "../../packages/scriptbuilder/QuickGraph/lib/net4/QuickGraph.Graphviz.dll" +#r "../../packages/scriptbuilder/QuickGraph/lib/net4/QuickGraph.Serialization.dll" +#r "../../packages/scriptbuilder/Mono.Cecil/lib/net45/Mono.Cecil.dll" +#r "../../packages/scriptbuilder/Mono.Cecil/lib/net45/Mono.Cecil.Mdb.dll" +#r "../../packages/scriptbuilder/Mono.Cecil/lib/net45/Mono.Cecil.Pdb.dll" +#r "../../packages/scriptbuilder/Mono.Cecil/lib/net45/Mono.Cecil.Rocks.dll" \ No newline at end of file diff --git a/Paket.LoadingScripts/paket.references b/Paket.LoadingScripts/paket.references new file mode 100644 index 0000000000..9c0de3c47e --- /dev/null +++ b/Paket.LoadingScripts/paket.references @@ -0,0 +1,6 @@ +Chessie +FSharp.Core + +group ScriptBuilder + QuickGraph + Mono.Cecil \ No newline at end of file diff --git a/Paket.sln b/Paket.sln index ba12ae45c3..09baf76fc9 100644 --- a/Paket.sln +++ b/Paket.sln @@ -82,6 +82,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Paket.Bootstrapper.Tests", EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Paket.IntegrationTests", "integrationtests\Paket.IntegrationTests\Paket.IntegrationTests.fsproj", "{7234B9B4-8CF5-4E68-AA29-050C087B9246}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Paket.LoadingScripts", "Paket.LoadingScripts\Paket.LoadingScripts.fsproj", "{E2677A2B-C2D9-4A28-9F7C-F93F3E2E7A7F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -112,6 +114,10 @@ Global {7234B9B4-8CF5-4E68-AA29-050C087B9246}.Debug|Any CPU.Build.0 = Debug|Any CPU {7234B9B4-8CF5-4E68-AA29-050C087B9246}.Release|Any CPU.ActiveCfg = Release|Any CPU {7234B9B4-8CF5-4E68-AA29-050C087B9246}.Release|Any CPU.Build.0 = Release|Any CPU + {E2677A2B-C2D9-4A28-9F7C-F93F3E2E7A7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2677A2B-C2D9-4A28-9F7C-F93F3E2E7A7F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2677A2B-C2D9-4A28-9F7C-F93F3E2E7A7F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2677A2B-C2D9-4A28-9F7C-F93F3E2E7A7F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/paket.dependencies b/paket.dependencies index b85b805425..0e5bc89b78 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -26,4 +26,8 @@ group Test nuget NUnit ~> 3 nuget Moq nuget FSCheck - github forki/FsUnit FsUnit.fs \ No newline at end of file + +group ScriptBuilder + source https://nuget.org/api/v2 + nuget QuickGraph + nuget Mono.Cecil diff --git a/paket.lock b/paket.lock index f303f830db..f3e86a5d97 100644 --- a/paket.lock +++ b/paket.lock @@ -33,6 +33,20 @@ GITHUB remote: fsharp/FAKE modules/Octokit/Octokit.fsx (3bf706bd6058733a1a034755741076b3953aaf09) Octokit +GROUP ScriptBuilder +NUGET + remote: https://www.nuget.org/api/v2 + specs: + Mono.Cecil (0.9.6.1) + QuickGraph (3.6.61119.7) + +GROUP ScriptBuilder +NUGET + remote: https://www.nuget.org/api/v2 + specs: + Mono.Cecil (0.9.6.1) + QuickGraph (3.6.61119.7) + GROUP Test NUGET remote: https://www.nuget.org/api/v2