对于一个相当复杂的自定义
Setup
库,我需要操作源文件位置目录:
hsSourceDirs
,然后从这些目录中读取文件,既可以直接从 Setup.hs
读取,也可以通过将文件名作为字符串参数传递给外部程序来间接读取hsSourceDirs
我面临的问题是
hsSourceDirs
的类型是 [SymbolicPath PackageDir SourceDir]
,我就是不知道如何操纵这些 SymbolicPath
。查看 Distribution.Utils.Path
,数据类型 SymbolicPath from to
仅以抽象方式导出,可用的组合器有:
getSymbolicPath :: SymbolicPath from to -> FilePath
,标记为“避免在新代码中使用它”sameDirectory :: _ => SymbolicPath from to
unsafeMakeSymbolicPath :: FilePath -> SymbolicPath from to
这让我唯一的选择是使用
SymbolicPath PackageDir SourceDir
(显然我不应该使用)立即从FilePath
转换为getSymbolicPath
,根据FilePath
进行所有文件访问,然后从例如开始生成一个新的FilePath
buildDir
,使用像FilePath
这样的</>
组合器,以调用unsafeMakeSymbolicPath
结束。这感觉不太理想。
有没有办法替代:
也许在
IO
中,也许使用自定义Setup.hs
中可用的任何Cabal上下文,来自FilePath
的物理
SymbolicPath PackageDir SourceDir
创建,也许在
IO
中,也许使用自定义Setup.hs
中可用的任何Cabal上下文,一个新的SymbolicPath
,指向一个新的子目录(由我明确命名,或者由Cabal随机重新生成)构建目录
?
忽略评论。它是在首次定义类型
SymbolicPath
和函数 getSymbolicPath
的同一提交中添加的。我认为这是作者默认的,认为整个设计很糟糕,需要在以后的工作中进行修补。在当前的 Git HEAD 中(比 Hackage 上的最新版本 Cabal-3.10.3.0 更新),整个设计已经重新设计,关于 getSymbolicPath
的注释已被删除,以及一些关于使用 interpretSymbolicPath
或 interpretSymbolicPathCWD
的说明文字
已添加。不过,这些功能在 Cabal-3.10.3.0 中不可用。
在 Cabal-3.10.3.0 中,
SymbolicPath PackageDir SourceDir
类型的值是对要在进程当前工作目录是包目录的上下文中访问的源目录的引用。 (使用的这种类型的唯一其他变体是SymbolicPath PackageDir LicenseFile
。)
只需注意将当前工作目录切换到包目录(并使用此工作目录调用任何外部程序),然后使用
getSymbolicPath
提取到您感兴趣的目录的有效相对路径。当注入新的时目录,尝试相对于包目录构建它们,然后使用 unsafeMakeSymbolicPath
,无需内疚或羞愧。
在 Cabal 的未来版本中,看起来
Distribution.Utils.Path
中将会有更好的界面以及改进的文档。例如,请参阅 最新版本的 Path.hs
中的评论。 (请注意,实现与 Cabal-3.10.3.0 中不同,因此不要尝试遵循这些注释中的约定,只需将它们用作未来 Cabal 版本中的内容的提示。)