UnMango.CliWrap.FSharp
0.0.6-alpha.0.8
See the version list below for details.
dotnet add package UnMango.CliWrap.FSharp --version 0.0.6-alpha.0.8
NuGet\Install-Package UnMango.CliWrap.FSharp -Version 0.0.6-alpha.0.8
<PackageReference Include="UnMango.CliWrap.FSharp" Version="0.0.6-alpha.0.8" />
paket add UnMango.CliWrap.FSharp --version 0.0.6-alpha.0.8
#r "nuget: UnMango.CliWrap.FSharp, 0.0.6-alpha.0.8"
// Install UnMango.CliWrap.FSharp as a Cake Addin #addin nuget:?package=UnMango.CliWrap.FSharp&version=0.0.6-alpha.0.8&prerelease // Install UnMango.CliWrap.FSharp as a Cake Tool #tool nuget:?package=UnMango.CliWrap.FSharp&version=0.0.6-alpha.0.8&prerelease
CliWrap.FSharp
Idiomatic F# support for CliWrap.
Install
- NuGet:
dotnet add package UnMango.CliWrap.FSharp
- GitHub Packages:
dotnet add package UnMango.CliWrap.FSharp -s github
Usage
Bindings for normal CliWrap commands are available in the Cli
module.
let main args = async {
let! result =
Cli.wrap "dotnet"
|> Cli.args [ "build" ]
|> Cli.workDir "~/src/CliWrap.FSharp"
|> Cli.exec
result.ExitCode
}
Cancellation token overloads are available in Cli.Tasks
.
let main args = task {
use cts = new CancellationTokenSource()
let! result =
Cli.wrap "dotnet"
|> Cli.args [ "build" ]
|> Cli.workDir "~/src/CliWrap.FSharp"
|> Cli.Task.exec cts.Token
result.ExitCode
}
let main args = task {
use graceful = new CancellationTokenSource()
use forceful = new CancellationTokenSource()
let! result =
Cli.wrap "dotnet"
|> Cli.args [ "build" ]
|> Cli.workDir "~/src/CliWrap.FSharp"
|> Cli.Task.execf forceful.Token graceful.Token
result.ExitCode
}
The core of the package is a simple computation expression that wraps CliWrap.Command
.
It attempts to mimic the builder pattern and .With*
style methods.
let main args =
let cmd = command "dotnet" {
args = [ "build" ]
workingDirectory = "~/src/CliWrap.FSharp"
}
cmd.ExecuteAsync()
The computation expression also supports executing the command with exec
.
let main args = task {
let! result = command "dotnet" {
args = [ "build" ]
workingDirectory = "~/src/CliWrap.FSharp"
exec
}
result.ExitCode
}
Cancellation is also supported.
let main args = task {
use cts = new CancellationTokenSource()
let! result = command "dotnet" {
args = [ "build" ]
workingDirectory = "~/src/CliWrap.FSharp"
exec cts.Token
}
result.ExitCode
}
CliWrap's buffered execution is supported with buffered
.
let main args = task {
use cts = new CancellationTokenSource()
let! result = command "dotnet" {
args = [ "build" ]
workingDirectory = "~/src/CliWrap.FSharp"
buffered Encoding.UTF8 cts.Token
}
result.ExitCode
}
Asynchrony with F#'s Async<'T>
is supported with async
.
let main args = async {
use cts = new CancellationTokenSource()
let! result = command "dotnet" {
args = [ "build" ]
workingDirectory = "~/src/CliWrap.FSharp"
async cts.Token
}
result.ExitCode
}
CliWrap's piping functionality is supported via the pipeline
computation expression.
let main args =
let cmd = pipeline {
"an inline string source"
Cli.wrap "echo"
}
cmd.ExecuteAsync()
Limited support for piping is available with |>>
.
let main args =
let cmd = Cli.wrap "yes" |>> Cli.wrap "echo"
cmd.ExecuteAsync()
Inspirations
The idea to abuse F# computation expressions was inspired by Akkling.Hocon and FsHttp.
Obviously CliWrap was a big inspiration for this package.
Q/A
Idiomatic? This looks nothing like the F# I write!
If something looks off please open an issue! I've only recently been diving further into the F# ecosystem.
Why not paket?
If renovate ever supports it!
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- CliWrap (>= 3.6.6)
- FSharp.Core (>= 8.0.200)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.