写点什么

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

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

关注

评论

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

week12-homework

J

面向对象设计原则

引花眠

面向对象设计原则

11. 用别人写好的代码,完成我的工作,剩下的时间去摸鱼

梦想橡皮擦

Python 2月春节不断更 python入门

JUnit速查手册

jiangling500

Java JUnit

【译文】工作六年后,我对软件开发的认知转变

Zhendong

程序员 软件开发

翻译:《实用的Python编程》01_03_Numbers

codists

Python

Flink集群部署:Standalone部署

正向成长

工作学习累了?试试 GitHub 上的那些简单易学的游戏项目吧!

JackTian

GitHub 开源 游戏 2月春节不断更

松耦合

sinsy

设计模式 RabbitMQ

Elasticsearch Mapping Index索引

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

记一次有意思的微信视频号直播

小匚

产品经理

年终述职PPT(996一年,怎么会什么都没干!)

鲁米

年终总结

Elasticsearch dynamic mapping

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

《我们脑中挥之不去的问题》 - 卓克科普(3)

石云升

读书笔记 科普 2月春节不断更

今日出门

Nydia

保持模块的兼容性

Rayjun

go modules Go 语言

什么是MySQL数据库?看这一篇干货文章就够了!

我是哪吒

学习 程序员 后端 MySQ 2月春节不断更

第四章作业

Deborah

数字资产助力未来十年打赢数字经济战

CECBC

数字经济

公路交通区块链技术的痛点问题和典型场景应用

CECBC

区块链

日记 2021年2月15日(周一)

Changing Lin

2月春节不断更

程序员成长第八篇:做好测试工作

石云升

程序员 测试 2月春节不断更

机器学习笔记之:

Nydia

诊所数字化从预约开始

boshi

数字化医疗 七日更 线上预约

ElasticSearch.02 - 安装

insight

elasticsearch 2月春节不断更

ARTS打卡 第31周

引花眠

微服务 ARTS 打卡计划

华为 MPLS的数据转发流程

艺博东

华为

Idea应用启动时WEB-INF/lib无效标记问题处理

程序员架构进阶

Java IntelliJ IDEA 七日更 2月春节不断更

【LeetCode】最大连续1的个数Java题解

Albert

算法 LeetCode 2月春节不断更

中国科学家突破区块链核心技术

CECBC

区块链

深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!

Python猫

Python 编程

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