10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

使用 Fake 和 Paket 编写 F#脚本

  • 2016-12-28
  • 本文字数:1066 字

    阅读完需:约 3 分钟

编写 F#脚本一般使用.fsx 文件和 F# Interactive(Fsi)。对于需复用的脚本, Paket Fake 提供了处理各种用例的特性。Fake 用于构造复杂的脚本,Paket 则提供了依赖管理。

Fake

虽然 Fake 本身是一种构建工具,但是其构建目标(Target)体系也可用于编写脚本。这是由于构建目标可用相互之间的关系定义,这同样也是脚本的惯用写法。使用 Fake 可以调用所有.Net 库。下面的代码片段定义了运行 FluentMigrator Migration 的两个 Target:

复制代码
open System.Management.Automation
Target "BuildMigrations" (fun _ ->
!! "src/app/**/migrations.csproj"
|> MSBuildRelease buildDir "Build"
)
Target "RunMigrations" (fun _ ->
MigrateToLatest connectionString [assembly] options
)
// 定义依赖。
"BuildMigrations"
==> "RunMigrations"

脚本语言的一个理想特性是无需预先编译即可运行代码段。通过使用 F# Interactive(Fsi),F#也可具有同样功能,但这也意味着每台运行 F#脚本的机器都必须安装 Fsi。与此不同,虽然 Fake 也实现了无需预先编译即可运行脚本,但是不必在运行 Fake 的机器安装 F#编译器。该功能源于 Fake 内直接植入了 F#编译器,这是由“ F# Compiler Services ”项目实现的。

Fake 还可运行 PowerShell 脚本,这使得必要时可混搭使用 F#和 Powershell。

复制代码
open System.Management.Automation
Target "Powershell" (fun _ ->
PowerShell.Create()
.AddScript("& 'configure-server.ps1'")
.AddParameter("Verbose", "")
.Invoke())

Paket

一些脚本的运行需要额外库的支持,尤其是在处理外部服务时。虽然对脚本而言这样的情况并不常见,但是依赖也应该被软件包管理器所管理。使用 Paket 可以处理另外一种编写脚本时的常见情况,即对独立文件的引用

复制代码
// 引用 NuGet 包。
nuget FSharp.Management
// 引用 GitHub 上的一个文件。
github myRepo/aProject dependency.dll

Paket 还提供了组依赖功能,即当依赖仅限于子集时,无需取用全部软件包。此功能非常适合于脚本,因为许多脚本可能使用同一个依赖文件。

复制代码
// 依赖共享。
nuget Newtonsoft.Json
nuget FSharp.Core
group Web
nuget Fake.IIS
nuget Suave
group Database
nuget FluentMigrator
nuget SQLProvider

本文摘自“ F# Advent Calendar ”,它是 F#社区首创的一个线上技术交流活动。

查看英文原文: Scripting in F# Using Fake and Paket


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-12-28 18:001700
用户头像

发布了 227 篇内容, 共 83.3 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

从实习到秋招成为一名安全工程师,我经历了什么

网络安全学海

面试 网络安全 信息安全 渗透测试 WEB安全

微信业务架构图&学生管理系统毕业架构设计

Spring

架构实战营

我粗心,有救吗?

Justin

心理学 成长 28天写作

记录-今年最骄傲的一件事(2)

将军-技术演讲力教练

Spring AOP(一) AOP基本概念

程序员历小冰

spring aop 28天写作 12月日更

架构实战营三期--模块一作业

木几丶

架构实战营 #架构实战营

基于云的技术架构设计实践-第5篇

hackstoic

数据分析 云原生 数据可视化 业务分析 签约计划第二季

Hoo虎符研究院 | Arweave调研报告

区块链前沿News

Arweave Hoo虎符 虎符交易所 虎符研究院 去中心化存储

日本公司诚招IT开发技术者

马农驾驾驾

Java c++ php Python 日语

消费类电子线上问题定位,分析和解决落地

wood

硬件产品 28天写作 线上故障

第一模块作业

Anlumina

「架构实战营」

第一周作业

lv

微信业务架构图&&“学生管理系统”毕业架构设计

guodongq

「架构实战营」

Python Qt GUI设计:菜单栏、工具栏和状态栏的使用方法(拓展篇—2)

不脱发的程序猿

Python qt GUI设计 Qt Creator 菜单栏、工具栏、状态栏

技术架构演进的思考

gevin

架构演进

「从0到1如何快速实现cli工具」

速冻鱼

大前端 cli JavaScrip 签约计划第二季 12月日更

架构实战营模块1课后作业

墨宝

如何验证你的产品创意?

石云升

产品思维 28天写作 12月日更

毕业总结

小智

架构训练营

TypeScript 之 Class(下)

冴羽

JavaScript typescript 翻译 大前端

我所理解的微服务

gevin

微服务 微服务架构

Rust 元宇宙 15 —— 细节和重构

Miracle

rust 元宇宙

GrowingIO Terraform 实践

GrowingIO技术专栏

运维 SRE Terraform 项目实践 资源编排

透过全球首个知识增强千亿大模型,看到中国AI差异化发展之路

脑极体

模块一作业

whoami

「架构实战营」

架构实战 模块一作业

mj4ever

架构实战营

Git 报错:unable to update local ref

liuzhen007

28天写作 12月日更

学习总结

Anlumina

「架构实战营」

架构实战营-模块1-作业

Pyel

「架构实战营」

彻底弄懂死锁

李子捌

Java、 28天写作 12月日更

Week1学习总结

guodongq

「架构实战营」

使用Fake和Paket编写F#脚本_.NET_Pierre-Luc Maheu_InfoQ精选文章