如何创建`SymbolicPath`?

问题描述 投票:0回答:1

对于一个相当复杂的自定义

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随机重新生成)构建目录

haskell cabal
1个回答
0
投票

忽略评论。它是在首次定义类型

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 版本中的内容的提示。)

© www.soinside.com 2019 - 2024. All rights reserved.