F#库结构
F# Library structure
我正在对我的一个项目进行一些重组,并决定为其中的很大一部分制作一个单独的库项目。
我的问题在于我有多个包含模块的文件,其中许多模块应该对用户隐藏 API,我该如何实现?我之前没有尝试过这个,所以不熟悉库结构与命令行项目有何不同,以及如何正确地确定范围。如果我可以看到 lib 项目中的每个文件
其他项目 为什么我们有 Library.fs 文件?
形式化一点。假设我有 SomeCode.fs 和 Library.fs
SomeCode.fs
module SomeCode
type SomeType = ...
let someFunc1 ... = ...
// things to hide here
// depend on hidden code
let SomeFunc2 ... = ...
Library.fs
namespace SomeLib
module Mod1 = ...
这是针对其他 F# 项目的。如何构建它以便 API 只能看到正确的东西,并且仍然可以维护?
internal
是你的朋友。如果你声明一个模块
module internal MyNamSpace.MySecretModule
这只能从您的项目中访问。
模块 Library
你保留 public,这是你的 API。
internal
也可用于单个函数,以防您只想隐藏某些函数。
隐藏部分模块的一种相当常见的方法也是采用以下模式
module MyModule =
[<AutoOpen>]
module internal MySecretModule =
let apa = 1
// Bunch of other internal stuff
// Can use stuff from MySecretModule, but other projects cannot
let bepa = apa + 1
我正在对我的一个项目进行一些重组,并决定为其中的很大一部分制作一个单独的库项目。
我的问题在于我有多个包含模块的文件,其中许多模块应该对用户隐藏 API,我该如何实现?我之前没有尝试过这个,所以不熟悉库结构与命令行项目有何不同,以及如何正确地确定范围。如果我可以看到 lib 项目中的每个文件 其他项目 为什么我们有 Library.fs 文件?
形式化一点。假设我有 SomeCode.fs 和 Library.fs
SomeCode.fs
module SomeCode
type SomeType = ...
let someFunc1 ... = ...
// things to hide here
// depend on hidden code
let SomeFunc2 ... = ...
Library.fs
namespace SomeLib
module Mod1 = ...
这是针对其他 F# 项目的。如何构建它以便 API 只能看到正确的东西,并且仍然可以维护?
internal
是你的朋友。如果你声明一个模块
module internal MyNamSpace.MySecretModule
这只能从您的项目中访问。
模块 Library
你保留 public,这是你的 API。
internal
也可用于单个函数,以防您只想隐藏某些函数。
隐藏部分模块的一种相当常见的方法也是采用以下模式
module MyModule =
[<AutoOpen>]
module internal MySecretModule =
let apa = 1
// Bunch of other internal stuff
// Can use stuff from MySecretModule, but other projects cannot
let bepa = apa + 1