Skip to content

Commit 3bc9619

Browse files
generate-include-scripts: add generation of a single script for each group
1 parent 3a45243 commit 3bc9619

1 file changed

Lines changed: 54 additions & 2 deletions

File tree

‎src/Paket.Core/ScriptGeneration.fs‎

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,57 @@ module ScriptGeneration =
216216
None
217217
else
218218
Some (groupName.ToString())
219+
220+
let generateGroupScript
221+
(deps : Dependencies)
222+
(getScriptFile : GroupName -> FileInfo)
223+
(writeScript : FileInfo -> ScriptPiece seq -> unit)
224+
(framework : FrameworkIdentifier)
225+
=
226+
let all =
227+
seq {
228+
for group, nuget, _ in deps.GetInstalledPackages() do
229+
let model = deps.GetInstalledPackageModel(Some group, nuget)
230+
let libs = model.GetLibReferences(framework) |> Seq.map FileInfo
231+
let syslibs = model.GetFrameworkAssembliesLazy.Value
232+
yield group, (libs, syslibs |> Set.toSeq)
233+
}
234+
|> Seq.groupBy fst
235+
|> Seq.map (fun (group, items) -> group, items |> Seq.map snd)
236+
237+
for group, libs in all do
238+
let assemblies, frameworkLibs =
239+
Seq.foldBack (fun (l,r) (pl, pr) -> Seq.concat [pl ; l], Seq.concat [pr ; r]) libs (Seq.empty, Seq.empty)
240+
|> fun (l,r) -> Seq.distinct l, Seq.distinct r
241+
242+
let assemblies =
243+
let assemblyFilePerAssemblyDef =
244+
assemblies
245+
|> Seq.map (fun f -> f.FullName |> AssemblyDefinition.ReadAssembly, f)
246+
|> dict
247+
248+
assemblyFilePerAssemblyDef.Keys
249+
|> Seq.toList
250+
|> PackageAndAssemblyResolution.getDllOrder
251+
|> Seq.map (assemblyFilePerAssemblyDef.TryGetValue >> snd)
252+
253+
let scriptFile = getScriptFile (GroupName group)
254+
255+
[
256+
for a in frameworkLibs do
257+
yield ScriptPiece.ReferenceFrameworkAssembly a
258+
for a in assemblies do
259+
yield ScriptPiece.ReferenceAssemblyFile a
260+
yield ScriptPiece.PrintStatement (sprintf "Loaded group %s" group)
261+
]
262+
|> writeScript scriptFile
219263

220264
/// Generate a include script from given order of packages,
221265
/// if a package is ordered before its dependencies this function
222266
/// will throw.
223267
let generateScripts
224268
(scriptGenerator : ScriptGenInput -> ScriptGenResult)
225-
(writeScript : FileInfo -> ScriptPiece list -> unit)
269+
(writeScript : FileInfo -> ScriptPiece seq -> unit)
226270
(getScriptFile : GroupName -> PackageName -> FileInfo)
227271
(includeScriptsRootFolder : DirectoryInfo)
228272
(framework : FrameworkIdentifier)
@@ -279,7 +323,8 @@ module ScriptGeneration =
279323
let packagesFolder = DirectoryInfo(Path.Combine(rootFolder.FullName, Constants.PackagesFolderName))
280324

281325
let includeScriptsRootFolder =
282-
DirectoryInfo(Path.Combine((FileInfo dependenciesFile.DependenciesFile).Directory.FullName, Constants.PaketFilesFolderName, "include-scripts"))
326+
Path.Combine((FileInfo dependenciesFile.DependenciesFile).Directory.FullName, Constants.PaketFilesFolderName, "include-scripts")
327+
|> DirectoryInfo
283328

284329
let getScriptFile groupName packageName =
285330
getScriptFile includeScriptsRootFolder framework groupName packageName extension
@@ -296,6 +341,13 @@ module ScriptGeneration =
296341
)
297342
|> ignore
298343

344+
let getGroupFile group =
345+
let folder = getScriptFolder includeScriptsRootFolder framework group
346+
Path.Combine(folder.FullName, sprintf "include.%s.group.%s" (group.GetCompareString()) extension).ToLowerInvariant()
347+
|> FileInfo
348+
349+
generateGroupScript dependenciesFile getGroupFile scriptWriter framework
350+
299351
type ScriptType =
300352
| CSharp
301353
| FSharp

0 commit comments

Comments
 (0)