Skip to content

Instantly share code, notes, and snippets.

@mavnn
Created June 6, 2013 11:19
Show Gist options
  • Select an option

  • Save mavnn/5720835 to your computer and use it in GitHub Desktop.

Select an option

Save mavnn/5720835 to your computer and use it in GitHub Desktop.
Don't try this at home! NuGet will hurt your brain.
let RemoveFilesFromProj packageInstallPath (package : IPackage) (project : IProjectSystem) (localRepo : IPackageRepository) =
let packagesConfig = "packages.config"
let otherPackages =
(XDocument.Parse <| project.OpenFile(packagesConfig).ReadToEnd())
.Descendants(XName.Get "package")
|> Seq.filter (fun p -> p.Attribute(XName.Get "id").Value <> package.Id)
|> Seq.map (fun p -> localRepo.FindPackage(p.Attribute(XName.Get "id").Value, new SemanticVersion(p.Attribute(XName.Get "version").Value), true, true))
let inUseByOtherPackages =
otherPackages
|> Seq.map (fun p -> getFiles project p)
|> Seq.reduce
(fun acc next ->
let a, f, c, b = acc
let a', f', c', b' = next
(Seq.append a a', Seq.append f f', Seq.append c c', Seq.append b b'))
|> fun (a, f, c, b) ->
Seq.distinctBy (fun (assembly : IPackageAssemblyReference) -> assembly.Name) a,
Seq.distinctBy (fun (frameworkRef : FrameworkAssemblyReference) -> frameworkRef.AssemblyName) f,
c
|> Seq.filter (fun (contentFile : IPackageFile) ->
not <| fileTransformers.ContainsKey(Path.GetExtension contentFile.EffectivePath))
|> Seq.distinctBy (fun contentFile -> contentFile.EffectivePath, contentFile.TargetFramework.Version),
Seq.distinctBy (fun (buildFile : IPackageFile) -> buildFile.EffectivePath, buildFile.TargetFramework.Version) b
let assemblyReferencesToDelete, frameworkReferencesToDelete, contentFilesToDelete, buildFilesToDelete =
let a, f, c, b = getFiles project package
let a', f', c', b' = inUseByOtherPackages
Seq.filter (fun (assembly : IPackageAssemblyReference) -> Seq.exists (fun (assembly' : IPackageAssemblyReference) -> assembly.Name = assembly'.Name) a' |> not) a,
Seq.filter (fun (assembly : FrameworkAssemblyReference) -> Seq.exists (fun (assembly' : FrameworkAssemblyReference) -> assembly.AssemblyName = assembly'.AssemblyName) f' |> not) f,
Seq.filter (
fun (contentFile : IPackageFile) ->
Seq.exists (
fun (contentFile' : IPackageFile) ->
(contentFile.EffectivePath, contentFile.TargetFramework.Version) = (contentFile'.EffectivePath, contentFile'.TargetFramework.Version)) c' |> not) c,
Seq.filter (
fun (buildFile : IPackageFile) ->
Seq.exists (
fun (buildFile' : IPackageFile) ->
(buildFile.EffectivePath, buildFile.TargetFramework.Version) = (buildFile'.EffectivePath, buildFile'.TargetFramework.Version)) b' |> not) b
project.DeleteFiles(contentFilesToDelete, otherPackages, fileTransformers)
assemblyReferencesToDelete |> Seq.iter (fun a -> project.RemoveReference(a.Name))
buildFilesToDelete
|> Seq.map (fun bf -> Path.Combine(packageInstallPath, bf.Path))
|> Seq.iter (fun fullPath -> project.RemoveImport(fullPath))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment