Fli 1.111.10

dotnet add package Fli --version 1.111.10                
NuGet\Install-Package Fli -Version 1.111.10                
此命令用于 Visual Studio 的包管理器控制台,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Fli" Version="1.111.10" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用包。
paket add Fli --version 1.111.10                
#r "nuget: Fli, 1.111.10"                
#r 指令可用于 F# Interactive 和 Polyglot Notebook。将其复制到交互工具或脚本的源代码中以引用包。
// 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

build Nuget <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.throwOutput.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 已计算。
兼容目标框架
包含目标框架(在包中)
更多关于 目标框架.NET 标准版 的信息。

NuGet 包 (2)

显示依赖于 Fli 的前 2 个 NuGet 包

下载
Florence

包描述

Slurmi

用于使用 F# 创建 slurm 工作脚本和工作流程的工具。

GitHub 仓库

此包未被任何流行的 GitHub 仓库使用。

版本 下载 上次更新
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.6.0 已弃用。
0.0.2 390 9/29/2022

- 空文件输出将不会写入文件。(https://github.com/CaptnCodr/Fli/pull/72
(所有版本说明:https://github.com/CaptnCodr/Fli/blob/main/RELEASE_NOTES.md