Fli 1.111.10
dotnet add package Fli --version 1.111.10
NuGet\Install-Package Fli -Version 1.111.10
<PackageReference Include="Fli" Version="1.111.10" />
paket add Fli --version 1.111.10
#r "nuget: Fli, 1.111.10"
// Install Fli as a Cake Addin #addin nuget:?package=Fli&version=1.111.10 // Install Fli as a Cake Tool #tool nuget:?package=Fli&version=1.111.10
Fli
<img align="right" width="100" src="https://raw.githubusercontent.com/CaptnCodr/Fli/main/logo.png">
在 F# 代码中执行 CLI 命令,以 F# 风格执行!
Fli 是 2022 年 F# Advent Calendar 的一部分: 关于 Fli 的一个小故事
特性
- 轻松启动进程
- 在您最喜欢的 shell 中执行 CLI 命令
- F# 计算表达式语法
- 包装认证 CLI 工具
- 无外部依赖
安装
从 Nuget 获取: dotnet add package Fli
用法
open Fli 并开始
例如
cli {
Shell CMD
Command "echo Hello World!"
}
|> Command.execute
它以 Shell 启动 CMD.exe,其中 echo Hello World! 是要执行的命令。
从特定目录使用 PowerShell 运行文件
cli {
Shell PWSH
Command "test.bat"
WorkingDirectory (Environment.GetFolderPath Environment.SpecialFolder.UserProfile)
}
|> Command.execute
使用参数执行程序
cli {
Exec "path/to/executable"
Arguments "--info"
}
|> Command.execute
以下是一个使用 git 的例子
cli {
Exec "git"
Arguments ["commit"; "-m"; "Fixing issue #1337."]
}
|> Command.execute
向执行程序添加动词
cli {
Exec "adobe.exe"
Arguments (Path.Combine ((Environment.GetFolderPath Environment.SpecialFolder.UserProfile), "test.pdf"))
Verb "open"
}
|> Command.execute
或在默认/指定的程序中打开文件
cli {
Exec "test.pdf"
}
|> Command.execute
(提示:如果未将文件扩展名分配给任何已安装程序,则会抛出 System.NullReferenceException)
将输出写入特定文件
cli {
Exec "dotnet"
Arguments "--list-sdks"
Output @"absolute\path\to\dotnet-sdks.txt"
}
|> Command.execute
将输出写入函数(日志记录、打印等)
let log (output: string) = Debug.Log($"CLI log: {output}")
cli {
Exec "dotnet"
Arguments "--list-sdks"
Output log
}
|> Command.execute
为执行程序添加环境变量
cli {
Exec "git"
EnvironmentVariables [("GIT_AUTHOR_NAME", "Jon Doe"); ("GIT_AUTHOR_EMAIL", "jon.doe@domain.com")]
Output ""
}
|> Command.execute
提示: Output "" 将被忽略。这在条件情况下很有用,例如: Output (if true then logFilePath else "")。
向程序添加凭据
cli {
Exec "program"
Credentials ("domain", "bobk", "password123")
}
|> Command.execute
提示:所有平台都支持以不同用户身份运行进程。其他选项(域名、密码)仅在 Windows 上可用。对于非 Windows 系统的替代方案有:
cli {
Exec "path/to/program"
Username "admin"
}
|> Command.execute
对于 Windows 应用程序,可以设置它们的可见性。有四个可能的值:隐藏、最大化、最小化和正常。默认值是 隐藏。
cli {
Exec @"C:\Windows\regedit.exe"
WindowStyle Normal
}
|> Command.execute
Command.execute
Command.execute 返回记录:type Output = { Id: int; Text: string option; ExitCode: int; Error: string option } 其中包含获取单个值的获取器方法
toId: Output -> int
toText: Output -> string
toExitCode: Output -> int
toError: Output -> string
示例
cli {
Shell CMD
Command "echo Hello World!"
}
|> Command.execute // { Id = 123; Text = Some "Hello World!"; ExitCode = 0; Error = None }
|> Output.toText // "Hello World!"
// same with Output.toId:
cli { ... }
|> Command.execute // { Id = 123; Text = Some "Hello World!"; ExitCode = 0; Error = None }
|> Output.toId // 123
// same with Output.toExitCode:
cli { ... }
|> Command.execute // { Id = 123; Text = Some "Hello World!"; ExitCode = 0; Error = None }
|> Output.toExitCode // 0
// in case of an error:
cli { ... }
|> Command.execute // { Id = 123; Text = None; ExitCode = 1; Error = Some "This is an error!" }
|> Output.toError // "This is an error!"
Output 函数
throwIfErrored: Output -> Output
throw: (Output -> bool) -> Output -> Output
Output.throw 和 Output.throwIfErrored 是断言函数,如果某些事情不正确,则抛出异常。这对于构建脚本立即停止执行非常有用,以下是一个示例
cli {
Exec "dotnet"
Arguments [| "build"; "-c"; "Release" |]
WorkingDirectory "src/"
}
|> Command.execute // returns { Id = 123; Text = None; ExitCode = 1; Error = Some "This is an error!" }
|> Output.throwIfErrored // <- Exception thrown!
|> Output.toError
或者,您可以定义何时“失败”
cli { ... }
|> Command.execute // returns { Id = 123; Text = "An error occured: ..."; ExitCode = 1; Error = Some "Error detail." }
|> Output.throw (fun output -> output.Text.Contains("error")) // <- Exception thrown!
|> Output.toError
打印 Output 字段
在 Output 中也有打印方法
printId: Output -> unit
printText: Output -> unit
printExitCode: Output -> unit
printError: Output -> unit
请不要直接写入
cli { ... }
|> Command.execute
|> Output.toText
|> printfn "%s"
为了更短的代码,您可以使用
cli { ... }
|> Command.execute
|> Output.printText
Command.toString
Command.toString 仅连接执行 shell/程序 + 给定的命令/参数
cli {
Shell PS
Command "Write-Host Hello World!"
}
|> Command.toString // "powershell.exe -Command Write-Host Hello World!"
和
cli {
Exec "cmd.exe"
Arguments [ "/C"; "echo"; "Hello World!" ]
}
|> Command.toString // "cmd.exe /C echo Hello World!"
Builder 操作
ShellContext 操作(cli { Shell ... }): | 操作 | 类型 | |------------------------|----------------------------| | Shell | Fli.Shells | | Command | string | | Input | string | | Output | Fli.Outputs | | WorkingDirectory | string | | WindowStyle | Fli.WindowStyle | | EnvironmentVariable | string * string | | EnvironmentVariables | (string * string) list | | Encoding | System.Text.Encoding | | CancelAfter | int |
ExecContext 操作(cli { Exec ... }): | 操作 | 类型 | |------------------------|----------------------------------------------------------| | Exec | string | | Arguments | string / string seq / string list / string array | | Input | string | | Output | Fli.Outputs | | Verb | string | | Username | string | | Credentials | string * string * string | | WorkingDirectory | string | | WindowStyle | Fli.WindowStyle | | EnvironmentVariable | string * string | | EnvironmentVariables | (string * string) list | | Encoding | System.Text.Encoding | | CancelAfter | int |
目前提供的 Fli.Shells
CMD运行cmd.exe /c ...或cmd.exe /k ...(取决于是否提供Input)PS运行powershell.exe -Command ...PWSH运行pwsh.exe -Command ...WSL运行wsl.exe -- ...SH运行sh -c ...BASH运行bash -c ...ZSH运行zsh -c ...CUSTOM (shell: string * flag: string)运行指定的shell和指定的起始参数(flag)
提供的 Fli.Outputs
String 对象的文件输出文件的绝对路径的字符串。StringBuilder对象的StringBuilder,它将被输出文本填充。Custom of Func<string, unit>是一个自定义函数(string -> unit),它将使用输出字符串(记录、打印等)进行调用。
提供Fli.WindowStyle
Hidden(默认)最大化最小化正常
缺少什么吗?
灵感来源
使用CE的CLI命令是在使用FsHttp时想到的。
| 产品 | 版本 兼容的以及额外的计算目标框架版本。 |
|---|---|
| .NET | net5.0已被计算。 net5.0-windows已被计算。 net6.0兼容。 net6.0-android已被计算。 net6.0-ios已被计算。 net6.0-maccatalyst已被计算。 net6.0-macos已被计算。 net6.0-tvos已被计算。 net6.0-windows已被计算。 net7.0兼容。 net7.0-android已被计算。 net7.0-ios已被计算。 net7.0-maccatalyst已被计算。 net7.0-macos已被计算。 net7.0-tvos已被计算。 net7.0-windows已被计算。 net8.0兼容。 net8.0-android已被计算。 net8.0-browser已被计算。 net8.0-ios已被计算。 net8.0-maccatalyst已被计算。 net8.0-macos已被计算。 net8.0-tvos已被计算。 net8.0-windows已被计算。 |
| .NET Core | netcoreapp2.0已被计算。 netcoreapp2.1已被计算。 netcoreapp2.2已被计算。 netcoreapp3.0已被计算。 netcoreapp3.1已被计算。 |
| .NET Standard | netstandard2.0兼容。 netstandard2.1兼容。 |
| .NET Framework | net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
| MonoAndroid | monoandroid 已计算。 |
| MonoMac | monomac 已计算。 |
| MonoTouch | monotouch 已计算。 |
| Tizen | tizen40 已计算。 tizen60 已计算。 |
| Xamarin.iOS | xamarinios 已计算。 |
| Xamarin.Mac | xamarinmac 已计算。 |
| Xamarin.TVOS | xamarintvos 已计算。 |
| Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
- FSharp.Core (>= 6.0.7)
| 版本 | 下载 | 上次更新 | |
|---|---|---|---|
| 1.111.10 | 336 | 5/31/2024 | |
| 1.111.1 | 104 | 5/24/2024 | |
| 1.111.0 | 676 | 4/16/2024 | |
| 1.110.0 | 114 | 4/12/2024 | |
| 1.101.0 | 1,397 | 1/9/2024 | |
| 1.100.10 | 243 | 11/24/2023 | |
| 1.100.1 | 115 | 11/24/2023 | |
| 1.100.0 | 117 | 11/24/2023 | |
| 1.11.0 | 1,060 | 10/6/2023 | |
| 1.10.1 | 1,644 | 9/1/2023 | |
| 1.10.0 | 430 | 8/11/2023 | |
| 1.1.1 | 3,062 | 7/25/2023 | |
| 1.1.0 | 661 | 5/29/2023 | |
| 1.0.1 | 3,798 | 2/2/2023 | |
| 1.0.0 | 465 | 12/17/2022 | |
| 0.11.0 | 1,004 | 11/11/2022 | |
| 0.9.0 | 392 | 10/18/2022 | |
| 0.8.0 | 401 | 10/12/2022 | |
| 0.7.0 | 360 | 10/7/2022 | |
| 0.6.1 | 363 | 10/4/2022 | |
| 0.6.0 | 370 | 10/4/2022 | |
| 0.0.2 | 390 | 9/29/2022 |
- 空文件输出将不会写入文件。(https://github.com/CaptnCodr/Fli/pull/72)
(所有版本说明:https://github.com/CaptnCodr/Fli/blob/main/RELEASE_NOTES.md)