Logo Paket

Using Paket from F# Interactive

This page demonstrates how to use Paket from the F# Interactive.

Reference Paket.Core

As first step we need to reference Paket.Core, the library the Paket .NET tool is built on. It targets net10.0, so the script needs the F# Interactive of the .NET 10 SDK or later (dotnet fsi).

open System
open System.IO

Environment.CurrentDirectory <- __SOURCE_DIRECTORY__

#r "nuget: Paket.Core"

Configure which paket.dependencies file to use

Now we need open the Paket namespace and to tell Paket which paket.dependencies file to use.

open Paket

// Locate the paket.dependencies file.
let dependencies = Dependencies.Locate(__SOURCE_DIRECTORY__)
found: paket.dependencies

Adding and removing NuGet packages

Paket allows to install and uninstall NuGet packages programmatically:

// Install a package.
dependencies.Add "FSharp.Data"

// Check which version is installed.
dependencies.GetInstalledVersion "FSharp.Data"
val it : string option = Some "2.1.0"

// Remove a package.
dependencies.Remove "FSharp.Data"

// Check again which version is installed.
dependencies.GetInstalledVersion "FSharp.Data"
val it : string option = None

Query the install model

It's possible to do queries against the installed NuGet packages:

// Install some packages.
dependencies.Add "FSharp.Data"
dependencies.Add "FSharp.Formatting"
dependencies.Add "FsUnit"

// List all installed packages.
dependencies.GetInstalledPackages()
val it : (string * string * string) list =
  [("Main", "FSharp.Compiler.Service", "0.0.67"); ("Main", "FSharp.Data", "2.1.0");
   ("Main", "FSharp.Formatting", "2.4.36"); ("Main", "FsUnit", "1.3.0.1");
   ("Main", "Microsoft.AspNet.Razor", "2.0.30506.0"); ("Main", "NUnit", "2.6.3");
   ("Main", "RazorEngine", "3.3.0"); ("Main", "Zlib.Portable", "1.10.0")]

// List only the direct dependencies.
dependencies.GetDirectDependencies()
val it : (string * string * string) list =
  [("Main", "FSharp.Data", "2.1.0"); ("Main", "FSharp.Formatting", "2.4.36");
   ("Main", "FsUnit", "1.3.0.1")]

// List direct dependencies for the given package.
dependencies.GetDirectDependenciesForPackage(Domain.GroupName "Main", "FSharp.Compiler.Service")
val it : (string * string * string) list =
  ...

// List all usages of a package in Paket.
let paketDependencies = Dependencies.Locate(System.IO.Path.Combine(__SOURCE_DIRECTORY__,".."))
found: D:\code\Paket\paket.dependencies
paketDependencies.FindReferencesFor "UnionArgParser"
val it : string list = ["D:\code\Paket\src\Paket\Paket.fsproj"]
namespace System
namespace System.IO
type Environment = static member Exit: exitCode: int -> unit static member ExpandEnvironmentVariables: name: string -> string static member FailFast: message: string -> unit + 1 overload static member GetCommandLineArgs: unit -> string array static member GetEnvironmentVariable: variable: string -> string + 1 overload static member GetEnvironmentVariables: unit -> IDictionary + 1 overload static member GetFolderPath: folder: SpecialFolder -> string + 1 overload static member GetLogicalDrives: unit -> string array static member SetEnvironmentVariable: variable: string * value: string -> unit + 1 overload static member CommandLine: string ...
<summary>Provides information about, and means to manipulate, the current environment and platform. This class cannot be inherited.</summary>
property Environment.CurrentDirectory: string with get, set
<summary>Gets or sets the fully qualified path of the current working directory.</summary>
<exception cref="T:System.ArgumentException">Attempted to set to an empty string ("").</exception>
<exception cref="T:System.ArgumentNullException">Attempted to set to <see langword="null" />.</exception>
<exception cref="T:System.IO.IOException">An I/O error occurred.</exception>
<exception cref="T:System.IO.DirectoryNotFoundException">Attempted to set a local path that cannot be found.</exception>
<exception cref="T:System.Security.SecurityException">The caller does not have the appropriate permission.</exception>
<returns>The directory path.</returns>
namespace Paket
val dependencies: Dependencies
Multiple items
type Dependencies = new: dependenciesFileName: string -> Dependencies member Add: groupName: string option * package: string -> unit + 5 overloads member AddCredentials: source: string * username: string * password: string * authType: string -> unit + 1 overload member AddGit: groupName: string option * repository: string -> unit + 2 overloads member AddGithub: groupName: string option * repository: string * file: string -> unit + 2 overloads member AddToProject: groupName: string option * package: string * version: string * force: bool * withBindingRedirects: bool * cleanBindingRedirects: bool * createNewBindingFiles: bool * projectName: string * installAfter: bool * semVerUpdateMode: SemVerUpdateMode * touchAffectedRefs: bool -> unit + 2 overloads member AddToken: source: string * token: string -> unit member DownloadLatestBootstrapper: unit -> unit member FindOutdated: strict: bool * force: bool * includePrereleases: bool * groupName: Option<string> -> (string * string * SemVerInfo) list member FindProjectsFor: group: string * package: string -> ProjectFile list ...
<summary> Paket API which is optimized for F# Interactive use. </summary>

