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", "[email protected]")]
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)