QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

使用 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:001466
用户头像

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

关注

评论

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

并发王者课-青铜1:兵分三路-从创建线程开始

MetaThoughts

Java 多线程 高并发 Java高并发 每周二四六更新

明天重新杨帆起航

IT蜗壳-Tango

5月日更

位列第五大生产要素,大数据该如何突破隐私安全魔咒?

CECBC

url踩坑记录

ES_her0

5月日更

霸榜GitHub的阿里内部Spring Boot实战文档到底有多强?

Java 架构 面试 微服务

android插件化面试,渣本逆袭大厂面经分享,震撼来袭免费下载!

欢喜学安卓

android 程序员 面试 移动开发

docker(centos系统)安装vim工具

liuzhen007

Docker 5月日更

ConcurrentHashMap

ltc

ConcurrentHashMap

从非洲血库到热带雨林:为什么普惠联接是社会的数字化支点?

脑极体

2千亿级超大模型的构建,能否突破中文场景的极限

这不科技

人工智能 nlp

JavaScript 类型化数组

空城机

JavaScript 大前端 5月日更 类型化数组

❄️【程序员必看系列】开源项目有盈利模式指南

码界西柚

开源 程序员 盈利模式 5月日更

Flink CEP 监测刷屏用户

五分钟学大数据

flink 5月日更

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

carl

世界电信日 | 英特尔5G赋能数字化转型的实现之道

E科讯

阿里工作6年,熬到P7就剩这份学习笔记了,已助朋友拿到7个Offer

Java 程序员 架构 面试

数字化战争即将开启,区块链将成为有效防护壁垒

CECBC

架构学习笔记:架构定义

风翱

架构 5月日更

浪潮云向前进一步,又向后让一步

云计算

Dubbo 负载均衡

青年IT男

dubbo

博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地

阿里巴巴云原生

人工智能 容器 微服务 运维 云原生

数据挖掘从入门到放弃(五)seaborn 的数据可视化

数据社

机器学习 5月日更

Unix/Linux 编程:网络编程之 线程池

赖猫

Linux Linux服务器开发 Linux网络编程

因你不同,2021 阿里云开发者大会重磅开启 @ 所有开发者!

阿里巴巴云原生

开发者 云原生 活动

怎么学

Nydia

学习

从火星的古海洋,读懂蓝星的数据湖之变

脑极体

5分钟速读之Rust权威指南(四)

wzx

JavaScript rust

《冰河的渗透实战笔记》电子书,442页,37万字,正式发布!!

冰河

网络安全 信息安全 渗透测试 网络攻防 互联网技术

Android面试题!深入理解JVM的核心知识点,值得一读!

欢喜学安卓

android 程序员 面试 移动开发

网络攻防学习笔记 Day18

穿过生命散发芬芳

5月日更 网络攻防

Python 协程

若尘

协程 Python编程 5月日更

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