--------------------
new: dependenciesFileName: string -> Dependencies
static member Dependencies.Locate: unit -> Dependencies
static member Dependencies.Locate: path: string -> Dependencies
member Dependencies.Add: package: string -> unit
member Dependencies.Add: groupName: string option * package: string -> unit
member Dependencies.Add: groupName: string option * package: string * version: string -> unit
member Dependencies.Add: groupName: string option * package: string * version: string * force: bool * withBindingRedirects: bool * cleanBindingRedirects: bool * createNewBindingFiles: bool * interactive: bool * installAfter: bool * semVerUpdateMode: SemVerUpdateMode * touchAffectedRefs: bool -> unit
member Dependencies.Add: groupName: string option * package: string * version: string * force: bool * withBindingRedirects: bool * cleanBindingRedirects: bool * createNewBindingFiles: bool * interactive: bool * installAfter: bool * semVerUpdateMode: SemVerUpdateMode * touchAffectedRefs: bool * runResolver: bool -> unit
member Dependencies.Add: groupName: string option * package: string * version: string * force: bool * withBindingRedirects: bool * cleanBindingRedirects: bool * createNewBindingFiles: bool * interactive: bool * installAfter: bool * semVerUpdateMode: SemVerUpdateMode * touchAffectedRefs: bool * runResolver: bool * packageKind: Requirements.PackageRequirementKind -> unit
member Dependencies.GetInstalledVersion: packageName: string -> string option
member Dependencies.GetInstalledVersion: groupName: string option * packageName: string -> string option
member Dependencies.Remove: package: string -> unit
member Dependencies.Remove: groupName: string option * package: string -> unit
member Dependencies.Remove: groupName: string option * package: string * force: bool * interactive: bool * installAfter: bool -> unit
member Dependencies.GetInstalledPackages: unit -> (string * string * string) list
member Dependencies.GetInstalledPackages: referencesFile: ReferencesFile -> (string * string * string) list
member Dependencies.GetDirectDependencies: unit -> (string * string * string) list
member Dependencies.GetDirectDependencies: referencesFile: ReferencesFile -> (string * string * string) list
member Dependencies.GetDirectDependenciesForPackage: groupName: Domain.GroupName * packageName: string -> (string * string * string) list
module Domain from Paket
Multiple items
val GroupName: name: string -> Domain.GroupName
<summary> Function to convert a string into a group name </summary>

--------------------
union case Domain.GroupName.GroupName: name: string * compareString: string -> Domain.GroupName

--------------------
type GroupName = | GroupName of name: string * compareString: string interface IComparable override Equals: that: obj -> bool override GetHashCode: unit -> int override ToString: unit -> string member CompareString: string member Name: string
<summary> Represents a normalized group name </summary>
val paketDependencies: Dependencies
type Path = static member ChangeExtension: path: string * extension: string -> string static member Combine: path1: string * path2: string -> string + 4 overloads static member EndsInDirectorySeparator: path: ReadOnlySpan<char> -> bool + 1 overload static member Exists: path: string -> bool static member GetDirectoryName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileNameWithoutExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFullPath: path: string -> string + 1 overload static member GetInvalidFileNameChars: unit -> char array ...
<summary>Performs operations on <see cref="T:System.String" /> instances that contain file or directory path information. These operations are performed in a cross-platform manner.</summary>
Path.Combine(paths: ReadOnlySpan<string>) : string
Path.Combine( paths: string array) : string
Path.Combine(path1: string, path2: string) : string
Path.Combine(path1: string, path2: string, path3: string) : string
Path.Combine(path1: string, path2: string, path3: string, path4: string) : string
member Dependencies.FindReferencesFor: package: string -> string list
member Dependencies.FindReferencesFor: group: string * package: string -> string list

Type something to start searching.