Skip to content

Instantly share code, notes, and snippets.

@ImaginaryDevelopment
Created April 7, 2023 17:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ImaginaryDevelopment/803880edf23786a11182f63635c57e36 to your computer and use it in GitHub Desktop.
Save ImaginaryDevelopment/803880edf23786a11182f63635c57e36 to your computer and use it in GitHub Desktop.
turn paket into nuget proj for dependabot
// target a paket.lock and generate a nuget packages.config
// may have to mate paket.lock with specific project files(paket.references), or generate a dummy project file
// consider paket.dependencies ?
// #r Paket.Core 7.2.1
let targetSlnRoot = @"C:\projects\safe"
// let lockFile = Path.Combine(targetSlnRoot, "paket.lock")
let depFile = Path.Combine(targetSlnRoot, "paket.dependencies")
let getPackageInfo (dep:Paket.Dependencies) =
let lfData = dep.GetLockFile()
lfData.InstalledPackages
//|> List.truncate 20
let _getPackageInfoByProject (dep:Paket.Dependencies) =
getPackageInfo dep
|> List.map(fun (gn, pn, semVer) ->
gn, pn, semVer, dep.FindReferencesFor(gn.Name, pn.Name)
)
|> List.groupBy(fun (_,_,_,projs) ->
projs
)
|> List.map(fun (g,x) ->
g, x |> List.map(fun (gn,pn,semVer,_) -> gn,pn,semVer)
)
let generateItemGroupItems indent (packages:(Paket.Domain.PackageName*Paket.SemVerInfo) list) =
packages
|> List.map(fun (pn,svi) ->
$"""{indent}<PackageReference Include="{pn.Name}" Version="{svi.AsString}" />"""
)
//let generateItemGroups (pi:Map<Paket.Domain.GroupName,Paket.Domain.PackageName*Paket.SemVerInfo>) =
()
let dep = Paket.Dependencies(depFile)
//dep.GetGroups()
// has Groups, and installed packages props
let generateProjFileText (sdk:string) (dep:Paket.Dependencies) =
let igi =
getPackageInfo dep
|> List.groupBy(fun (gn,_,_) ->
gn
)
|> List.map(fun (g,items) ->
g, items |> List.map(fun (_,pi,semVer) ->
pi,semVer
) |> generateItemGroupItems " "
)
let sb = StringBuilder()
let addLine (x:string) = sb.AppendLine x |> ignore<StringBuilder>
addLine """<?xml version="1.0" encoding="utf-8"?>"""
addLine $"""<Project Sdk="%s{sdk}">"""
igi
|> List.iter(fun (g,items) ->
addLine $""" <ItemGroup><!-- Group: {g.Name} -->"""
items
|> List.iter(fun x ->
addLine x
)
addLine " </ItemGroup>"
)
addLine "</Project>"
sb.ToString()
generateProjFileText "Microsoft.Net.Sdk" dep
|> Dump
|> ignore
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment